TCP 1
TCP,全称传输控制协议(Transmission Control Protocol),是互联网通信的基石之一。你可以把它想象成一个高度负责、追求完美的“快递系统”,它的核心任务就是在不可靠的网络上,为应用程序提供一条可靠的、有序的、面向字节流的数据传输通道。
1.头部格式
- 源端口 (Source Port, 16位)
- 作用:标识发送数据的应用程序端口号。
- 通俗理解:就像快递单上的“发件人电话”,告诉接收方如果有回复该发给谁。
- 目的端口 (Destination Port, 16位)
- 作用:标识接收数据的应用程序端口号(如 80 端口对应 Web 服务)。
- 通俗理解:就像“收件人电话”,确保数据被操作系统交给正确的软件(比如浏览器或微信)处理。
- 序列号 (Sequence Number, 32位)
- 作用:给发送的数据字节编个号。
- 原理:如果是连接建立的第一个包(SYN),它是初始序列号(ISN);如果是数据传输,它代表本报文段第一个字节的编号。接收方利用它将乱序到达的数据包重新排序,并发现是否有丢包。
- 确认号 (Acknowledgment Number, 32位)
- 作用:告诉对方“我已经收到了多少数据,下次请从哪个字节开始发”。
- 原理:只有当ACK 标志位为 1 时,这个字段才有效。比如确认号是 1001,意味着“前 1000 个字节我都收到了,请发第 1001 个字节及之后的数据”。
- 头部长度(Data Offset, 4位)
- 作用:它指出 TCP 头部有多长(以 4 字节为单位)。
- 为什么需要它:因为 TCP 头部有“选项”字段,长度是不固定的。接收方必须知道头部在哪里结束,数据从哪里开始。
- 保留 (Reserved, 3-6位)
- 作用:目前置为 0,留作将来使用。
- 标志位 (Flags / Control Bits)
这是 TCP 头部的“控制中心”,包含 6-9 个标志位,每个位代表一个特定的指令:
| 标志位 | 全称 | 作用详解 |
|---|---|---|
| URG | Urgent | 紧急。置 1 时表示报文段中有紧急数据(如 Ctrl+C),接收方应优先处理,需配合“紧急指针”使用。 |
| ACK | Acknowledgment | 确认。置 1 时表示“确认号”字段有效。TCP 连接建立后,所有报文段都必须将 ACK 置 1。 |
| PSH | Push | 推送。置 1 时,指示接收方收到数据后立即交给应用层,不要等缓冲区填满。常用于交互式通信(如聊天)。 |
| RST | Reset | 复位。置 1 时表示连接出现严重错误(如主机崩溃或请求非法),必须强制断开并重置连接。 |
| SYN | Synchronize | 同步。在建立连接(三次握手)时使用。SYN=1 表示请求建立连接并同步序列号。 |
| FIN | Finish | 结束。置 1 时表示发送方数据已发完,请求优雅地释放连接。 |
| ECE/CWR | ECN | 拥塞控制。用于显式拥塞通知,帮助网络在丢包前通知发送方减速。 |
- 窗口大小 (Window, 16位)
- 作用:流量控制的核心。
- 原理:告诉发送方“我现在的接收缓冲区还能装多少字节的数据”。如果窗口为 0,发送方就必须暂停发送,防止接收方被淹没。
- 校验和 (Checksum, 16位)
- 作用:错误检测。
- 原理:对头部和数据内容进行计算得出的数值。接收方会重新计算,如果结果不一致,说明数据在传输中损坏了,直接丢弃。
- 紧急指针 (Urgent Pointer, 16位)
- 作用:仅在 URG=1 时有效。它指出本报文段中紧急数据的末尾位置,帮助接收方快速定位紧急信息。
- 选项 (Options, 变长)
- 作用:用于扩展 TCP 功能,弥补早期设计的不足。
- 常见选项:
- MSS (最大报文段长度):协商双方一次能接收的最大数据量,避免分片。
- 窗口扩大因子:让窗口大小可以超过 65535 字节,适应高速网络。
- 时间戳:用于更精确地计算往返时间 (RTT)。
- 填充 (Padding)
- 作用:因为选项长度不固定,填充字段用来补零,确保整个 TCP 头部长度是 4 字节的整数倍(32位对齐),方便 CPU 处理。
总结来说,TCP 头部通过端口找人,通过序列号/确认号保序,通过标志位控状态,通过窗口控流速,通过校验和保质量
2.为什么需要tcp协议
我们需要 TCP 协议,最根本的原因在于底层的网络传输(IP 协议)是不可靠的,而TCP 是面向连接的、可靠的、基于字节流的传输层通信协议。
面向连接、可靠的、基于字节流。这三个词是 TCP 协议的“灵魂”,也是它区别于 UDP 等其他协议的根本特征。
1. 面向连接 :在正式传输数据之前,通信双方必须先建立一个逻辑上的“通道”(即连接)。只有连接建立成功,才能开始传数据;传完后,还需要正式断开连接。
2.可靠的:TCP 保证数据无差错、不丢失、不重复、且按序到达。如果网络不好导致数据丢了,TCP 会自动重发,直到对方收到为止。
3.基于字节流:TCP 把数据看作一连串没有结构的字节(0和1)。它不保留应用层发送数据的“边界”。
如果把互联网数据传输比作寄送快递,底层的 IP 协议就像是一个“不负责任的快递员”:他只负责把包裹扔出去,但不保证包裹不丢失、不损坏,也不保证包裹是按顺序到达的。
TCP 的存在,就是为了给这个“草台班子”般的底层网络,加上一层“全程保障服务”。
1. 解决“数据丢失”的问题(可靠性)
在没有 TCP 的情况下,数据包在网络传输中可能会因为线路故障、路由器拥堵等原因凭空消失。
- TCP 的解法:它会给每个数据包编号,并要求接收方收到后回复“收到了”(ACK 确认应答)。如果发送方在规定时间内没收到回复,就会自动重发。
- 为什么需要:想象你在下载一个银行 App 或支付转账,如果数据包丢了导致金额数字缺失,后果不堪设想。TCP 确保了数据100% 准确送达。
2. 解决“顺序错乱”的问题(有序性)
网络中的数据包可能走不同的路径,就像你寄出的 1、2、3 号包裹,可能 3 号先到,1 号后到。
- TCP 的解法:通过“序列号”机制,接收方会把乱序到达的数据包重新排队,拼成原本的样子再交给应用程序。
- 为什么需要:如果你在看网页或读小说,文字顺序乱了就没法阅读了。TCP 保证了数据按发送顺序交付。
3. 解决“发太快对方处理不过来”的问题(流量控制)
如果发送方是一台超级计算机,接收方是一个性能较弱的手机,发送方一股脑把数据全塞过去,接收方的缓冲区会溢出,导致数据丢失。
- TCP 的解法:利用“滑动窗口”机制。接收方会告诉发送方:“我现在只能处理这么多,你慢点发”,发送方据此调整速度。
- 为什么需要:这实现了发送方和接收方之间的速度匹配,防止“撑死”接收方。
4. 解决“网络拥堵”的问题(拥塞控制)
如果所有人都拼命往网络里塞数据,路由器就会堵死,导致整个网络瘫痪(拥塞崩溃)。
- TCP 的解法:TCP 会感知网络状况。如果发现网络拥堵(丢包),它会自动“踩刹车”,降低发送速度;等网络通畅了再慢慢加速。
- 为什么需要:这保护了整个互联网的健康,避免因为个别大流量传输导致全网瘫痪。
5. 解决“找不到程序”的问题(面向连接与端口)
数据到了电脑,是给浏览器看,还是给微信看?
- TCP 的解法:通过“三次握手”建立专用连接,并利用“端口号”来区分不同的应用程序。
- 为什么需要:这确保了数据能精准地交给正确的软件处理,而不是张冠李戴。
一句话总结:我们需要 TCP,是因为在大多数应用场景下(如浏览网页、传输文件),数据的完整性和准确性远比传输速度更重要。TCP 屏蔽了底层网络的复杂性,让开发者可以像使用“管道”一样简单、放心地传输数据。
