tcp和udp的区别

wangqingshui531 2010-03-18 11:09:49
今天看《unix网络编程》有段话不是很理解

每个udp数据报都有一定的长度,我们认为一个数据包就是一个记录。如果数据报最终正确到达目的地(即分组到达目的地且校验和正确),那么数据报的长度将传递给接收方的应用进程。我们提到了一字节流协议,无记录边界,这与udp不同。


1.udp数据包有一定的长度。难道tcp数据包没有一定的长度吗?

2.一个数据包一个记录,这个里面“记录”怎么理解?

3.数据报的长度传递个接收方的应用进程,怎么将长度传递个应用进程?

4.无记录边界是什么?

望大家多多帮忙。
...全文
234 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
freetstar 2010-03-19
  • 打赏
  • 举报
回复
tcp也有长度啊
数据包里有记录数据的一些东西吧
数据包中不是有相应的位来记录长度的么
最后一个不清楚
wangqingshui531 2010-03-19
  • 打赏
  • 举报
回复
send buffer size应该不是upd包最大长度的限制吧?

个人觉得是不是应该是udp协议层的缓冲区,这个缓冲区难道仅仅是64K,跟udp包的最大长度一致?

我先自己write一下子。试试看
blackbillow 2010-03-19
  • 打赏
  • 举报
回复
事实上你不能write成功的。

A UDP socket has a send buffer size (which we can change with the SO_SNDBUF socket option), but this is simply an upper limit on the maximum-sized UDP datagram that can be written to the socket. If an application writes a datagram larger than the socket send buffer size, EMSGSIZE is returned.
wangqingshui531 2010-03-19
  • 打赏
  • 举报
回复
我调用write发送65k的包,那么一次read可以接收到65k的包吗?
wangqingshui531 2010-03-19
  • 打赏
  • 举报
回复
哎呀,有点问题了。udp包不是不能超过64k吗?如果我要发送65k的数据,UDP协议还是需要分割数据包的

这不是有点矛盾吗?
wangqingshui531 2010-03-19
  • 打赏
  • 举报
回复
嗯,blackbillow说的,我有点顿悟了。

那么从编程角度上来说,如果一个udp报是26个字节,buffer足够大的情况下,read执行一次就ok。
而如果是tpc包的话,我有可能需要循环read,知道接收到26个字节为止。

不知道我理解的是否正确?
其实理解这段话的目的就是为了编程。但是之前众人的解释,都没有让我达到想要的目的。
只有blackbillow说的....

非常感谢你,以及各位大侠的热心帮助。
blackbillow 2010-03-19
  • 打赏
  • 举报
回复
用形象的东西来理解抽象的东西是再好不过的学习方法了。

TCP没有消息边界,也可以理解成TCP流是可以分割的。而UDP是不可分割的,你给别人寄东西,肯定不会打破成若干份发过去了,而TCP是可以的。注意UNP里有这样一个例子:

With a byte-stream protocol, these 26 bytes can be returned in numerous ways: a single TCP segment containing all 26 bytes of data, in 26 TCP segments each containing 1 byte of data, or any other combination that totals to 26 bytes.
blackbillow 2010-03-19
  • 打赏
  • 举报
回复
我自己的理解

TCP好像打电话,要拨号、接听建立好连接,语音在线路上是连续的(TCP流),人们用自然语言语法去区分消息边界(应用层)。

UDP好像寄包裹,事先不需要建立连接,一个包裹要打包(UDP包),而且它很有可能丢失(不可靠)。
wangqingshui531 2010-03-19
  • 打赏
  • 举报
回复
大家不要说那么抽象嘛。 理论性的东西看看书都能知道。

有连接和无连接我还是知道。


不理解的是tcp是无边界记录,udp的长度传递个接收方这个不理解。

至于报文长度,我觉得不管什么协议报文,都有长度的。

还有什么一个数据包一个记录,这里面“记录”的概念是什么?

希望高手能讲得细些。不要太抽象。这个Unix网络编程已经看第三次了。可是发现有些话还是理解不了。
blackbillow 2010-03-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 mymtom 的回复:]

有个很形象的比喻。
如果把TCP/UDP传送的数据比喻成水,
TCP传输数据就好像水通过自来水管送到各家各户。
UDP传输数据就好像送水师傅送桶装水。
[/Quote]
不错,就是这个理
ecsape 2010-03-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 mymtom 的回复:]
有个很形象的比喻。
如果把TCP/UDP传送的数据比喻成水,
TCP传输数据就好像水通过自来水管送到各家各户。
UDP传输数据就好像送水师傅送桶装水。
[/Quote]

很好的比喻
建议楼主搜下网络分层协议,结合着看下,能更好的理解网络编程。
一品川 2010-03-19
  • 打赏
  • 举报
回复
很抽象
steptodream 2010-03-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 mymtom 的回复:]
有个很形象的比喻。
如果把TCP/UDP传送的数据比喻成水,
TCP传输数据就好像水通过自来水管送到各家各户。
UDP传输数据就好像送水师傅送桶装水。
[/Quote]
这个比喻 很不错呀
mymtom 2010-03-18
  • 打赏
  • 举报
回复
有个很形象的比喻。
如果把TCP/UDP传送的数据比喻成水,
TCP传输数据就好像水通过自来水管送到各家各户。
UDP传输数据就好像送水师傅送桶装水。

23,115

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧