网络知识总结----(三)TCP协议详解

TCP服务

TCP:可靠、有链接、面向字节流。
使用TCP协议通信的双方必须先建立连接,然后才能开始数据读写。TCP连接是全双工的。

有链接:TCP协议的这种连接是一对一的,所以基于广播和多播的应用程序不能使用TCP服务,应使用无连接的UDP协议。

字节流与数据报

字节流:发送端执行的写操作次数与接收端执行的读操作次数之间没有任何数量关系。
数据报:发送端应用程序每执行一次写操作,UDP模块就将其封装成一个UDP数据报并发送。接收端必须对每一个数据报进行读操作,否则会丢包。

可靠:TCP采用发送应答机制,发送端每个TCP报文段都必须得到接收方的应答,才认为这个TCP报文段传输成功。其次,TCP采用超时重传,发送端在发送TCP报文之后启动定时器,如果在定时时间内没有收到应答,将会重发该报文段。

TCP头部

这里写图片描述

  • 16位源/目的端口号:进行TCP通信时,客户端通常使用系统自动选择的临时端口号,而服务器使用的是知名服务器端口号。
  • 32位序号:一次TCP通信(从TCP连接到断开)过程中某一个传输方向上的字节流的每个字节的编号。一个TCP报文被初始化为某个随机值ISN(初始序号值),某个报文传送的是1025~2048字节,则该报文序号值ISN+1025。
  • 32位确认号:用来对另一方TCP报文发来的响应,其值是收到的TCP报文的序号值加 1 。
  • 4位头部长度:4位4字节,所以最长是60字节。
  • 6位标志位
    • URG标志:紧急指针
    • ACK:确认号
    • PSH:提示接收端应用程序应立即从TCP接收缓冲区中读走数据
    • RST:要求对方重新建立连接
    • SYN:请求建立一个连接
    • FIN:通知对方本端要关闭连接了
  • 16位窗口大小:TCP流量控制
  • 16位校验和:TCP可靠传输的保障
  • 16位紧急指针:一个正的偏移量

TCP连接的建立与关闭

TCP连接的建立与关闭又称三次握手与四次挥手
这里写图片描述
虚线表示服务器端的状态转移,实线表示客户端的状态转移。

TME_WAIT状态

谁主动断开连接谁进入TME_WAIT状态。TME_WAIT需要等待3MSL(报文段最大生存时间)的时间,才能关闭。
TME_WAIT状态存在的原因:

  • 可靠的终止TCP连接
    • 保证让迟到的TCP报文有足够的时间被识别并丢弃。当没有TME_WAIT状态时,断开当前连接并在端口上创建新的连接,新的连接有可能接收到对方发来的上次连接的TCP报文,

TCP重要机制

确认应答

接收到对端的数据后返回一个标志位为ACK的确认数据报。确认序号表示的含义是该序号之前的所有数据都收到了。

超时重传

TCP服务器为了保证数据的可靠传输,TCP模块为每一个TCP报文都维护一个重传定时器,该定时器在TCP报文段第一次被发送时启动。如果超过时间没有收到接收方的应答,TCP模块将重传TCP报文并重置定时器。

拥塞控制

TCP模块的一个重要任务拥塞控制,就是提高网络利用率,降低丢包率、并保证网络资源对每条数据流的公平性。
TCP拥塞控制包含四个部分:慢启动、拥塞避免、快速重传、快速恢复。
拥塞控制的最终受控变量是发送端向网络端向网络中一次连续写入(收到其第一个数据的确认之前)的数据量,称为SWND(发送窗口),所以它限制了一次发送TCP报文段的数量。这些报文段(仅数据部分)的长度最大为SMSS(发送者最大报文大小),值一般为MSS。

合理选择SWND(发送窗口)
SWND太小:引起明显的网络延迟
SWND太大:容易导致网络拥塞
接收方可以通过接收通告窗口来控制发送端的发送窗口。但是这样仍不够。所以引入拥塞窗口(CWDN)。
SWND 的值是 RWND 和 CWND 中较小值。

这里写图片描述

慢启动与拥塞避免

TCP连接建立后,CWND被设为初始值 1W,大小为2~4SMSS。此时发送端最多发送 1W 字节的数据。然后,发送端每接收到一个来自接收端的确认,CWND就增加,公式为:
CWND += MIN(N,SMSS)

N是此次确认中包含的之前未被确认的字节数。CWND将会按照指数形式扩大。

慢启动按指数形式扩大,如果基数太大就会膨胀很快,所以TCP拥塞控制需要另一个状态变量:慢启动门限。当 CWND 超过了门限值,TCP拥塞控制将进入 拥塞避免 阶段。

拥塞避免 :使 CWND 按线性增长,缓慢扩大。

这里写图片描述

慢启动与拥塞避免中发生拥塞

虽然有慢启动和拥塞控制,但是拥塞依旧可能发生,拥塞在两个阶段都有可能发生。
拥塞发生的依据:

  • 传输超时,TCP重传定时器溢出 ,仍使用慢启动和拥塞避免。但是慢启动门限值会改变。新慢启动门限值 = max(已发送单位收到确认的字节数/2,2*SMSS) CWND <= SMSS
  • 接收到重复的确认报文,使用快速重传和快速恢复。如果是发生在重传定时器溢出之后,则按传输超时处理。

快速重传和快速恢复

有多种可能接收到重复的确认报文,比如:TCP报文段丢失,或者接收端收到乱序TCP报文段并重排之等。拥塞控制算法需要判断是否发生了网络拥塞,或是TCP报文段丢失。
如果发送端收到了连续三个重复的确认报文,就认为是拥塞发生了,使用快速重传和快速恢复处理拥塞状况。

  1. 当收到第三个相同的确认报文时计算新的慢启动门限值,然后重传丢失的报文,并将设置 CWND = 新的门限值 + 3 * SMSS
  2. 每次收到 1 个重复的确认时,设置CWND = CWND + SMSS ,此时发送端可以发新的TCP报文段。
  3. 当收到新报文段的确认时,设置 CWND = 新的门限值。

延时应答、捎带应答

延时应答
当接收到数据后立即确认应答,此时返回的窗口大小是较小的,传输效率较低。
窗口越大传输效率越高,在避免拥塞的情况下,尽量扩大窗口的大小。

不能进行延时应答的情况:

  • 数量限制: 每隔N个包应答一次
  • 时间限制: 超过最大延迟时间应答一次;

捎带应答
在延迟应答的基础上, 很多情况下, 客户端服务器在应用层也是 “⼀发⼀收” 的,意味着客户端给服务器说了 “How are you”, 服务器也会给客户端回⼀一个 “Fine, thank you”。
那么这个时候ACK就可以搭顺风车, 和服务器回应的 “Fine, thank you” 一起发送给客户端。

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37934101/article/details/81592198
个人分类: 网络
上一篇网络知识总结----(二)IP协议详解
下一篇网络知识总结---(四)Linux网络编程基础API
想对作者说点什么? 我来说一句

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

关闭
关闭
关闭