UDP和TCP的特点
- 用户数据报协议UDP(User Datagram Protocol)是无连接的,尽最大可能交付,没有拥塞控制,面向报文,支持一对一、一对多、多对多的交互通信。
- 传输控制协议TCP(Transmission Control Protocol)是面向连接的,提供可靠交付,有流量控制,拥塞控制,提供全双工通信,面向字节流,只支持一对一(点对点)的通信。
UDP首部格式
首部字段只有8个字节,包括源端口、目的端口、长度、检验和。
12字节的伪首部是为了计算检验和临时添加的。
TCP首部格式
- 序号: 用于对字节流进行编号,例如序号为101,表示第一个字节的编号为101,如果数据长度为200字节,那么下一个收到的报文段的序号为301,常用seq表示。
- 确认号: 期待收到的一下报文段的序号。例如 B 正确收到 A 发送来的一个报文段,序号为 501,携带的数据长度为 200 字节,因此 B 期望下一个报文段的序号为 701,B 发送给 A 的确认报文段中确认号就为 701。
- 数据偏移: 指的是数据部分距离报文段起始处的偏移量,实际上指的是首部的长度。
- 确认ACK: 当 ACK=1 时确认号字段有效,否则无效。TCP 规定,在连接建立后所有传送的报文段都必须把 ACK 置 1。
- 同步SYN: 在连接建立时用来同步序号。当 SYN=1,ACK=0 时表示这是一个连接请求报文段。若对方同意建立连接,则响应报文中 SYN=1,ACK=1。
- 终止FIN: 用来释放一个连接,当 FIN=1 时,表示此报文段的发送方的数据已发送完毕,并要求释放连接。
- 窗口: 窗口值作为接收方让发送方设置其发送窗口的依据。之所以要有这个限制,是因为接收方的数据缓存空间是有限的。
UDP如何实现可靠传输
相对于TCP,由于UDP是面向无连接、不可靠的传输协议。
如果我们要用UDP去实现可靠的传输,则需要解决两个问题:
- 丢包
- 后发先至(包的顺序)
解决方法:
1)给数据包编号,按照包的顺序接收并存储;
2)接收端接收到数据包后发送确认信息给发送端,发送端接收确认数据以后再继续发送下一个包,如果接收端收到的数据包的编号不是期望的编号,则要求发送端重新发送。
感谢CS-Notes 的指导