TCP建立连接和断开连接 ---认识TCP(传输控制协议)

在前面我们练习了几个基于TCP协议的网络程序
也对UDP协议有了简单认识:认识UDP协议
TCP协议是可靠的传输协议,当然也就要付出一定代价来实现可靠性,协议段格式也就更复杂,对数据的处理也就更复杂。

一、TCP协议段格式

TCP协议格式

相比于UDP协议,TCP协议首部长度是变长的(20个字节的基本信息+选项部分)
报文首部中各个部分的含义:

  • 源端口号和目的端口号
    表示数据来自哪个进程和准备发送给那个进程

  • 32位序号
    表示准备发送给对端的报文起始序号

  • 32位确认序号
    对对端报文的接收确认以及期待下次接收的报文序号

  • 4位首部长度
    以4字节位单位表示首部大小,因为有固定首部,首部大小位20-60字节

  • 6位保留字段
    保留给后面用(暂时没有用到)

  • 6位标志位
    1.URG : 搭配协议中的16位紧急指针,若URG为1,紧急指针才有效
    2.ACK : 表示确认号是否有效
    3.PSH : 表示接收端应用程序立刻从缓冲区将数据拿走
    4.RST : 表示对端要求重新建立连接,携带该标志的称为复位报文段
    5.SYN : 请求建立连接,携带该标志的称为同步报文段
    6.FIN : 关闭连接通知,携带该报文的称为结束报文段

  • 16位窗口大小
    表示在后面保证可靠性传输时提及的窗口的大小

  • 16位校验和
    CRC校验,接收端经过计算CRC来判断数据是否有误,校验数据和首部

  • 16位紧急指针
    用来标识哪些数据是需要紧急处理的,搭配URG标识使用

  • 选项
    说明一些其他首部部分的信息,例如配合窗口大小的窗口扩大因子

二、TCP连接管理机制

下面是自己根据书上画的图
TCP连接管理机制
该图中也充分体现的TCP建立连接时的三次挥手,断开连接时的四次握手
对于上图的补充:

  1. CLOSED状态是一个假象的起始点,不是真是状态
  2. 服务器是先被动打开的
  3. 建立连接请求一定是客户端先发起的
  4. 在建立连接的过程中,服务器端是由内核来完成的,而客户端应用层 connect 会一直伴随
  5. 断开连接可以由客户端先断开,也可以由服务器端先断开
  6. 对于上图中服务器端的 CLOSE_WAIT 状态的理解
    当服务器收到的请求数据返回为 0 时,表示对端关闭连接,先是由内核发送对对端数据请求的确认(ACK),当服务器端将自己的数据都处理完成后,再调用 close(con_fd) 关闭连接,内核将其处理并发送结束报文段(FIN)。
  7. 对于上图中客户端的 TIME_WAIT 状态的理解
    客户端在对服务器端的断开连接请求进行确认之后,进入TIME_WAIT状态,此时需要等待 2 MSL(报文最大生存时间,即报文从一端到另一端的时间)
    TCP协议规定,主动关闭连接的一方要处于TIME_WAIT状态
    为什么要等待2 MSL时间?
    a) 等待两个MSL,就可以保证两个传输方向上的尚未被接收的或者迟到的报文段都已经消失,倘若其中该进程中还有尚未接收的数据,而此刻立马启动服务器,服务器就会收到上个进程未处理的数据 ,这往往不是我们期待的。
    b) 等待两个MSL,就可以保证最后一个报文可靠到达,假设最后一个报文服务器没有收到,服务器就会重发 FIN 报文,因为此时客户端还没有真正断开连接,客户端会重发确认报文。

猜你喜欢

转载自blog.csdn.net/Misszhoudandan/article/details/80892834