Skip to content

piaodangdang/homework-8

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 

Repository files navigation

homework-8

Go进阶训练营第八周作业


title: socket粘包 date: '2021/6/25 09:00:00' categories: Go进阶训练营 tags: technology

开始主题前,先厘清几个基本概念

什么是Socket

给程序员用的网络框架,封装了TCP和UDP传输通讯协议, 用来开发网络应用程序

什么是TCP

TCP全称Transmission Control Protocol, 用于通信的协议。

什么是粘包

发送者发了两条消息:消息1:ABC, 消息2:DEF

正常情况,接受者收到:消息1:ABC, 消息2:DEF

粘包,接受者收到:消息1:ABCDEF

半包,接受者收到:消息1:AB, 消息2:CDEF

半包,接受者收到:消息1:ABCD, 消息2:EF

为什么会发生粘包

TCP协议为了高效传输数据付出的代价

对TCP来说,它处理的是底层的数据流,数据流本身没有任何开始和结束的边界

发送数据过程:应用程序发送消息包,消息包以数据流的形式放入缓冲区,等缓冲区的数据流到达一定阈值后,再发送到网络上

接受数据过程:接受到网络过来的数据流,放入缓冲区,缓冲区的数据流到达一定阈值后,通知应用程序进行读取数据

在数据发送和接受的过程中,都是对数据流进行操作

1.在发送数据的时候

应用程序发送的数据长度超过缓冲区空间,这就发生数据流拆分, 同一个数据包就会通过多次发送完成,表现就是上述的半包情况

应用程序发送的数据小于超过缓冲区空间,等到同多个数据包填满缓冲区再进行发送,表现就是上述的粘包情况

2.在接受数据的时候

应用程序没有继续读取缓冲区的数据流,导致缓冲区放了多个数据包数据,再进行读取,也是上述的粘包

怎么处理粘包

方式1: fix length

发送方,每次发送固定长度的数据,并且不超过缓冲区,接受方每次按固定长度区接受数据

方式2: delimiter based

发送方,在数据包添加特殊的分隔符,用来标记数据包边界

方式3: length field based

发送方,在消息数据包头添加包长度信息

About

Go进阶训练营第八周作业

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Go 100.0%