一、第一个问题:为什么是三次握手,而不是两次握手,或者是四次握手。
下面是按照我的理解画的,我觉得应该就是这个道理。当然这里面我只画了序号,还有确认号什么的。
二、第二个问题:序号是干啥用的?
TCP把数据看成一个无结构的,有序的字节流。一个报文段的序号是该报文段首字节的字节流编号。假设主机A通过TCP连接到主机B,并发送一个数据流。主机A中的TCP将隐式的对数据流中的每一个字节编号。如果数据流有50000个字节,MSS=1000,数据流首字节编号为0。那TCP将该数据流构建成500个报文段,给第一个报文段分配的序号是0,第二个报文段分配的序号是1000,依次类推。
三、三次握手报文解析
这是我用wireshark抓到的一次http请求。从第3、4行可以看到,在通讯前,计算机先通过ARP协议得到了设备的MAC地址。然后就是TCP通讯的三次握手。
我们来观察一下TCP的连接是怎么建立的。
第一步:客户端的TCP首先向服务器端的TCP发送一个特殊的报文段,一般称为SYN报文段,这个报文段不能携带应用层数据。
这个报文段的首部中的SYN被置1,另外,客户端会随机选择一个初始序号,放入序号字段中。这个报文段被封装在一个IP数据报中,发送给服务器。具体的截图如下所示:
从图中可以看到,初始序号应该是个随机数x,但是这里是0。
第二步:服务器读取到SYN报文段,为该TCP连接分配TCP缓存和变量,然后向客户端发送允许连接报文段。这个报文段称为SYN ACK报文段,也不能携带应用层数据。
这个报文段包含了3个重要信息:
①SYN = 1;
②在TCP首部的确认号字段置为x+1,这里为0+1 = 1;
③服务器将自己的初始序号y,放入首部的序号字段。
截图如下:
从图中可以看到,服务器的初始序号应该是个随机数y,但是这里是0。
第三步:在收到SYN ACK报文段后,客户端也要分配内存和变量。客户端再向服务器发送一个报文段,这最后一个报文段是对服务器的允许连接的报文段的确认(客户端通过将y = y+1放置到TCP的首部确认字段来完成此项工作)。此时连接已经建立,所以SYN被置为0。
这个报文段可以携带应用层数据。
下面是截图:
这样TCP的三次握手就完成了。
今天就写这么多吧。