linux udp详解总结

tcp和udp存在本质的差异,因为传输层很不相同,DNS,NFS,SNMP都是基于UDP实现的。

sendto():要求把目的地址作为其参数。
recvform():等待来自某客户的数据到达,客户的协议地址“被”填入第五个参数。如果第五和第六个参数为NULL,这表示我们并不关心发数据方的协议地址。如果不为NULL,则第五个参数被填入对端的ip和端口号。
recvfrom和sendto可用于TCP,不过我们一般不这样做。
对于tcp而言,在调用connect的时候会分配一个临时端口号,跟tcp一样,客户可以显示的调用bind,但是很少这样做。
对于udp而言,如果进程首次调用sendto时还没有捆绑上一个本地端口,内存就在此为套接字选定一个临时端口。
注意:sendto()的最后一个参数是证书,recvfrom的最后一个参数是整数地址。

UDP的长度可以是0,所以recvfrom的返回值可以是0,也就是说recvfrom不像tcp,在tcp中recv返回0代表对端连接断开。
如果想要确保一个udp数据报到达其目的地, 可以往应用程序中添加一大堆的特性: 来自对端的确认、本段的超时与重传等。
UDP不保证数据报会到达最终目的地,不保证各个数据报的先后顺序跨网络后保持不变,也不保证每个数据报只到达一次。
每个UDP数据报都有一个长度,如果一个数据报正确的到达了目的地,那么该数据报的长度将随数据一道传递给接收端应用程序,重点是是tcp是一个字节流( byte-stream)协议,没有任何记录边界,而每个UDP数据包是有边界的。
写一个UDP套接字的write调用成功后返回表示所写的数据报或其所有片段已被加入数据链路层的输出队列。如果该队列没有足够的空间存放该数据报或其他某个片段,内核通常会返回一个ENOBFS错误给它的应用程序
不幸的是,有些UDP的实现不返回这种错误,这样甚至数据报未经发送就被丢弃的情况应用进程也不知道,这是个大坑啊!






linux udp详解总结_第1张图片

你可能感兴趣的:(linux udp详解总结)