💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
TCP 是一个可靠的(reliable)、面向连接的(connection-oriented)、基于字节流(byte-stream)、全双工的(full-duplex)协议。 ## TCP 协议是可靠的 IP 是一种**无连接、不可靠**的协议:它尽最大可能将数据报从发送者传输给接收者,但并不保证包到达的顺序会与它们被传输的顺序一致,也不保证包是否重复,甚至都不保证包是否会达到接收者。 TCP 要想在 IP 基础上构建可靠的传输层协议,必须有一个复杂的机制来保障可靠性。 主要有下面几个方面: * 对每个包提供校验和 * 包的序列号解决了接收数据的乱序、重复问题 * 超时重传 * 流量控制、拥塞控制 **校验和(checksum)**每个 TCP 包首部中都有两字节用来表示校验和,防止在传输过程中有损坏。如果收到一个校验和有差错的报文,TCP 不会发送任何确认直接丢弃它,等待发送端重传 ![](https://img.kancloud.cn/10/4c/104c09968fe4c56c1e95f4ccb5d2b7d9_1976x582.png) **包的序列号保证了接收数据的乱序和重复问题** 如果因为网络的原因导致后发的包先到,TCP 会根据他们的序号进行重新的排列然后把结果传递给上层应用程序。如果因为超时重传等原因,导致TCP接收到重复数据,也能根据包序号丢弃重复数据 **超时重传**TCP 发送数据后会启动一个定时器,等待对端确认收到这个数据包。如果在指定的时间内没有收到 ACK 确认,就会重传数据包,然后等待更长时间,如果还没有收到就再重传,在多次重传仍然失败以后,TCP 会放弃这个包。 ## TCP 是面向连接的协议 * 面向连接(connection-oriented):面向连接的协议要求正式发送数据之前需要通过「握手」建立一个**逻辑**连接,结束通信时也是通过有序的四次挥手来断开连接。 * 无连接(connectionless):无连接的协议则不需要 ### 三次握手 ![](https://img.kancloud.cn/b9/8c/b98c577b4cc145156ddd226232852003_1304x978.png) SEQUENCE NUM 序列号 ACK NUM 确认号 第一次握手:客户端向服务端发送SYN请求包,携带数据SEQUENCE NUM: 0和ACK NUM:0, 第二次握手:服务端向客户端返回SYN+ACK包,携带序列号(['sikwəns]SEQUENCE NUM: 0)和ACK NUM:1(携带的数据是 将第一次握手时客户端发送的数据中ACK NUM的值加1,其他数据不变返回) 第三次 :客户端向服务端发送ACK确认包,携带数据SEQUENCE NUM: 1和ACK NUM:1(携带的数据是 服务端刚刚返回的数据中SEQUENCE NUM的值加1,其他数据不变发送) ## TCP 是面向字节流的协议 TCP 是一种字节流(byte-stream)协议,流的含义是没有固定的报文边界。接收方从 TCP 套接字读数据时,它是没法得知对方每次写入的字节是多少的。路径最大传输单元 MTU、发送窗口大小、拥塞窗口大小等都会导致每次报文的字节数不同。 ## TCP 是全双工的协议 在 TCP 中发送端和接收端可以是客户端/服务端,也可以是服务器/客户端,通信的双方在任意时刻既可以是接收数据也可以是发送数据,每个方向的数据流都独立管理序列号、滑动窗口大小、MSS 等信息。 ## 小结与思考 ![](https://img.kancloud.cn/bf/2a/bf2a12e469717e7f07898c1806f1fff7_1354x630.png) TCP 是一个可靠的(reliable)、面向连接的(connection-oriented)、基于字节流(byte-stream)、全双工(full-duplex)的协议。发送端在发送数据以后启动一个定时器,如果超时没有收到对端确认会进行重传,接收端利用序列号对收到的包进行排序、丢弃重复数据,TCP 还提供了流量控制、拥塞控制等机制保证了稳定性。