按照题主说的,UDP还分为2个阶段:
阶段1,还没有连接(Disconnected)的UDP状态。
阶段2,建立连接(Connected)的UDP状态。
错,UDP是一个天生(Native)的无连接(Connectionless)传输层协议!
问题就变成了:“UDP通信需要生成Socket吗”?
是的,一定会生成UDP Socket,使用socket()系统调用生成。
操作系统返回一个FD(File Descriptor),一个整数。这个整数一般从3开始,因为0、1、2分别被input、output、exception所占用。
接下来用该UDP Socket发送数据,只要携带input参数FD,Peer Address、Peer Port、Data_buffer调用sendto()即可完成发送。
当sendto()调用返回时,这个被发送的UDP Packet逗留在UDP Send Buffer一会?
不会,因为UDP压根没有Send Buffer。^_^
UDP Packet被UDP、IP封装处理、IP路由,找到outgoing interface,然后调用
outgoing interface‘soutput()函数,三种结果。
-
如果outgoing interface send queue 满了,丢弃。
-
否则将packet放在outgoing interface send queue末尾,此时网卡正处于发送(Active)状态,发完queue前面的packets,最后发送该UDP packet。
-
如果outgoing interface send queue空,udp packet放入send queue,调用outgoing interface‘s start()发送该packet,如果发完该packet之后,queue里依然还有后续的packet进入,死循环发送,直到queue清空。
最后,当用户手动创建一个socket成功的背后,背后产生多少个结构体?
大概是这个样子的,这里还忽略了INPCB(Internet Protocol Control Block),和socket有瓜葛的struct。这样无论数据从上层到下层流动,还是下层到上层流动,都可以找到socket。
上层--->下层
proc->p_fd->fd_ofiles->file[FD]->socket
下层--->上层
Protosw ---- INPCB ---socket
而用户需要传入的和socket有关的参数,仅仅是上文加亮的FD。
原文始发于微信公众号(车小胖谈网络):udp没有连接就会生成socket吗?
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论