嵌入式学习日记(33)TCP
UDP特点
1. 面向数据包
2. 无需建立连接
3. 尽最大努力交付,不安全、不可靠(数据丢包、乱序)
4. 可实现一对一、一对多的传输
5. 机制简单,资源开销小,数据实时性高(VNC、直播)
如何避免UDP丢包:
1.发送方以较慢的速度发送数据,让接收方又足够的时间处理数据。
2. 模仿TCP的机制:应答机制
wireshark
网络抓包:抓取通过设备网卡的网络数据,从而调试和分析网络程序。
使用:1.sudo wireshark启动抓包工具
2. 选取要抓取的网卡---》any
3. 选择一个过滤条件
4. 开始抓取
5. 进行一次网络通信
UDP报文头部
UDP头部:总共8字节
源端口号:发送方网络进程端口号
目标端口号:接收方网络进程端口号
长度:UDP发送的报文的整体长度(UDP头部+UDP正文)
校验和:数据差错校验
网络协议-TCP
TCP : 传输层 传输控制协议(流式套接字)
复习:
UDP的特点:
1. 面向数据包
2. 无连接
3. 尽最大努力交付,不安全不可靠(数据丢包、数据乱序)
4. 机制简单,资源开销小,数据实时性高
5. 可实现一对一、一对多的通信
TCP的特点
1. 面向数据流
2. 有连接(通信之前必须建立连接)
3. 安全可靠的传输机制
4. 机制复杂,网络资源开销大
5. 本质只能实现一对一的通信(使用TCP并发方式可实现一对多通信)
TCP三次握手和四次挥手机制
TCP三次握手:TCP建立连接时,需要进行三次握手,为了确保收发双方通信之前都已准备就绪。
TCP四次挥手:TCP断开连接时,需要进行四次挥手,确保断开连接前双方都已通信结束。
int connect(int sockfd, const struct sockaddr *addr, addrlen);
功能:请求与服务端建立连接
参数:
sockfd:套接字
addr:要连接的服务端的地址信息
addrlen:服务端地址大小
返回值:
成功:0
失败:-1
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
功能:发送网络数据
参数:
sockfd:网络套接字
buf:要发送的数据首地址
len:发送的字节数
flags:0 :按照默认方式发送
返回值:
成功:实际发送的字节数
失败:-1
int listen(int sockfd, int backlog);
功能:监听建立三次握手的客户端
参数:
sockfd:监听套接字
backlog:最大允许监听的客户端个数
返回值:
成功:0
失败:-1
int accept(int socket, struct sockaddr *restrict address,socklen_t *restrict address_len);
功能:接收建立三次握手的客户端,并产生一个通讯套接字
参数:
socket:监听套接字
address:客户端的地址信息
address_len:客户端地址长的指针
返回值:
成功:通讯套接字
失败:-1
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
功能:从网络套接字上接收数据
参数:
sockfd:通讯套接字
buf:存放接收数据的首地址
len:期望接收到的字节数
flag : 0:默认方式接收(阻塞)
返回值:
成功:实际接收到的字节数
失败:-1
对方断开连接:0
TCP粘包问题
TCP粘包问题:发送方应用层发送的多包数据,将来在接收方可能一次读到,多包数据产生了粘连。
原因:
1. 发送方速度较快,TCP底层可能对多包数据进行重新组帧;
2. 接收方数据处理速度较慢,导致多包数据在接收缓冲区缓存,应用层读时,一次将多包数据读出。
解决粘包问题的常用方法:
1. 调整发送速率
2. 发送指定大小,将来接收方也接受指定大小。
结构体
注意:
1. 跨平台之间的数据传输时,注意结构体对齐问题。
32bits平台<-->64位平台
3. 应用层位发送的数据增加分隔符,利用分隔符解析
hello world\nhow are you\n
4. 封装自定义数据帧格式进行发送(协议),严格根据协议进行解析。
AA C0 00 00 00 F0 00 BB 10 A0 00 00 00 10 校验 BB AA C0 00 00 00 F0 00 BB 10 A0 00 00 00 10 校验 BB AA C0 00 00 00 F0 00 BB 10 A0 00 00 00 10 校验 BB
帧头:AA
帧尾:BB
有效数据长度:C0
有效数据:00 00 00 F0 00 BB 10 A0 00 00 00 10
校验: 8位和校验
16位和校验
CRC校验
重点
1. UDP和TCP区别
2. TCP三次握手和四次挥手
3. TCP粘包问题及解决方法
4. TCP客户端和服务端的编程流程