mrpre 发表于 2014-09-24 23:09

tcp三次握手,客户端发送最后一个ack时可以带数据?

我在大学那本网络教材中看到了,但是rfc上找了好久没找到,不知道哪位知道呢个rfc上明确提到了这点。。。
感激不尽!

mrpre 发表于 2014-09-24 23:10

教材上讲三次握手时,说可以携带数据,rfc上实在是没看出痕迹啊,英语不好,不知道哪位兄弟知道具体哪个rfc上有,告诉哥们一声

Tinnal 发表于 2014-09-24 23:55

http://stackoverflow.com/questions/3437569/tcpip-3-way-handshake
http://www.perlmonks.org/?node_id=910007

流氓无产者 发表于 2014-09-25 09:34

可以吧,自己抓包看一下,就印象深刻了

mrpre 发表于 2014-09-25 14:19

本帖最后由 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


mrpre 发表于 2014-09-25 16:35

构造三次握手最后一个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");
               
}

inurl 发表于 2014-09-25 16:47

准确的说, 下次的数据里面可以包含上次的ack。

sqm2050 发表于 2015-12-22 10:23

讲很对,rfc没有具体看到,但是《http权威指南》P88 里看到了这么一句:由于确认报文很小,所以TCP允许在发往相同方向的的输出数据分组中对其进行“捎带”。
   

nswcfd 发表于 2015-12-22 15:41

怎么保证的?靠TCP_DEFER_ACCEPT?
页: [1]
查看完整版本: tcp三次握手,客户端发送最后一个ack时可以带数据?