计算机网络面试题(二十二):TCP沾包、拆包以及解决办法

在这里插入图片描述
在这里插入图片描述


UDP

UDP是基于数据包协议,UDP首部采用16bit指示UDP数据报文长度。因此接收端可以利用长度信息明确将不同的数据包区分开,从而避免沾包和拆包问题


TCP

TCP是面向字节流的

  • 应用层和传输层的数据交互是大小不等的数据块

TCP没有将这些数据块区分边界,仅仅是一连串没有结构的数据流

  • TCP帧结构中,首部没有表示数据长度的字段

基于以上原因才产生了TCP沾包和拆包问题


什么是沾包拆包

假设客户端向服务端发送两个数据包(packet1、packet2),那么服务端在接收时存在三种情况

(1)正常接收

在这里插入图片描述

(2)只收到一个数据包(全部沾包了)

在这里插入图片描述
由于接收端不清楚这两个数据包的界限,所以不知道如何处理

(3)服务端收到了两个数据包(部分沾包)

在这里插入图片描述
在这里插入图片描述

一个不完整、一个多了一块


为什么发送沾包、拆包

沾包和拆包的本质上服务端难以界限接收的数据包

拆包

  • 要发生的数据 > TCP发送缓冲区的大小
  • 待发送数据

沾包

  • 要发生的数据 < TCP发送缓冲区大小
  • 接收端应用层长时间没有读取接收缓冲区内的数据

解决办法

由于TCP是面向字节流的,无法理解上层的业务逻辑(它也不知道哪些是属于同一数据包的),所以在底层是无法保证数据包不被拆分和重组的,只能通过上层的应用协议栈设置解决

  1. 消息定长

既然难以界限,那就和UDP意义设置固定长度(不够补0)

  1. 消息边界

在包尾设置换行符等对数据包边界进行定义(例:FTP)

  1. 将消息分为消息头和消息体

消息头包含总长度

总的来说就是要让接收端可以对数据包进行区分

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值