1、UDP(user datagramprotocol):用户数据包协议,是一个传输层协议。
2、UDP是无连接的。UDP的客户端和服务器没有固定的绑定关系。言下之意,同一个UDP 客户端 socket可以向多个不同UDP服务器socket发包,同一个UDP服务器socket可以接收来自多个不同UDP客户端socket的数据包。
3、UDP是一个不可靠的传输层协议,没有丢包重传机制。
4、UDP的每一个数据包,都是有包边界的,不像TCP是面向字节流的协议。
5、未连接UDP socket不能收到“端口不可达之类的icmp消息”
6、UDP socket也可以调用connect函数。对于UDPsocket来说,调用connect并不会有类似TCP一样的“三次握手”机制,仅仅是绑定“目的IP地址,目的端口号”。关键点:UDP socket的connect,不会向对端发送任何数据包!!!!!!!
7、已连接的UDP socket,发包的时候,可以用send,sendto。对于sendto,目的地址指针参数必须为NULL,目的地址长度参数必须是0。
8、已连接的UDP socket,接收数据包的时候,可以用recv,recvfrom。对于recvfrom,源地址指针参数必须为NULL,源地址长度参数必须是0。
9、已连接的UDP socket可以接收到类似“端口不可达,之类的icmp消息”
10、已连接的UDP socket只能收,“源IP地址和源端口号”与“绑定的IP地址和端口号”相匹配的数据包。例如,客户端UDP socket 调用了connect连接了服务端UDP socket,那么客户端只能收到数据包的“源IP地址、源端口号”与“调用connect绑定的IP地址、端口号”匹配的数据包。
11、对于已连接的UDP socket,在以下两种情况下,可以继续调用connect函数
1)绑定一个新的“目的端口号和IP”
2)取消已有的连接。可以通过把socket 地址结构的sin_family字段值设为AF_UNSPEC
12、对于已连接的UDP socket,只有在调用send或者sendto发送第一个数据包的时候,才能收到“类似icmp端口不可达的错误”。因为,UDP connect的时候,不会有发包行为。
13、对于UDP socket,调用connect,内核会同时绑定本地的ip地址和端口号。(注意,sun solaris不支持)
14、UDP可以支持“单播、广播、组播”,TCP只能支持“单播”
15、调用UDP的recvmsg函数,可以得到辅助数据。例如,数据包的目的IP,目的端口。
16、当调用UDP的recvfrom函数的时候,如果接收的数据包大小超过了接收数据缓冲的大小,那么多余的数据就会被内核丢弃。并且,设置MSG_TRUNC标志。