TCP协议之三四次握手

基于之前TCP协议的文章介绍TCP协议的三四次握手

TCP的运输连接管理

TCP协议是面向连接的协议,运输链接是用来传送TCP报文的。TCP运输链接的建立和释放
是每一次面向连接的通信中必不可少的过程,运输链接有三个阶段:
  1. 连接建立
  2. 数据传送
  3. 连接释放

TCP协议之三次握手


TCP协议通过三次握手建立运输链接,下图是TCP建立连接的过程:
三次握手建立连接

过程:

  1. 假定主机A运行的是TCP客户端程序,主机B运行的是TCP服务器程序;最初两端的TCP进程都处于CLOSED(关闭)状态;
  2. A主动请求打开连接,而B被动打开连接;
  3. B的TCP服务器先创建传输控制块TCB,准备接受客户端进程的连接请求,然后服务器进程处于LISTEN(监听)状态;等待客户端的连接请求;
  4. A的TCP客户端进程也是先创建传输控制模块TCB,然后向B发出连接请求报文段,此时TCP报文段首部的SYN=1,同时选择一个初始序号seq=x;TCP规定,SYN报文段不能携带数据,但要消耗掉一个序号;这时TCP客户进程进入SYN-SENT(同步已发送)状态。
  5. B收到连接请求报文段后,如同意连接,则向A发送确认,在确认报文段中应把SYN位和ACK位置为1,确认号是ack=x+1,同样为自己选择一个初始序号seq=y。同样要消耗掉一个序号;此时TCP服务端进程进入SYN-RCVD(同步收到)状态;
  6. TCP客户端收到B的确认后,还要向B给出确认。确认报文段的ACK置为1,确认号ack=y+1,而自己的序号是seq=x+1;TCP规定,ACK报文段可以携带数据,不携带数据则不消耗序号。至此,TCP连接已经建立,A进入ESTABLISHED状态
传输控制块TCB

存储了每一个连接中的一些重要信息,如:TCP连接表,到发送和接受缓存的指针,到重传队列的指针,当前的发送和接收序号,等等

为什么A还要在发送一次确认?(为什么要三次握手建立连接?)

为了防止已失效的连接请求报文段突然又传送到了B,因而产生错误。
已失效的连接请求报文段:
正常情况下:A发出连接请求,但因为连接请求报文丢失而未收到确认,于是A再重传一次连接请求报文,往后收到确认,建立连接,该过程当中不存在失效的报文段
异常情况下:A发出了连接请求报文并没有丢失,而是延迟到连接释放以后的某个时间到达了B,这是一个早已失效的报文段,B在收到后认为这是A发出的一次连接请求,于是向A发送了确认报文段同意连接,如果不采用三次握手,此时,新的连接就会建立,但A并没有数据发送给B,B会一直等待A发送数据,造成了B的资源浪费。
采用三次握手就可以防止上述现象


TCP协议之四次握手


TCP协议通过四次握手来释放TCP连接通道,数据传输结束后,通信的双方都可以释放连接,过程如下图所示:
这里写图片描述

过程

  1. 此时,A和B都处于ESTABLISHED状态,假设A应用进程先发出了TCP连接释放报文段,并停止发送数据,主动关闭TCP连接;
  2. A把连接释放的报文段首部的终止控制位FIN置为1,其序号设置为seq=u,u等于前面所传送过的数据的最后一个字节的序号加1,A进入FIN-WAIT-1状态,等待B的确认;TCP规定FIN字段即使不携带数据,也要消耗掉一个序号;
  3. B收到连接释放报文段后即发出确认报文段,确认号ack=u+1;该报文段自己的序号seq=v,等于B前面已经传送的数据的最后一个字节的序号加1;进入CLOSE-WAIT(关闭等待)状态。此时处于半关闭状态,只能说明A已经无数据发送,但B可能仍有数据发送。
  4. A收到B的确认报文后,进入FIN-WAIT-2(终止等待2)状态,等待B发出去的连接释放报文段。
  5. 若B已经没有数据要发送了,此时发出连接释放报文段,在该报文段中,将FIN字段置为1,ACK置为1,表示这是一个释放连接的报文段;假定B此时序号位w(A发出连接释放请求以后,B可能还发送了部分数据),将该报文段的seq=w且ack=u+1,B进入LAST-ACK(最后确认)状态;等待A的确认
  6. A在收到B的连接释放报文段后,必须对此发出确认;在确认报文段中,将ACK置为1,确认号ack=w+1,自己的序号seq=u+1;根据TCP标准,前面发送的FIN报文段要消耗掉一个序号;此时进入到TIME-WAIT(时间等待)状态,此时TCP连接并没有释放掉,需要经过时间等待计时器设置的 2MSL 后,A才进入CLOSED(关闭)状态
  7. B收到A发出的确认后,进入CLOSED状态,撤销相应的传输控制块TCB,结束本次TCP连接。B比A结束的要早。

    为什么要等待2MSL时间后,A才进入CLOSED状态?

MSL:

最长报文段寿命,即一个报文段可以在网络中存活的最长时间。官方建议设置为2分钟,但实际时间是小于这个值的;
2MSL,即2倍的最长报文段寿命,一个报文段发出和收到其确认报文所经历的最大时间。

  1. 为了保证A在发送的最后一个ACK报文段能够到达B。最后一个ACK报文段有可能丢失,因而使处在LAST-ACK状态的B收不到A发送的FIN+ACK报文段,则B会重传之前发送的FIN+ACK报文段,接着A重新发送确认,并启动就关闭连接2MSL时间计时器;如果A在等待2MSL时间后,什么都没有收到,这说明B已经关闭连接,此时A关闭连接。如果A不等待2MSL时间,在发出确认以后就关闭连接,就无法确定B是否收到了自己的确认报文段,如果没有收到,B就无法正常进入CLOSED状态。
  2. 防止已失效的连接请求报文段,等待2MSL后,该连接产生的所有报文段都将从网络上消失。
阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭