网络系列(一)| TCP 快速入门
简介
互联网有一整套协议构成,TCP是其中的一层
以太网
- 作用:电子信号如何组成数据包(packet),解决了
子网内部点对点通信
- 缺点:
无法连接多个局域网
,IP协议解决
IP
- 作用:定义一套自己的地址规则,通过
路由
的形式将各个局域网相连。路由器基于IP协议 - 路由器内部有一张路由表,规定 IP 出口,实现数据包转发
- 缺点:
是地址协议,不能保证数据完整
,TCP 协议解决
TCP
- 作用: 保证数据通信的完整性和可靠性,防止丢包
TCP 数据包
以太网的数据包 大小固定,最初1518 增加到 1522 字节 。其中头信息(head)22 字节,负载(payload
):1500字节
以太网数据包:1522 字节
- 头信息:22
- 负载:1500
- IP数据包
- 头信息:20(最少)
- 负载:1480
- TCP 数据包
- 头信息:20 (最少)
- 负载:1400
- TCP 数据包
- IP数据包
TCP 数据包编号(SEQ)
TCP
为每个数据包编号(sequence number)
,目的是为了接收方按照顺序还原。另外,万一丢包也可知道丢失哪一个包。
每个数据包都有两个编号
- 自身编号:
sequence number
- 下一个包编号:
next sequence number
如下图表示:当前包的负载大小为 46183-45943 = 240
字节
TCP 数据包组装
操作系统
持续接收 TCP
数据包,按照顺序组装
好。一旦组装完成后,根据数据包中的端口(port)参数
,交给监听该端口的应用程序处理。应用程序收到组装好的原始数据,会根据 HTTP
协议中的 Content-Length
字段开始一段段读取数据。其中应用程序需要的数据放在 TCP
数据包中, TCP
原始文件的大小由应用层的协议来规定。
慢启动和ACK
原因:服务器可能由于带宽小、路由器过热、缓存溢出等情况,导致丢包,因此服务器发包的速度不是越快越好。
作用:服务器为了达到线路的最高速率,获知对方线路的理想速率,使用慢启动。
Linux
内核设计一个 TCP_INIT_CWND
刚开始通信的时候,会一次性发送10个数据包,然后停下来,等待接收方确认,再继续发送。
接收方每收到两个数据包,就要发送一个确认消息(acknowledgement
,ACK
)
ACK
两个信息:
ACK NUM
:期待要收到下一个数据包的编号
WINDOW
:接收方的接收窗口的剩余容量
发送方有了这两个信息,再加上自己已经发出的数据包的最新编号
,就会推测出接收方大概的接收速度
,从而降低或增加发送速率。 这被称为”发送窗口”,这个窗口的大小是可变的。
数据包丢失处理
每个数据包都是带有下一个数据包的编号,如果下一个数据包没有收到,那么 ACK 的编号就不会改变
。
如果发送方收到三个连续的重复ACK 或者 超时了还没有收到任何ACK
,就会确认丢包,通过这个机制,保证了包不丢失。
举例来说,现在收到了4号包,但是没有收到5号包。ACK
就会记录,期待收到5号包。过了一段时间,5号包收到了,那么下一轮 ACK
会更新编号。如果5号包还是没收到,但是收到了6号包或7号包,那么 ACK
里面的编号不会变化,总是显示5号包。这会导致大 量重复内容的 ACK
。