碰到一个问题
传输层协议UDP,书上说不必事先建立连接,是无连接的不可靠的协议,只是尽最大努力交付,但UDP仅是传输层协议,下面还有数据链路层协议啊,该层中有超时重传,差错重传的ARQ协议,这样,原始的数据帧就能可靠通信了,上层数据也是通过下层数据表现的,不同样也能保证可靠通信吗?为什么说UDP是不可靠的?
再有如果有数据链路层的差错重传和超时重传,还要TCP的的重传机制干嘛?
数据链路层和传输层的TCP都有滑动窗口,这不重复了吗?为什么
其它层的首部我看都有长度字段,但TCP的首部中没有长度字段,那怎么知道该报文到哪里结束?
根据这个问题搜到了一个比较有意思的老帖子
转自:http://www.kuqin.com/article/30networ_technology/449635.html
下面挑一些个人认为比较好理解的答案:
其实大家讨论来讨论去,我觉得还应该补充一个问题!就是大家还要考虑3层的问题即IP协议层(internet protocol 互联网络层)。TCP/IP不光是解决相同网络(2层以内)的互联还要解决异构网络的互联。比如一个以太网络的数据帧能传输的数据包的大小能和X.25或者其他的传输网络的数据帧一样大吗?
这样,出在第3.4层的网络协议必将有个进行拆包组包的过程…或者一些对应用流量控制的机制.如果没有机制保障这种传输的可靠性,那数据链路层就是一直传下去对应用来说也是垃圾数据…因为在传输的过程中,特别到了不同网络接口转换处,协议转换时不能保障IP包在拆包组包时的准确不丢失(为什么路由器数据传输率一般是安装xx包/s算的而第二层设备可以使用xxx/bps)
路由器,打个比方就像"america 圣骑士"比喻那样,比方运输沙子一样,可以这样比喻搬运工只是解决了他的本质任务在他的搬运范围不丢一粒沙子。但是我没办法控制他搬运到某个中转站不丢沙子。因为在中转站不是搬运工能控制的范围(及点到点的传输)。而中转站靠什么来控制他的时间和效率以及不丢失沙子呢?那就要对中转站施加控制机制保障他在重新包装后不丢沙子,以及按照我的要求时间到达不行重新要求搬运工重搬(传输层协议)。UDP就是中转站因为忙或者其他原因可以随便丢失某包沙子,然而运输工是没办法丢失一粒沙子的了。。。
为了解释清楚还有一个实际的例子就是:
比如一个用户的一个数据大小是 1MB 在传输过程中(从中国某公司到英国某公司),如果使用 TCP 协议他会把 1MB 的数据拆成 N 份编 0-(N-1) 的序号根据 IP 地址( IP 协议)在网络中发送可能一部分。
一部分从
北京的出口-to-美国-to–瑞典–to–英国某公司
另一部分从
广州–to-美国–荷兰–英国
当然这是比方两部分数据的如何走由 IP 层和支撑其传输的一些路由协议关心。如果数据都顺利到达了英国某公司, TCP 协议务必将这些顺序有可能在不同类型网络中传输过后以及序号打乱的 IP 包按 0-(N-1) 的序列编排,再组织进行 TCP 层的校验,完成 1MB 数据的传输。
数据链路层只是解决一段一段路程之间的可靠传输,他不能保障在北京或在广州因为路由器忙或者其他原因导致其中的一个或者某个数据包丢失。同时也不能保证所有的数据包到达后的重新编排组合问题,也不能保证如果其中某些数据包丢失以后如何通知发送方重新发送等一系列问题.。
UDP协议是如果丢失了一个数据包这1MB的数据就作废。也不会通知发生方重新发送这就是有时E-mail不能收到其中可能的原因。
专业一点的讲就楼上某位高手说的:
数据链路层是解决: 点到点的传输问题 。
传输层是解决:端到端的传输问题 。
在下这样理解的请各位网友批评补充.