socket中的粘包理解

粘包问题:
    发送端发送数据,接收端不知道应该如何接收而造成的一种数据混乱的现象
    只有tcp协议才会发送粘包(数据链路层),udp(传输层)不会发生
    udp不会发生粘包,udp协议本层对一次收发数据大小的限制是:
    65535 - ip包头(20) - udp包头(8) = 65507

针对 使用udp协议发送数据,一次收发大小究竟多少合适?
    站在数据链路层,因为网卡的MTU一般被限制在了1500,所以对于数据链路层来说,一次收发数据的大小被限制在  1500 - ip包头(20) - udp包头(8) = 1472
        得到结论:
            如果sendto(num)
            num > 65507  报错
            1472 < num < 65507  会在数据链路层拆包,而udp本身就是不可靠协议,所以一旦拆包之后,造成的多个小数据包在网络传输中,如果丢任何一个,那么此次数据传输失败
            num < 1472 是比较理想的状态

(结合图片理解)
1.在tcp协议中,有一个合包机制(nagle算法),将多次连续发送且间隔较小的数据,进行打包成一块数据传送.
2.还有一个机制是拆包机制,在发送端,因为受到网卡的MTU限制(数据链路层->网卡),会将大的超过MTU限制的数据,进行拆分,拆分成多个小的数据,进行传输.
  当传输到目标主机的操作系统层时,会重新将多个小的数据合并成原本的数据




原文地址:https://www.cnblogs.com/god-for-speed/p/11719040.html

时间: 2024-11-13 11:44:48

socket中的粘包理解的相关文章

什么是粘包? socket 中造成粘包的原因是什么? 哪些情况会发生粘包现象?

只有TCP有粘包现象,UDP永远不会粘包! 粘包:在接收数据时,一次性多接收了其它请求发送来的数据(即多包接收).如,对方第一次发送hello,第二次发送world, 在接收时,应该收两次,一次是hello,一次是world,但事实上是一次收到helloworld,一次收到空,这种现象叫粘包. 原因 粘包问题主要还是因为接收方不知道消息之间的界限,不知道一次性提取多少字节的数据所造成的. 什么情况会发生: 1.发送端需要等缓冲区满才发送出去,造成粘包(发送数据时间间隔很短,数据很小,会合到一起,

python/socket编程之粘包

python/socket编程之粘包 粘包: 只有TCP有尿包现象,UDP永远不会粘包. 首先需要掌握一个socket收发消息的原理 发送端可以是1k,1k的发送数据而接受端的应用程序可以2k,2k的提取数据,当然也有可能是3k或者多k提取数据,也就是说,应用程序是不可见的,因此TCP协议是面来那个流的协议,这也是容易出现粘包的原因而UDP是面向笑死的协议,每个UDP段都是一条消息,应用程序必须以消息为单位提取数据,不能一次提取任一字节的数据,这一点和TCP是很同的.怎样定义消息呢?认为对方一次

golang中解决tcp传输中的粘包问题

"-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> golang中解决tcp传输中的粘包问题 - Programmer小卫 - 博客频道 - CSDN.NET Programmer小卫 故不积跬步,无以至千里.不积小流,无以成江海. 目录视图 摘要视图 订阅 [活动]2017 CSDN博客专栏评选 &nbsp [5月书

网络编程(socket)中的粘包处理

服务端 import socket,os service=socket.socket()service.bind(('localhost',1024)) #绑定要监听的端口service.listen()###监听端口con,adder=service.accept()#等对方的连接,把对方的连接在本地生成一个实例并赋值个给conwhile True: data=con.recv(1024).decode('utf-8')##接收对方传过来的值(接收的最大值为2222个字节)并且赋值 x=os.

Socket编程--TCP粘包问题

TCP是个流协议,它存在粘包问题 产生粘包的原因是: TCP所传输的报文段有MSS的限制,如果套接字缓冲区的大小大于MSS,也会导致消息的分割发送. 由于链路层最大发送单元MTU,在IP层会进行数据的分片. 应用层调用write方法,将应用层的缓冲区中的数据拷贝到套接字的发送缓冲区.而发送缓冲区有一个SO_SNDBUF的限制,如果应用层的缓冲区数据大小大于套接字发送缓冲区的大小,则数据需要进行多次的发送. 粘包问题的解决 ①:发送定长包 这里需要封装两个函数: ssize_t readn(int

socket原理与粘包

一.socket的基本概念 1.1socket是什么 Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议. 所以,我们无需深入理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的. 注:也有人将socket

java socket编程解决粘包和丢包问题

##socket 丢包粘包解决方式 采用固定头部长度(一般为4个字节),包头保存的是包体的长度 header+body 包头+包体 思路是:先读出一个包头,得到包体的长度,解析出包体 public class SocketServer { public static void main(String args[]) { ServerSocket serverSocket; try { serverSocket = new ServerSocket(); serverSocket.bind(new

接收socket数据的粘包处理

//粘包解决方法,格式<x>XXXXXXXXXXXX</x> ?? ??? ?public void readMess(String message){ ?????????? //存放数据 ?? ??? ??? ?data = data+message; ?? ??? ??? ?try{ ???????? //循环是数据可能有多个<x>XXX</x><x>XXX</x>................. ?? ??? ??? ? wh

网络编程 套接字socket 及 粘包

网络编程 套接字socket 及 粘包 sockt 初识 五层协议 : 从传输层包括传输层以下 , 都是操作系统帮我们封装的各种head socket套接字充当的就是内置模块的角色 socket 套接字,它存在于传输层与应用层之间的抽象层 避免你学习各层的接口以及协议的使用, socket已经封装好了所有的接口 . 直接使用这些接口或者方法即可 , 使用起来方便,提升开发效率 socket 就是一个模块 , 通过使用学习模块提供的功能 , 建立客户端与服务端的通信 套接字的工作流程(基于TCP和