讲讲 TCP 协议

一、概述

TCP 协议与 UDP 协议同属于传输层的协议。

二、TCP 数据包的大小

我们通过下图来进行说明:
在这里插入图片描述
通过上图我们可以知道TCP数据包(Header+Data)总长度为1480字节。

三、TCP 数据包的编号

一个 TCP 数据包大概 1400 多个字节,那么一次性发送大量数据,就必须分成多个包。比如,一个 10MB 的文件,需要发送 7100 多个包。发送的时候,TCP 协议为每个包编号(sequence number,简称 SEQ),以便接收方按照顺序还原(万一发生丢包,也可以知道丢失的是哪一个包)。

第一个包的编号是一个随机数。例如,第一个包的 SEQ 随机数为 1,负载长度为 100 字节,那么可以推算出下一个包的编号应该是 101,也就是说,每个数据包都可以知道两个编号,自身的编号和下一个包的编号。接收方也可以由此知道,按着什么顺序把数据包还原成原始数据。如下图:
在这里插入图片描述
上图所描述的是,当前包的编号为 45943,下一个数据包的编号为 46183,通过 46183-45943=240,我们可以计算出这个包的负载是 240 字节。

四、TCP 数据包的组装

将接收到的 TCP 数据包组装成原始数据是通过操作系统来完成,然后再将原始数据交由应用程序来处理。TCP 数据包里面有一个端口(port)参数,操作系统根据该端口将组装好的原始数据转交给相应的应用程序。TCP 本身没有说明原始数据大小的机制,原始数据的大小是通过应用层协议来决定的。拿HTTP 协议(应用层协议)来举例,该协议头信息中的 Content-Length 就是用来表示信息体大小的。对操作系统来说,TA 的责任就是持续地接收 TCP 数据包,然后将它们按照顺序组装好(一个包都不少)。

五、慢启动和ACK

开始的时候,发送得较慢,然后根据丢包的情况,调整速率:如果不丢包,就加快发送速度;如果丢包,就降低发送速度,此过程就是所谓的“慢启动”。Linux 内核里面设定了(常量 TCP_INIT_CWND),刚开始通信的时候,发送方一次性发送 10 个数据包,即"发送窗口"的大小为 10。然后停下来,等待接收方的确认,再继续发送。默认情况下,接收方每收到两个 TCP 数据包,就要发送一个确认消息。"确认"的英语是 acknowledgement,所以这个确认消息就简称 ACK。

ACK 携带如下两个信息:

  • 下一个数据包的编号
  • 接收方的接收窗口的剩余量

发送方根据 ACK 的信息,再加上自己已经发出的数据包的最新编号,就能推测出接收方大概的接收速度,从而降低或增加发送速率。这被称为"发送窗口",这个窗口的大小是可变的。TCP 通信是双向的,所以接收方和发送方都需要发送 ACK。两方的窗口大小,很可能是不一样的。

六、数据包的遗失

大家都知道 TCP 协议是不会丢包的,但是是通过什么机制来实现的呢?下面我们就来讲讲这个。

前面说过,每一个数据包都带有下一个数据包的编号。如果下一个数据包没有收到,那么 ACK 的编号就不会发生变化。例如,现在收到了 4 号包,但是没有收到 5 号包。ACK 就会记录,期待收到 5 号包。过了一段时间,5 号包收到了,那么下一轮 ACK 会更新编号。如果 5 号包还是没收到,但是收到了 6 号包或 7 号包,那么 ACK 里面的编号不会变化,总是显示 5 号包。这会导致大量重复内容的 ACK。
如果发送方发现收到三个连续的重复 ACK,或者超时了还没有收到任何 ACK,就会确认丢包,即 5 号包遗失了,从而再次发送这个包。如下图:
在这里插入图片描述
接收方没有收到 5 号数据包(seq=5),会连续发出相同的 ACK,触发 发送方 重发 5 号数据包。

六、参考

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cab5

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值