几张图五分钟让你轻松读懂TCP协议(图文并茂)
Posted 互联网架构师
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了几张图五分钟让你轻松读懂TCP协议(图文并茂)相关的知识,希望对你有一定的参考价值。
TCP 是互联网核心协议之一,本文介绍它的基础知识。
![几张图五分钟让你轻松读懂TCP协议(图文并茂)](https://image.cha138.com/20210415/5206c50ea3af44e8953cc1396fdda86d.jpg)
(图片说明:TCP 是以太网协议和 IP 协议的上层协议,也是应用层协议的下层协议。)
![几张图五分钟让你轻松读懂TCP协议(图文并茂)](https://image.cha138.com/20210415/2d65bd0d6fb247f99b490af34b68fe36.jpg)
但是,以太网协议不能解决多个局域网如何互通,这由 IP 协议解决。
![几张图五分钟让你轻松读懂TCP协议(图文并茂)](https://image.cha138.com/20210415/94f53326617344a492835ff00798ee87.jpg)
![几张图五分钟让你轻松读懂TCP协议(图文并茂)](https://image.cha138.com/20210415/88f7cdf2523148488c1b6ab7e093e214.jpg)
(图片说明:路由器就是基于 IP 协议。局域网之间要靠路由器连接。)
![几张图五分钟让你轻松读懂TCP协议(图文并茂)](https://image.cha138.com/20210415/ae96fa3b3074464c928e49e6ef86b90d.jpg)
(图片说明:本机的路由表注明了不同 IP 目的地的数据包,要发送到哪一个网口(interface)。)
以太网数据包(packet)的大小是固定的,最初是1518字节,后来增加到1522字节。其中, 1500 字节是负载(payload),22字节是头信息(head)。
![几张图五分钟让你轻松读懂TCP协议(图文并茂)](https://image.cha138.com/20210415/65409bdee8054418b1c08fc7a669ea45.jpg)
(图片说明:IP 数据包在以太网数据包里面,TCP 数据包在 IP 数据包里面。)
![几张图五分钟让你轻松读懂TCP协议(图文并茂)](https://image.cha138.com/20210415/4cde78dfa0b0439993f9785880b38e05.jpg)
一个包1400字节,那么一次性发送大量数据,就必须分成多个包。比如,一个 10MB 的文件,需要发送7100多个包。
发送的时候,TCP 协议为每个包编号(sequence number,简称 SEQ),以便接收的一方按照顺序还原。万一发生丢包,也可以知道丢失的是哪一个包。
![几张图五分钟让你轻松读懂TCP协议(图文并茂)](https://image.cha138.com/20210415/14b61f7a184e42929cf4ba1ee2cadc8c.jpg)
(图片说明:当前包的编号是45943,下一个数据包的编号是46183,由此可知,这个包的负载是240字节。)
收到 TCP 数据包以后,组装还原是操作系统完成的。应用程序不会直接处理 TCP 数据包。
对于应用程序来说,不用关心数据通信的细节。除非线路异常,收到的总是完整的数据。应用程序需要的数据放在 TCP 数据包里面,有自己的格式(比如 HTTP 协议)。
TCP 并没有提供任何机制,表示原始文件的大小,这由应用层的协议来规定。比如,HTTP 协议就有一个头信息Content-Length,表示信息体的大小。对于操作系统来说,就是持续地接收 TCP 数据包,将它们按照顺序组装好,一个包都不少。
![几张图五分钟让你轻松读懂TCP协议(图文并茂)](https://image.cha138.com/20210415/5cfbadd153f64b3a8f097eef78828986.jpg)
应用程序收到组装好的原始数据,以浏览器为例,就会根据 HTTP 协议的Content-Length字段正确读出一段段的数据。这也意味着,一次 TCP 通信可以包括多个 HTTP 通信。
服务器发送数据包,当然越快越好,最好一次性全发出去。但是,发得太快,就有可能丢包。带宽小、路由器过热、缓存溢出等许多因素都会导致丢包。线路不好的话,发得越快,丢得越多。
最理想的状态是,在线路允许的情况下,达到最高速率。但是我们怎么知道,对方线路的理想速率是多少呢?答案就是慢慢试。
TCP 协议为了做到效率与可靠性的统一,设计了一个慢启动(slow start)机制。开始的时候,发送得较慢,然后根据丢包的情况,调整速率:如果不丢包,就加快发送速度;如果丢包,就降低发送速度。
Linux 内核里面设定了(常量TCP_INIT_CWND),刚开始通信的时候,发送方一次性发送10个数据包,即"发送窗口"的大小为10。然后停下来,等待接收方的确认,再继续发送。
默认情况下,接收方每收到两个 TCP 数据包,就要发送一个确认消息。"确认"的英语是 acknowledgement,所以这个确认消息就简称 ACK。
ACK 携带两个信息。
期待要收到下一个数据包的编号
接收方的接收窗口的剩余容量
![几张图五分钟让你轻松读懂TCP协议(图文并茂)](https://image.cha138.com/20210415/c815a54352994a1290db8b5394f2adcc.jpg)
注意,由于 TCP 通信是双向的,所以双方都需要发送 ACK。两方的窗口大小,很可能是不一样的。而且 ACK 只是很简单的几个字段,通常与数据合并在一个数据包里面发送。
即使对于带宽很大、线路很好的连接,TCP 也总是从10个数据包开始慢慢试,过了一段时间以后,才达到最高的传输速率。这就是 TCP 的慢启动。
TCP 协议可以保证数据通信的完整性,这是怎么做到的?
前面说过,每一个数据包都带有下一个数据包的编号。如果下一个数据包没有收到,那么 ACK 的编号就不会发生变化。
举例来说,现在收到了4号包,但是没有收到5号包。ACK 就会记录,期待收到5号包。过了一段时间,5号包收到了,那么下一轮 ACK 会更新编号。如果5号包还是没收到,但是收到了6号包或7号包,那么 ACK 里面的编号不会变化,总是显示5号包。这会导致大量重复内容的 ACK。
1、
2、
3、
4、
5、
6、
7、
8、
以上是关于几张图五分钟让你轻松读懂TCP协议(图文并茂)的主要内容,如果未能解决你的问题,请参考以下文章