来自自己实现redis的挑战中:TCP: An Overview。感觉写的简洁明了,很适合用于了解tcp/ip
TCP是一种广泛使用的网络协议。它是一个运行在“不可靠”协议(IP,Internet 协议的缩写)的“可靠”的协议。(后面会解释为什么ip不可靠,tcp协议可靠)。
让我们深入了解TCP的工作原理。
我们先来看看 IP(互联网协议的简称),它是 TCP 的基础协议。
IP - 互联网的邮政服务
当程序使用 IP 在网络上发送数据时,数据会被分割成多个 “数据包 “发送。
每个数据包包含
- 报头部分
- 数据部分
标头包含源地址和目的地地址,就像通过本地邮政服务发送的信封一样。

IP 与邮政服务的重要相似之处在于,数据包不能保证到达目的地。虽然我们会尽一切努力将数据包送到目的地,但有时数据包会在传输过程中丢失。
此外,如果您同时发送 5 个数据包,也不能保证它们会在同一时间或以相同的顺序到达目的地。
所以当你使用IP协议传输数据时,数据包可能会丢失,也可能不按顺序传送,因为 IP 是一种尽力而为的协议,这意味着它不保证数据包的传送或顺序。
TCP 的出现就是为了解决 IP 的这些局限性。
TCP的保证
TCP 主要提供两种保证:(a) 可靠的数据包传送和 (b) 有序的数据包传送。
保证 #1–可靠传输
TCP 可确保数据包在传输过程中不会丢失。为此,它要求接收方确认所有发送的数据包,如果没有收到确认,则重新传输任何数据包。

保证 #2–有序递送
除了保证数据包到达目的地外,TCP 还保证数据包按顺序传送。为此,它为每个数据包标上一个顺序号。接收方会跟踪这些编号,并对不按顺序的数据包重新排序。如果数据包丢失,接收方会等待重新传输。

TCP 使用序列号来保持正确的数据传输顺序,并在目的地重新组装数据包。
TCP 链接
TCP 是一种面向连接的协议,这意味着要通过 TCP 进行交互,程序必须首先 “建立连接”。为此,一个程序扮演 “服务器 “的角色,另一个程序扮演 “客户端 “的角色。
服务器等待连接,客户端启动连接。连接建立后,客户端和服务器都可以接收和发送数据(这是一个双向通道)。

TCP 是一种双向通信协议,即客户端和服务器都可以发送和接收数据。
TCP 连接使用四个值的唯一组合来识别:
- 目标 IP 地址
- 目标端口号
- 源 IP 地址
- 源端口号
例如,假设您正在连接 google.com。您的 TCP 连接值将如下所示:
目标 IP 地址:x.x.x.x(Google 的网络服务器) 目标端口号:443(HTTPS 使用的默认端口) 源 IP 地址:y.y.y.y(您的计算机) 源端口号:26789(随机数,计算机上的任何其他连接均未使用)

如果浏览器与谷歌服务器打开多个连接,只有 “源端口号 “会发生变化,其他端口号将保持不变。
MAC 地址不用于识别 TCP 连接,因为它们与数据链路层有关,而与 TCP 运行的传输层无关。
TCP 握手
TCP 握手是客户端与服务器建立连接的方式。这个过程分为 3 个步骤。
步骤 1:SYN
首先,客户端向服务器发送 SYN(同步)数据包,表示请求建立连接,从而启动连接。该数据包还包含一个序列号,以保持数据包的发送顺序。

步骤 2:SYN-ACK
服务器收到 SYN 数据包后,会发回一个 SYN-ACK(同步确认)数据包。

步骤 3:ACK
在三方握手的最后一步,客户端通过发送 ACK(确认)数据包来确认服务器的 SYN-ACK 数据包。服务器收到最后一个数据包后,连接即被视为建立。

客户端发送 SYN 数据包,服务器响应 SYN-ACK 数据包,客户端回复 ACK 数据包。
三方握手确保建立可靠的连接,验证两台设备是否都已准备好进行数据传输,并设置初始序列号以正确排列数据包。