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

计算机网络面试题(二十二):TCP沾包、拆包以及解决办法_第1张图片
计算机网络面试题(二十二):TCP沾包、拆包以及解决办法_第2张图片

文章目录

    • UDP
    • TCP
    • 什么是沾包拆包
        • (1)正常接收
        • (2)只收到一个数据包(全部沾包了)
        • (3)服务端收到了两个数据包(部分沾包)
    • 为什么发送沾包、拆包
    • 解决办法


UDP

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


TCP

TCP是面向字节流的

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

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

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

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


什么是沾包拆包

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

(1)正常接收

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

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

计算机网络面试题(二十二):TCP沾包、拆包以及解决办法_第4张图片
由于接收端不清楚这两个数据包的界限,所以不知道如何处理

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

计算机网络面试题(二十二):TCP沾包、拆包以及解决办法_第5张图片
计算机网络面试题(二十二):TCP沾包、拆包以及解决办法_第6张图片

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


为什么发送沾包、拆包

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

拆包

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

沾包

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

解决办法

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

  1. 消息定长

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

  1. 消息边界

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

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

消息头包含总长度

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

你可能感兴趣的:(#,计算机网络笔/面试题,网络,面试,TCP)