TCP/IP
TCP 是面向连接的、可靠的、基于字节流的传输层协议。
|-----------|-----------------|
| 面向连接 | 通信前需要建立连接(三次握手) |
| 可靠传输 | 保证数据完整、正确到达 |
| 有序传输 | 数据按发送顺序到达 |
| 面向字节流 | 没有消息边界,数据像水流一样 |
| 全双工 | 双方可以同时发送和接收 |
三次握手:TCP建立连接的时候需经过三次握手,确保通讯双方都已经准备就绪。

四次挥手:断开连接,确保通信双方在断开连接前都已经收发数据结束
可以由客户端发起,也可以由服务端发起

connect

listen

接收客户端:accept

接收数据recv

TCP粘包问题
粘包是 TCP 编程中最常见的问题之一,指发送方发送的多个数据包被接收方一次收到,或者一个数据包被多次接收。

| 原因 | 说明 |
|---|---|
| TCP 是流式协议 | 没有消息边界,数据像水流一样连续 |
| Nagle 算法 | 为了效率,将多个小包合并发送 |
| 发送缓冲区 | 多个包在缓冲区中积累后一起发送 |
| 接收缓冲区 | 接收方一次性读取多个包 |
解决方案
- 收发指定大小
结构体
struct data
{
int id;
long num;
};
注意:注意结构体在不同平台上字节数不一致问题
//64位 16
//32位 8
- 每包数据增加分隔符,应用层根据分隔符解析
"hello word\n" "how are you\n"
- 带有帧头帧尾的自定义协议,应用层根据协议精准解析

TCP与UDP对比
| 协议 | 一句话 | 比喻 |
|---|---|---|
| TCP | 可靠的、有序的、面向连接的 | 打电话(拨号、接通、挂断) |
| UDP | 不可靠的、无序的、无连接的 | 发短信(直接发,不管对方收到没) |