TCP与UDP协议

  1. TCP(transport control protocol,传输控制协议)是面向连接的,面向流的,提供高可靠性服务。收发两端(客户端和服务器端)都要有一一成对的socket,因此,发送端为了将多个发往接收端的包,更有效的发到对方,使用了优化方法(Nagle算法),将多次间隔较小且数据量小的数据,合并成一个大的数据块,然后进行封包。这样,接收端,就难于分辨出来了,必须提供科学的拆包机制。 即面向流的通信是无消息保护边界的
  2. UDP(user datagram protocol,用户数据报协议)是无连接的,面向消息的,提供高效率服务。不会使用块的合并优化算法,, 由于UDP支持的是一对多的模式,所以接收端的skbuff(套接字缓冲区)采用了链式结构来记录每一个到达的UDP包,在每个UDP包中就有了消息头(消息来源地址,端口等信息),这样,对于接收端来说,就容易进行区分处理了。即面向消息的通信是有消息保护边界的
  3. tcp是基于数据流的,于是收发的消息不能为空,这就需要在客户端和服务端都添加空消息的处理机制,防止程序卡住,而udp是基于数据报的,即便是你输入的是空内容(直接回车),那也不是空消息,udp协议会帮你封装上消息头,实验略

粘包现象

socket收发消息的原理

应用程序所看到的数据是一个整体,或说是一个流(stream),一条消息有多少字节对应用程序是不可见的,因此TCP协议是面向流的协议,这也是容易出现粘包问题的原因。

而UDP是面向消息的协议,每个UDP段都是一条消息,应用程序必须以消息为单位提取数据,不能一次提取任意字节的数据,这一点和TCP是很不同的。怎样定义消息呢?

可以认为对方一次性write/send的数据为一个消息,需要明白的是当对方send一条信息的时候,无论底层怎样分段分片,TCP协议层会把构成整条消息的数据段排序完成后才呈现在内核缓冲区。

#1:不管是recv还是send都不是直接接收对方的数据,而是操作自己的操作系统内存--->不是一个send对应一个recv
#2:recv:
        wait data 耗时非常长
        copy data

    send:
        copy data

更多相关文章

  1. 28.mysql数据库之查询
  2. Python_基础(命名,数据类型,循环)
  3. 尝试使用python字典重新格式化JSON数据
  4. 用 Python requests库 爬取网页数据
  5. 如何有效地扩展/展平pandas数据帧
  6. 如何将两个列表中的数据写入csv中的列?
  7. 运用Python语言编写获取Linux基本系统信息(三):Python与数据库编
  8. 独立于数据库的MAX()函数在SQLAlchemy中
  9. 可变序列长度数据的分类

随机推荐

  1. XML实战秘籍第二卷:动态查询
  2. 详细介绍XML和HTML常用转义字符
  3. XML实战秘籍第一卷:动态排序
  4. 详细介绍xml的使用方法总结
  5. XML基础讲解之结构与语法
  6. 详细介绍Android 解析XML文件和生成XML文
  7. XML文件数减少的示例代码分享
  8. XML入门的常见问题之二
  9. 利用XML FOR PATH合并分组信息的示例代码
  10. XML入门的常见问题之一