LINUX 网络编程2

TCP/IP

TCP 是面向连接的、可靠的、基于字节流的传输层协议

|-----------|-----------------|
| 面向连接 | 通信前需要建立连接(三次握手) |
| 可靠传输 | 保证数据完整、正确到达 |
| 有序传输 | 数据按发送顺序到达 |
| 面向字节流 | 没有消息边界,数据像水流一样 |
| 全双工 | 双方可以同时发送和接收 |

三次握手:TCP建立连接的时候需经过三次握手,确保通讯双方都已经准备就绪。

四次挥手:断开连接,确保通信双方在断开连接前都已经收发数据结束

可以由客户端发起,也可以由服务端发起

connect

listen

接收客户端:accept

接收数据recv

TCP粘包问题

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

原因 说明
TCP 是流式协议 没有消息边界,数据像水流一样连续
Nagle 算法 为了效率,将多个小包合并发送
发送缓冲区 多个包在缓冲区中积累后一起发送
接收缓冲区 接收方一次性读取多个包

解决方案

  1. 收发指定大小

结构体

struct data

{

int id;

long num;

};

注意:注意结构体在不同平台上字节数不一致问题

//64位 16

//32位 8

  1. 每包数据增加分隔符,应用层根据分隔符解析

"hello word\n" "how are you\n"

  1. 带有帧头帧尾的自定义协议,应用层根据协议精准解析

TCP与UDP对比

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