TCP协议机制(三次握手、数据传输、滑动窗口、四次挥手)

TCP协议的概念

TCP全称为”传输控制协议(Transmission Control Protocol)“,是面向连接的传输层协议。应用程序在使用 TCP 协议之前,必须先建立 TCP 连接。在传送数据完毕后,必须释放已经建立的 TCP 连接,TCP 提供可靠交付的服务。通过 TCP 连接传送的数据,无差错、不丢失、不重复,并且按序到达

TCP协议的报文格式

在学习TCP协议的各种机制之前,我们先了解一下TCP报文的格式和各个字段的含义。

TCP报文格式如下:

由上图可知,TCP头部为20字节,包含多个字段,各个字段含义如下:

  • Source Port:源端口,标识哪个应用程序发送。长度为16比特。
  • Destination Port:目的端口,标识哪个应用程序接收。长度为16比特。
  • Sequence Number:序号字段。TCP链接中传输的数据流每个字节都编上一个序号。序号字段的值指的是本报文段所发送数据的第一个字节的序号。长度为32比特。
  • Acknowledgment Number:确认序列号,是期望收到对方下一个报文段数据的第1个字节的序号,即上次已成功接收到的数据段的最后一个字节数据的序号加1。只有Ack标识为1,此字段有效。长度为32比特。
  • Header Length:头部长度,指出TCP报文头部长度,以32比特(4字节)为计算单位。若无选项内容,则该字段为5,即头部为20字节。
  • Reserved:保留,必须填0。长度为6比特。
  • Control bits:控制位,包含FINACKSYN等标志位,代表不同状态下的TCP数据段。
  • Window:窗口TCP的流量控制,这个值表明当前接收端可接受的最大的数据总数(以字节为单位)。窗口最大为65535字节。长度为16比特。
  • Checksum:校验字段,是一个强制性的字段,由发端计算和存储,并由收端进行验证。在计算检验和时,要包括TCP头部和TCP数据,同时在TCP报文段的前面加上12字节的伪头部。长度为16比特。
  • Urgent紧急指针,只有当URG标志置1时紧急指针才有效。TCP的紧急方式是发送向另一端发送紧急数据的一种方式。紧急指针指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)。长度为16比特。
  • Options:选项字段(可选),长度0-40字节。

其中,Control bits控制位)包含6个标志位,各个标志位含义如下:

  • URG:表示本报文中发送的数据(有效载荷)是否包含紧急数据,URG=1时表示有紧急数据;当URG=1时,后续的16位紧急指针字段才有效。
  • ACK:表示本报文前面的确认号字段是否有效:只有当ACK=1时,前面的确认号字段才有效;TCP规定,建立连接后,ACK必须为1
  • PSH:告诉对方收到该报文段后,上层应用程序立即把数据从TCP接收缓冲区读取,保证TCP接收缓冲区有能力接收新数据或清空TCP接收缓冲区
  • RST:表示是否重置连接:若RST=1,说明TCP连接出现严重错误(如主机崩溃),必须释放连接,重新建立连接。携带RST标识的报文称为复位报文段
  • SYN:在建立连接时使用,用来同步序号;当SYN=1,ACK=0时,表示该报文为请求建立连接的报文;当SYN=1,ACK=1时,表示同意建立连接;只有在建立连接的前两次请求中SYN才为1。该报文称为同步报文段
  • FIN:标记数据是否发送完毕:若FIN=1,表示数据已经发送完毕,可以释放连接。该报文称为结束报文段

三次握手机制

由于TCP 是面向连接的传输层协议,提供可靠交付的服务,所以在使用传输数据之前必须使用TCP“三次握手”建立可靠连接。

TCP连接建立的详细过程如下:
  • TCP连接发起方(图中PC1),发送第一个SYN位置1TCP报文。初始序列号a为一个随机生成的数字,因为没收到过来自PC2任何报文,所以确认序列号为0
  • 接收方(图中PC2)接收到合法的SYN报文之后,回复一个SYNACK1TCP报文。初始序列号b为一个随机生成的数字,同时因为报文是回复给PC1的报文,所以确认序列号为a+1
  • PC1接收到PC2发送的SYNACK置位的TCP报文后,回复一个ACK置位的报文,此时序列号为a+1,确认序列号为b+1PC2收到之后,TCP双向连接建立

数据传输机制

通过三次握手机制建立可靠连接后,就可以使用TCP实现数据传输。

假设PC1要给PC2发送一段数据,传输过程如下:
  • PC1将全部待TCP发送的数据按照字节为单位编上号。假设第一个字节的编号为“a+1”,第二个字节的序号为“a+2”,依次类推。
  • PC1会把一段数据的第一个字节的编号作为序列号(Sequence  number),然后将TCP报文发送出去。
  • PC2在收到PC1发送来的TCP报文后,需要给予确认同时请求下一段数据,如何确定下一段数据呢?序列号( a+1 )+载荷长度=下一段数据的第一个字节的序号a+1+12
  • PC1在收到PC2发送的TCP报文之后,发现确认序列号为“a+1+12 ,说明“a+1”到“a+12”这一段的数据已经被接受,需要从“a+1+12”开始发送。
为了提升发送效率,也可以一次性发送多段数据,由接收方统一确认

滑动窗口机制

虽然TCP协议已经通过三次握手建立连接,但是要实现真正可靠的数据传输,就需要使用滑动窗口机制,实现超时重传。

  1. TCP三次握手建立连接时,双方都会通过Window字段告诉对方本端最大能够接受的字节数(也就是缓冲区大小)。
  2. 连接建立成功之后,发送方会根据接受方宣告的Window大小发送相应字节数的数据。
  3. 接受方接受到数据之后会放在缓冲区内,等待上层应用来取走缓冲的数据。若数据被上层取走,则相应的缓冲空间将被释放
  4. 接收方根据自身的缓存空间大小通告当前的可以接受的数据大小( Window )
  5. 发送方根据接收方当前的Window大小发送相应数量的数据。

四次挥手机制

TCP支持全双工模式传输数据,这意味着同一时刻两个方向都可以进行数据的传输。在传输数据之前,TCP通过三次握手建立的实际上是两个方向的连接,因此在传输完毕后,两个方向的连接必须都关闭

如图所示:
  • PC1发出一FIN字段和ACK字段置”1 ”的不带数据的TCP段用来表示想要关闭连接以及对之前收到的数据进行确认;
  • PC2收到PC1发来的FIN置位的TCP报文后,会回复一个ACK置位的TCP报文,表示同意断开连接。
  • PC2也没有需要发送的数据,则直接发送FIN置位和ACK置位的TCP报文。假设此时PC2还有数据要发送,那么当PC2发送完这些数据之后会发送一个FIN置位和ACK置位的TCP报文去关闭连接。
  • PC1收到FIN置位的TCP报文,回复ACK报文,TCP双向连接断开。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值