DatagramSocket(UDP 的 socket)
DatagramPacket(UDP 的发送的报文)
UDP:面向数据报文
发送方发送的数据,会被原封不动的,传递给接收方
期间是不会做数据的拼接和拆分的
保证[abc][defg] 立即发送
传输层:UDP:User Datagram Protocol 用户报文协议
职责:进程 to 进程
特点:不可靠、面向数据报文、无连接
定长的包头,方便进行解包操作
端口号:UDP 协议栈内部维护 Map<port,pid>,当端口来时,根据目标端口 + map,做分用。这样就由UDP协议把数据交给正确的进程去处理。
校验和(检查数据是否损坏):
发送端(UDP):按照特定算法(CRC),将内存计算出一个值,记为 h1,把 h1 填充到包头中。
接收端(UDP):接收到数据,也计算一个 h2 。如果 h1 != h2。说明数据不同(传输过程中数据可能出现错误),直接丢弃。如果h1 == h2。大概率数据是对的。可以正常交付。
UDP发送端:
进程调用了socket.send(packet);UDP协议栈中会做什么:
1.socket 有本地端口,填写16位源端口号
2.根据 packet 的端口,填写16位目标端口
3.填写数据长度
4.计算校验和,填写校验和
5.直接把数据发送给网络层(IP层)
UDP 没有发送缓冲区:因为没有数据要在UDP这里进行保存,UDP收到数据后,只是填写一些东西就发送给网络层了(体现UDP面向数据报文的特点)。
UDP接收端:
UDP协议栈中会做什么:
1.解包 + 分用:定长的包头:根据目标端口,找到对应的 pid ,如果没有找到 pid ,丢掉
2.计算 校验和。如果不相等,直接丢弃
3.把应用层数据切割出来,交付给接收者进程 socket.receive(packet) byte[] buf = ... ;
如果某个进程绑定了端口,但是暂时还没来,记得 receive()
UDP有接收缓冲区
发送进程:socket.send(packet);成功了 代表 数据只是发送到网络中了。