https://blog.youkuaiyun.com/caoshangpa/article/details/51530685
如果我们定义的TCP和UDP包没有超过范围,那么我们的包在IP层就不用分包了,这样传输过程中就避免了在IP层组包发生的错误;如果超过范围,既IP数据报大于1500字节,发送方IP层就需要将数据包分成若干片,而接收方IP层就需要进行数据报的重组。更严重的是,如果使用UDP协议,当IP层组包发生错误,那么包就会被丢弃。接收方无法重组数据报,将导致丢弃整个IP数据报。UDP不保证可靠传输;但是TCP发生组包错误时,该包会被重传,保证可靠传输。
UDP数据报的长度是指包括报头和数据部分在内的总字节数,其中报头长度固定,数据部分可变。数据报的最大长度根据操作环境的不同而各异。从理论上说,包含报头在内的数据报的最大长度为65535字节(64K)。
我们在用Socket编程时,UDP协议要求包小于64K。TCP没有限定,TCP包头中就没有“包长度”字段,而完全依靠IP层去处理分帧。这就是为什么TCP常常被称作一种“流协议”的原因,开发者在使用TCP服务的时候,不必去关心数据包的大小,只需讲SOCKET看作一条数据流的入口,往里面放数据就是了,TCP协议本身会进行拥塞/流量控制。
不过鉴于Internet(非局域网)上的标准MTU值为576字节,所以建议在进行Internet的UDP编程时,最好将UDP的数据长度控制在548字节 (576-8-20)以内。
4、实际应用
用UDP协议发送时,用sendto函数最大能发送数据的长度为:65535- IP头(20) - UDP头(8)=65507字节。用sendto函数发送数据时,如果发送数据长度大于该值,则函数会返回错误。
用TCP协议发送时,由于TCP是数据流协议,因此不存在包大小的限制(暂不考虑缓冲区的大小),这是指在用send函数时,数据长度参数不受限制。而实际上,所指定的这段数据并不一定会一次性发送出去,如果这段数据比较长,会被分段发送,如果比较短,可能会等待和下一次数据一起发送。
————————————————
版权声明:本文为优快云博主「灿哥哥」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/caoshangpa/article/details/51530685
————————————————
版权声明:本文为优快云博主「灿哥哥」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/caoshangpa/article/details/51530685
UDP是有边界的,应用层要整包地收,一次只能收一包,每次接收的要么是一个独立的完整的数据包,要么什么也接收不到。
TCP是无边界的,是字节流,需要应用层自己判断包边界,一次不一定能收几包,也不一定是完整的包。
udp socket sendto()发出的小片数据,有可能被udp合成为一个包么?比如间隔很短的两次调用sendto(),第一次发5个字节,第二次发8个,会不会合成为一个13字节payload的udp包?
不会。
1. UDP基于数据报,而TCP基于流.例如,如果TCP对端发送了三个256字节的数据缓冲区,与之相连的对端应用会依照他们的传送顺序收到768字节数据,但这些数据可能会分布在数目不定的不同块中,块与块的分界不会有任何保证.与之相反,如果UDP对端发送了三个256字节数据报,对端的接收方会收到其中的任意0.1.2.3个数据报.但是,所收到任何一个数据报都是所发送的完整的256字节数据报,一个也不会断开或合并在一起.因此, UDP传送是面向记录的,而使用TCP,你需要通过某种方式正确的提取数据流.
2. UDP不保证数据的到达或到达顺序.而TCP则保证所收到的任何数据都是正好所发送的数据,并且保持他们按照顺序到达,UDP只尽力进行递送.如前面所示,三个256字节的数据报可能不会全部到达.所收到的任何数据报都将是所发送的完整的\正确的数据报;但是,数据报可能会在传递过程中丢失或改变顺序.因此,尽管UDP减轻了你的负担,是你不必整编和解编字节流的数据,你需要对你的协议和/或应用所要求的可靠性负责。
3. TCP是两个对端之间的一对一连接,而UDP提供了多种操作模式:单播、广播、多播。