TCP协议详解

      最后更新:2022-08-04 09:34:18 手机定位技术交流文章

      1. TCP协议头部格式

      源/目标端口:指示从何种进程发送数据
      32位序列:发送的数据以数字存储在序列中
      32位确认编号:用于向对方作出答复,增加给接收的TCP消息段序列编号的值
      四位TCP头衔长度:表示TCP头衔有4个字符(32位),所以最大TCP头衔长度是15*4=60
      6个bool值标记位置:
      URG: 紧急针是否有效?
      ACK:确认号是否有效
      PSH:提示接收程序立即从TCP缓冲器读取数据
      RST:另一方要求重新建立连接,并向带有RST标识符的段发出重复消息
      SYN:请求创建连接并调用带有SYN标识符的同步消息段
      FIN:通知另一方关闭连接,调用载有 FIN的信号的末端消息

      16位窗口大小:流动窗口控制
      16位元校正和验证数据一致性
      16位特急指针:识别数据的哪个部分是特急数据
      2.TCP协议原则
      TCP协议是对数据传输提供的一个管控机制,主要体现在可靠和效率两个方面,即在保证数据可靠传输的情况下尽可能的提高效率

      2.1可靠的传输机制
      2.1.1响应机制的确认
      向另一方发送数据消息,另一方返回数据消息,确认答复

      实现的方式:

      说明:

      发送的数据以TCP头部的“32位序列”为基础存储,一个字节相当于一个序列
      确认响应数据以TCP头部的“32位确认序列”为基础存储。Ack(确认信息)标记为1,返回序列数,并显示所有收到的序列数之前的数据
      通过确认的响应,它可以继续发送数据
      2.1.2加班转播机制
      发送的数据报可能因为网络拥堵等原因,超过一定时间,还没有收到确认应答的数据报,就需要重新发送

      没有收到确认响应,可能是因为数据发送时有数据丢失

      也许是因为ACK丢失了

      在这种情况下,主机B可能接收大量重复数据。基于TCP协议,消息中的“32位序列”可以识别哪些数据包是重复数据包,并将重复数据包丢弃,达到检索效果

      超时时间如何确定?

      如果超时设置太长,这会导致重播的效率降低
      如果超时设置太短,可能会导致数据频繁重复

      因此,为了确保在任何环境中进行高性能通信,TCP协议动态计算了这一加班时间

      超时是500ms的单位,每当确定时,超时的重复时间被乘以500ms的整数
      重复一次, 仍未收到答复, 等待2500ms后重发
      还等着答案,等着4
      500ms重新传输,从而推动了指数增长
      累积到一定数量的继发时间,TCP协议认为网络或端口主机不正常,迫使连接关闭
      2.1.3连接管理机制(三手,四手)
      在实际发送数据之前,首先必须通过三手建立连接,不需要发送数据,也可以通过四手解除连接

      三次握手

      客户端向服务器发送SYN以请求客户端与服务器的连接
      服务端返回ACK(第一个SYN响应)和SYN,并要求从服务端到客户端建立连接
      客户端接收了 ESTABLISHED标明的数据,表明客户端到服务器连接的设置完成,并发送ACK(第二个SYN响应),服务器接收了 ESTABLISHED标明的数据,表明客户端到服务器连接的设置完成
      四次挥手

      注:关闭时,可以关闭服务端应用程序或客户端应用程序

      客户端将FI发送到服务端,并要求关闭客户端到服务端连接
      终端接收 FIN状态,设置为CLOSE_WAIT,并返回ACK响应(此操作是默认TCP协议堆栈的系统实现,不需要程序调用代码)
      服务端发送FIN到客户端,申请关闭服务端到客户端的连接(程序手动调用socket.close发送)
      客户端收到FIN返回ACK应答,并进入TIME_WAIT时间等待状态,客户端等待一段时间后,状态置为CLOSED,服务端收到应答后,状态置为CLOSED
      思考:

      为什么服务不能把ACK和 FIN一起发送,形成一个三向波浪?
      A:由于服务端状态设置为CLOSED_WAIT,表明服务端已准备好关闭连接,但服务器可能仍然发送数据,在完成之前处理数据,还可以在关闭连接之前进行一些工作,如消耗资源等 ,首先是向客户发送答复,完成处理并发送完成应用程序给客户端关闭连接

      为什么客户端要等待一段时间状态才置为CLOSED,而不之间将状态置为CLOSED?
      A: 如果客户端丢失ACK给服务器,服务器必须再次向客户端发送Fin,然后客户端必须对服务器作出回应,因此状态不能关闭,服务器必须等待一段时间以确保客户端收到响应

      2.1.4流量控制
      接收机主机以有限的速度处理数据,如果发送器发送数据太快,导致接收器缓冲区被填满,这时,如果发送器继续发送数据, 数据包就会丢失.然后出现一些列链反应,如数据包丢失再传输,因此,TCP协议取决于接收器接收数据的能力,为了确定发射器传输数据的速度,这个机制叫做流动控制

      接收器将自己的剩余缓冲大小存储在TCP头部的“ 16 位窗口大小 ”字段中,并通过ACK通知发送者
      窗口越大,网络吞吐量越高
      发送器根据接收器的大小来控制自己的传输速度
      如果接收缓冲区满,则窗口设置为0,发送者不会发送数据,而是定期发送窗口检测数据段,允许接收者告诉发送者窗口的大小
      2.1.5交通堵塞控制
      首先,发送器网络的状况是未知的,如果丢失大量数据,会造成大量损失,因此TCP协议引入了慢启动方法,首先发送少量数据检测路径,然后决定发送数据的速度

      这里介绍了拥挤窗口。一开始,拥挤窗口设置为1,每次接收ACK时,拥挤窗口加为1,每次发送数据时,拥挤窗口的较小值和交通窗口被用作实际发送的窗口,即滑动窗口的大小

      注:上述的增长方法是指数级的, slow start 只是开始时的缓慢,但增长速度非常快

      拥塞窗口变化的方式

      为了不增长那摩快,引入一个慢启动的阈值,当拥塞窗口的大小超过了这个阈值,不在按照指数方式增长,而是按照线性方式增长,如下图所示:

      慢启动的阈值是启动时窗口的最大值
      当网络拥挤时,拥挤的窗口设置为1,慢启动阈值变为拥挤的窗口/2,并重新启动增长

      2.2 效率机制
      2.2.1滑动窗口
      前面的确认应答机制指出,对每一个发送的数据都对应有一个ACK确认应答,这样采取一发一收的方式有一个很大的缺点就是效率太差,为了提高效率采用滑动窗口,即一次性发送多个数据

      窗口大小:继续发送数据而不等待的最大值。上面显示的窗口大小为400字节(四个段落)。
      如何确定窗口的大小:最小(交通窗口的大小,拥挤窗口的大小)
      窗口如何滑动:下一个接入的ACK是n,滑动到n-1的位置
      为了维护这个滑动窗口,操作系统内核需要打开发送缓冲器以记录未被响应的当前数据。只有被响应的数据可以从缓冲器中删除

      如果有数据包丢失,如何确保可靠的传输?

      情况1:数据已经收到,返回的ACK应响应丢失的包

      在这种情况下,ACK的一部分不应被丢失,因为它可以由随后的ACK确认

      情况二:数据发送时,数据包丢失

      说明:

      当1001-200这个消息丢失时,发送器总是收到像1001一样的ACK
      如果发送器主机与1001响应后连续三次接收相同的ACK,则发送器主机将重新发送1001-200数据
      此时,接收器接收到1001在200年数据之后,ACK的返回应该为7001,因为2001年所有7,00个数据已经收到并放在接收端口操作系统内核的接收缓冲区
      这种机制,即没有超过时间的再传输,称为“快速再传输控制”或“快速再传输机制”

      2.2.2延迟反应
      如果接收机接收数据,立即回ACK应答,此时回流窗口较小,但是流量窗口越大,网络吞吐量越大,传输效率就越高,等一下,等待接收机处理一些数据,您可以将流程窗口设置为更大的值,这样网咯吞吐量大,效率高

      延迟是为了高吞吐量,但不能无限

      数量限制,每包每n响应一次
      超过最大延迟时间的时限,应答复一次
      具体数量和时间,不同的操作系统,通常 n 需要 2, 加班时间需要 200ms

      2.2.3 提出答案
      服务端接收到客户端的消息后,要返回一个ACK有时候可能需要返回一个响应,此时ACK可以搭载顺风车,和响应合并为一个数据返回,不用再将ACK和响应数据分开发送

      1. 粘包问题
        TCP只读,可以多次接收和发送,对于应用层来说,一连串的字节数据,不知道从何处计算一个完整的应用程序层包,该数据应该在完整的应用程序层格式中发送多少次,它不知道数据在完整的应用程序层格式中有多少次被接收

      如何解决粘贴问题?清除包装的边界

      对于长期包,您可以每次按固定大小阅读它们
      对于长数据包,您可以指定数据包和数据包之间的分隔器(应用程序员指定的协议,只要您确保分隔器与常规表达式不冲突)
      4.TCP异常
      进程终止:进程终止释放了一个仍能发送 FIN的文件描述符。 正常和正常关闭之间没有区别
      重新启动机器:与进程终止一样
      机器停电/网络切断:接收机认为连接仍然存在,一旦接收机写下操作,接收者发现连接不再存在,并重新设置,即使没有写入操作,TCP本身也包含了一个备份计时器,经常问对方是否还活着,如果对方不在,也会把连接释放
      此外,应用程序层的一些协议还具有检测机制,例如HTTP长连接,它也经常检测对方的状态,例如QQ,它也经常尝试在QQ切断后重新连接
      5.TCP协议功能的概述
      有连接:数据只能在三个握手后传送,而TCP协议完全双功能,即每个端都可以传送或接收
      可靠的传输:网络数据传输是一个单一跳跃。通过道路的设备可能会丢失数据。可靠的传输可能会丢失数据,但有一个机制确保对方能接收数据
      面向字节流:可以多次的收发数据(连接没有关闭时,可以多次的接收和发送数据)
      有接收缓冲器和发送缓冲器:发送数据时,先写到发送缓冲器,然后把它冲洗
      无限制的大小:多个输入和输出数据,每个数据都可以大
      6.基于TCP的应用程序层协议
      HTTP
      HTTPS
      SSH
      Telnet
      FTP
      SMTP
      也包括自编TCP程序时定制应用程序层协议

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/31511.html

          热门文章

          文章分类