TCP在传输之前会进行三次沟通,一般称为“三次握手”
首先,认识两个序号和三个标志位
(1)序号:seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
(2)确认序号:ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,ack=seq+1。
(3)标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下
(A)URG:紧急指针(urgent pointer)有效。
(B)ACK:确认序号有效。
(C)PSH:接收方应该尽快将这个报文交给应用层。
(D)RST:重置连接。
(E)SYN:发起一个新连接。
(F)FIN:释放一个连接。
需要注意的是:
(A)不要将确认序号ack与标志位中的ACK搞混了。
(B)确认方ack=发起方req+1,两端配对。
第一次消息发送中,A随机选取一个序列号作为自己的初始序号(seq)发送给B;
第二次消息B使用ack对A的数据包进行确认。
因为B已经收到序列号为x的数据包,B准备接受序列号为x+1的包,
所以ack=x+1。同时B告诉A自己的初始序列号:seq = y;
第三次消息A告诉B收到B的确认消息并准备建立连接。A自己这条消息的序列号是x+1,所以seq=x+1, 而ack=y+1是表示A正准备接受B序列号为y+1的数据包。
网站:www.baidu.com
测试软件:Wireshark
由上之下,一次展开(从左到右)
“三次握手”的必要性:
现假定出现一种异常情况,即A发出的第一个连接请求报文到并没有丢失,而是因为某些网络节点长时间滞留了,以致延误到连接释放后的某个时间才到达B(这时A与B连接已经成功)。
本以为这是个已失效的报文段。但是B收到此“已失效的报文段”后,就误以为A又发出一次新的连接请求。于是就向A发出确认报文段,同意建立连接。
由于现在A并没有再次向B发出建立请求的连接,因此就不会理会B,也不会向B发送数据。但是B却一直等待A发来数据。这样就会浪费B的资源利用。
采用“三次握手”的方法可以防止上述现象的发生。如上述的假定情况,A不会向B发送确认信息。B由于收不到确认,就知道A并没有要求建立连接