tcp三次握手,客户端发送最后一个ack时可以带数据?
我在大学那本网络教材中看到了,但是rfc上找了好久没找到,不知道哪位知道呢个rfc上明确提到了这点。。。感激不尽! 教材上讲三次握手时,说可以携带数据,rfc上实在是没看出痕迹啊,英语不好,不知道哪位兄弟知道具体哪个rfc上有,告诉哥们一声 http://stackoverflow.com/questions/3437569/tcpip-3-way-handshake
http://www.perlmonks.org/?node_id=910007 可以吧,自己抓包看一下,就印象深刻了 本帖最后由 mrpre 于 2014-09-25 14:20 编辑
回复 3# Tinnal
多谢哈,我也在RFC793中找到了线索。
If the state is SYN-SENT then
first check the ACK bit
..........
...........
.........
change the connection state to ESTABLISHED, form an ACK segment
<SEQ=SND.NXT><ACK=RCV.NXT><CTL=ACK>
and send it.
Data or controls which were queued fortransmission may be included
构造三次握手最后一个ack带数据的socket代码,参考网上修改的,可以运行,并且验证成功。
int main(int argc,char **argv)
{
int listenfd,connfd,opt=1;
pid_t childpid;
int i;
socklen_t clilen;
struct sockaddr_in servaddr;
struct sockaddr_in realaddr;
char GET[]="GET / HTTP/1.0\r\n\r\n";
char msg={0};
if (argc != 3) {
printf("usage: %s serverip serverport\n", argv);
return 0;
}
if ((listenfd=socket(AF_INET,SOCK_STREAM,0))==-1)
printf("socket error errno=%d", errno);
opt = 1;
setsockopt(listenfd, IPPROTO_TCP, TCP_DEFER_ACCEPT, &opt, sizeof(opt));
bzero(&realaddr,sizeof(realaddr));
realaddr.sin_family=AF_INET;
realaddr.sin_port=htons(atoi(argv));
inet_pton(AF_INET,argv,&realaddr.sin_addr);
if (connect(listenfd,(struct sockaddr*)&realaddr,sizeof(realaddr))==-1)
printf("connect error errno=%d", errno);
printf("ready to send\n");
send(listenfd,GET,sizeof(GET),0);
printf("Testing server\n");
if(0 == recv(listenfd,msg,500,0))
{
printf("read fin\n");
sleep(1);
close(listenfd);
}
printf("Server is Standard\n");
} 准确的说, 下次的数据里面可以包含上次的ack。 讲很对,rfc没有具体看到,但是《http权威指南》P88 里看到了这么一句:由于确认报文很小,所以TCP允许在发往相同方向的的输出数据分组中对其进行“捎带”。
怎么保证的?靠TCP_DEFER_ACCEPT?
页:
[1]