为什么说TCP是面向流的协议?而UDP是面向数据报的协议?

问题

经常能听人说:TCP是面向流的协议,而UDP是面向数据报的协议。从字面理解上来说,似懂非懂。每次都不是能彻底明白什么是流,什么是数据报?

在大家眼里,网络报文都是IP包,而IP包肯定是分片的,有最大Payload限制,那什么是流?什么是数据报呢?

我们先重温一下这些协议头。同时注意协议头中描述报文总长度相关的字段

IP、TCP、UDP协议头

IPv4协议头

IP 是 TCP/IP 协议中的核心协议,为 TCP、UDP 等协议提供了一种尽力而为、无连接的数据报传输服务,也就意味着 IP 协议不保证成功传输,也不维护数据报相关的链接状态信息。

IPv4 数据报头部至少为 20 字节,结构如下:IPv4 Header

  • 版本:确定 IP 协议的版本(IPv4 或 IPv6)
  • IHL(头部长度):由于选项的存在,由此字段确定数据从何处开始。
    DS(区分服务,DiffServ):用于支持其他不同类型的服务(非尽力而为的)。可以区分一些可能要求低时延或者其他要求的服务。
  • 总长度:IP 数据报的总长度,包括首部和头部,字节为单位。由于位数限制最多 65535 字节,所以数据大小最多为 65515 字节,但是链路层一般不能携带这么大的数据,很少超过 1500 字节。
  • 标识、标志、分片偏移:用于 IP 分片。传输过程有些协议并不能携带过大的数据,所以只能分为多个部分发送。标识避免与其他数据报分片混淆。最后一片标志设为 0,其他的设为 1。偏移指明是第几个分片,用于正确组装。
  • 头部校验和:用 16 位反码和(Internet 校验和)计算头部,对于数据部分校验由上层协议实现。由于 TTL 每经过一次路由器都会改变,校验和也要因此重新计算。

可以看到,IP协议头中有总长度字段,表示IP数据报的总长度。如果存在IP分片,可以通过分片偏移字段重新拼装payload数据。

TCP协议头

  • Data Offset:标识该TCP头部有多少个32bit(4字节),四位最大表示15,所以TCP报头最长是60字节。

注意仔细看TCP的报头字段,只有一个Data Offset字段。表示的是payload相对协议头的偏移量。并没有表示报文总长度的字段

UPD协议头

  • length: 此字段标记了整个数据报(UDP的首部+UDP数据)的总长度。

总结

TCP报文粘包、拆包 :面试官问:你来讲下Netty通信中的粘包、拆包?
那么UDP是否会发生粘包或拆包的现象呢?

答案是不会。UDP是基于报文发送的,从UDP的帧结构可以看出,在UDP首部采用了16bit来指示UDP数据报文的长度,因此在应用层能很好的将不同的数据报文区分开,从而避免粘包和拆包的问题。

而TCP是基于字节流的,虽然应用层和TCP传输层之间的数据交互是大小不等的数据块,但是TCP把这些数据块仅仅看成一连串无结构的字节流,没有边界;另外从TCP的帧结构也可以看出,在TCP的首部没有表示数据长度的字段,基于上面两点,在使用TCP传输数据时,才有粘包或者拆包现象发生的可能。

参考

  • 6
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值