TCP协议详解

什么是TCP协议?

TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。

TCP报头

TCP协议详解_第1张图片

TCP是如何分离和分用的?

  • 分离:4位首部有效长度确定报头,剩下的属于有效载荷
  • 分用:与UDP相同,通过目的端口号确实交付给上层哪个协议
1.端口号:
  • 1.源端口号:接收到的数据从哪个端口来
  • 2.目的端口号:要把本报文发到哪个端口

2.序号:

TCP将每个字节的数据都做了编号,即为序列号。

  • 1.序号:
    • 目的:给先后数据编码
    • 作用: 确认数据到达
  • 2.确认序号:
    • 目的:表示确认已收到的数据,确认已收到的数据并传给源发送方。
    • 作用:使数据按序到达

两台主机各自有着自己的序号和确认序号,并且TCP之间是全双工通信的,TCP中的序号,通过确认应答(ACK)超时重传等机制保证TCP的可靠性。

3. 4位首部长度和6位保留位

  • 1.4位首部长度:表示该TCP头部由多少个32bit位,最长的长度时60位
  • 2.6位保留位:留待以后使用

4.6位标志位:

  • 1.URG:紧急指针是否有效,为1,表示提高该报文优先级,将该报文提前发送
  • 2.ACK:确认号是否有效,为1,表示有对上一个报文的确认
  • 3.PSH:提示接受端应用程序立即从TCP缓冲区把数据读走。当主机接收该报文时,应立即让应用层处理缓冲区数据
  • 4.PST:对方要求重新建立连接,带有PST标识的被称为复位报文段。为1时,提示接收方连接出现某种错误,要重新建立连接。
  • 5.SYN:请求建立连接,带有SYN的被称为同步报文段,与三次握手有关。
  • 6.FIN:通知对方,本端要关闭了,带有FIN的被称为结束报文段,与四次挥手有关。

5.窗口大小

意义:自己接收缓冲区中剩余空间的大小
作用:流量控制
管理者:操作系统

6.检验和与紧急指针

  • 1.检验和:发送端填充,由CRC(循环冗余校验码)校验,如果校验不通过,则认为数据有问题。此处检验包括报头和有效载荷。
  • 2.紧急指针:与URG搭配使用,标识哪部分的数据是紧急数据(类似于偏移量)

确认应答和超时重传

1.确认应答:

TCP协议详解_第2张图片
每一次发送数据的时候,tcp报头都携带了序号和确认序号,序号的作用是告诉对方,你发送的数据是从多少号到多少号,确认序号是告诉对方,你已接受的数据是多少,下次对方应从你发送的确认序号之后的数据开始发送。
说起来有些绕口,我们来举个例子:
当A同学和B同学碰面,

  • A同学问B同学:你吃了吗?
  • B同学回答A同学:吃了,你呢?

A同学的信息(发送序号)是“你吃了吗?”。确认序号为空(因为第一次建立连接(对话))
B同学回复A同学的信息(发送序号)是“你呢”,确认序号为“吃了”。

在这个例子中,我们发现人在交流时,都会先回复之前对方的提问,再对对方发送数据,这就和TCP中的确认应答十分相似

超时重传机制

  • 1.发送时丢失
    TCP协议详解_第3张图片

    • 主机A再发送数据给B之后,因为某些原因,数据无法到达B
    • 如果主机A再某一个特定时间间隔内仍没有收到主机B发来的确认应答,就会进行重发。
  • 2.也有可能是主机B发送给A的报文丢失了(ACK丢失了)
    TCP协议详解_第4张图片

    • 因此主机B会收到很多重复的数据,而TCP协议是如何去重的呢?
      TCP协议通过序列号,就可以简单的实现去重。
  • 3.超时重传中的时间间隔是如何确定的,如果时间随意设定,会有什么危害?

    • 如果时间太长,会影响重传效率
    • 如果时间太短,有可能会频繁发送重复的包(浪费空间)
    • 因此,TCP保证再任何环境都有高效通信,会动态计算这个时间
      • 操作系统中,超时500ms为一个单位进行控制,每次判定重传都是500ms的整数倍
      • 重发1次,得不到应答,等待2*500ms再次重传。
      • 重发2次,得不到应答,等待4*500ms再次重传,以此类推,动态增长
      • 当重传一定次数后,TCP认为网络或对端主机出现异常,强制关闭连接。7

滑动窗口

之前我们提到的确认应答策略,每一个发送的数据,都需要一个ACK确认应答,收到ACK之后再发送下一个数据段,但这种串行的方式,在现代网络传输中未免太慢了一些,这里我们如果使用并行的多发多收的机制,那无疑会好很多。如图:
TCP协议详解_第5张图片

  • 1.窗口大小:指的是无需等待确认应答而可以继续发送数据的最大值。由对方接受缓冲区大小(TCP报头的窗口)决定。ps:TCP报头的16位窗口大小指的是自己接收缓冲区内剩余空间的大小。
  • 2.特点:已被发送但还没有收到应达的数据,会暂时保留。
  • 3.存放位置:滑动窗口在发送缓冲区。 需要开辟发送缓冲区来记录那些数据没有被应答,只有被应答的数据,才能被缓冲区删掉

丢包的情况

  • 1.数据包已抵达,ACK丢失。
    TCP协议详解_第6张图片
    解决方法:这种情况并不重要,可以通过后续ACK确认

  • 2.发送时数据包直接丢失

TCP协议详解_第7张图片

  • 如果一短报文丢失后,客户端会一直发送1001这样的ACK
  • 如果发送端主机连续发送了3次这样的ACK,就会将对应的数据1001-2000重发。
  • 这时候接收端收到1001之后,再次返回的ACK就是7001,表明1-7001的数据,都被放到了接收端操作系统的接受缓冲区处

控制机制:

流量控制:(两台主机之间)

我们知道,如果发送端发送速度太快,导致接收端缓冲区被塞满,这个时候就可能造成丢包等现象。因此我们需要引入流量控制这个概念
定义:TCP根据接收端的处理能力,决定发送端的发送速度。
具体方式:

  • 1.接收端将自己可以接受的缓冲区大小放入TCP首部的“窗口大小”字段中,随ACK通知发送端。
  • 2.如果接收端发现自己的缓冲区快满了,就会发送将窗口大小设置为较小值随ACK传给发送端
  • 3.发送端会根据这个窗口,调整自己的发送速度。
  • 4.如果发送端缓冲区满了,会将窗口设置为0;这时发送方就不会发送数据,而是定时发送一个窗口探测数据段,探测是否还需要发送数据。

决定因素:TCP40字节选项还包含一个窗口扩大因子M,实际窗口大小是窗口字段的值左移M位。

拥塞控制:(网络中)

如果网络出现故障,会导致发送的数据大量丢包,为了防止出现这种情况,我们采用慢启动的方式。

  • 1.拥塞:当我们向对方主机发送大量数据,发生大面积丢包
  • 2.解决方法:慢启动,先发少量数据,摸清楚当前网络拥堵情况,再决定按多大的速度传输数据。
  • 3.拥塞窗口时一开始是呈指数增长的,到达慢启动的阈值的时候,按照线性增长。
    TCP协议详解_第8张图片
    • TCP开始启动时,慢启动的阈值等于窗口大小。
    • 每次超时重传后,慢启动的阈值变为原来的一半,拥塞窗口减为1。

三种窗口的总结:

TCP报头中的窗口:自己接收缓冲区中剩余空间的大小
滑动窗口:发送方的发送缓冲区中能同时发哦是那个数据而不需要确认的冗余量
拥塞窗口:发送的数据量到网络中会造成网络拥塞。
每次发送数据包时,拥塞窗口和接收端主机反馈的窗口做对比,较小的值作为实际发送的窗口
意思时:滑动窗口由对方接受能力和会造成网络拥塞共同决定。

应答方式

延迟应答(效率问题)

如果发一次报文就ACK一次,会导致效率很低,所以接收端有时候会等一会儿,等更多的数据到达之后再ACK。
延迟应答的限制

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

捎带应答(效率问题)

每一重消息既是对上一个消息的确认,又是对下一个报文的应答。

面向字节流:

每创建一个TCP的socket,会在内核中创建一个发送缓冲区和一个接受缓冲区

  • 1.调用write时,数据会先写入发送缓冲区中。
  • 2.如果数据太长,会被分段。如果数据太短,会被存放在发送缓冲区中,等到合适的实际发送
  • 3.接受数据时,数据由网卡驱动程序将数据送达内核的接收缓冲区中。
    因为由缓冲区,TCP发送的数据是没有明显边界的,读和写不需要一一配对

粘包问题(应用层)

  • 出现原因:TCP是面向字节流的,导致其没有明确的界限,从应用层看来,看到的是一连串的字节数据,上层并不知道那一部分开始到那一部分是一个完整的应用层数据包。
  • 如何解决:明确两个包之间的边界
    • 对于定长的报,保证每次按固定大小读取即可
    • 对于变长的包,可以在包头的位置,约定一个包总长度的字段
    • 对于变长的包,可以设置一个包与包之间的分隔符。

要注意的是,上面的这些设定都是程序员在指定应用层协议的时候设定的。是站在应用层角度给TCP分包的。

TCP异常情况:

进程终止,机器重启:进程终止释放文件描述符,发送FIN。
机器断网/端点:接收端依旧认为连接还在,一旦有新的操作,接收端会发现连接已经不在了,进连接释放。如果经过一段时间没有操作,TCP内部存在的保活定时器,也可以完成连接的释放

TCP总结:

可靠性:

  • 1.校验和
  • 2.序列号
  • 3.确认应答
  • 4.超时重传
  • 5.连接管理
  • 6.流量控制
  • 7.拥塞控制

效率性:

  • 1.滑动窗口
  • 2.快速重传
  • 3.捎带应答
  • 4.延迟应答

TCP和UDP的比较:

TCP是可靠连接,应用于文本传输,重要状态更新等场景
UDP用于高速传输和实时性要求较高的领域,对可靠性并不是特别重要的场景
归根结底。TCP和UDP并没有孰优孰劣,有的只是在什么情况下使用谁会更好一些。

你可能感兴趣的:(linux)