文章目录

  • 一:面向字节流
  • 二:粘包(应用层数据包)问题
  • 三:TCP异常情况

一:面向字节流

经过前面的叙述,现在我们对TCP面向字节流的理解就更加深刻了。

创建一个TCP的socket,就会在内核中创建一个发送缓冲区和一个接受缓冲区。主要有以下这么几点:

  • 调用write接口,数据会先写入发送缓冲区
  • 如果发送的字节数太长,会被拆分成多个TCP的数据包发出
  • 如果发送的字节数太短,会在缓冲区内等待,等待缓冲区长度差不多了,或者在其他合适的时机将其发送出去
  • 接受数据的时候,数据也是从网卡驱动程序到达内核的接受缓冲区的
  • 应用层可以调用read从接受缓冲区中拿取数据

TCP的一个连接,既有发送缓冲区也有接受缓冲区,所以对于这一个连接,既可以读取数据也可以写入数据——全双工

二:粘包(应用层数据包)问题

TCP协议中是没有同UDP一样的“报文长度”的字段,因此站在应用层角度来看,看到的只是一串连续的字节数,因此应用程序就无法分清数据的界限,有可能会产生粘包问题。

如果避免呢?关键就在于:应用层的协议应该要明确两个包的边界

  • 对于定长的包,保证每次都按固定大小读取即可。例如Request,那么就从缓冲区从头开始按照sizeof(Request)大小依次读取即可
  • 对于变长的包,可以在包头的位置,约定一个包总长度的字段,从而就知道了包的结束位置(比如HTTP协议中conten-length);同时还可以在包与包之前使用特殊的分隔符(比如HTTP协议中的空行

三:TCP异常情况

我们都知道运行中的程序会由于各种各样的原因崩溃,对于非网络程序来说并没有什么大的问题,不过对于网络应用程序由于它还涉及连接问题,所以它不能简单单的拍屁股走人

所以在客户端应用程序崩溃或死亡时,接收端会认为连接还在,一旦接收端有写入操作,接收端发现连接不在了,就会进行reset。即使没有写入操作,TCP自己也会内置一个保活定时器即使询问对方是否还在,如果不在就会释放连接。最经典的就是QQ了。

4-10:TCP协议之面向字节流和粘包问题相关推荐

  1. Linux_网络_传输层协议 TCP通信滑动窗口(快重传),流量控制,拥塞控制(慢启动),延迟应答,捎带应答,TCP常见问题(字节流,粘包),Listen半连接队列

    紧跟Linux_网络_传输层协议 TCP/UDP继续补充 文章目录 1. TCP通信时滑动窗口(效率) 2. 流量控制(可靠性) 3. 拥塞控制(慢启动) 4. 延迟应答 5. 捎带应答(提高通信效率 ...

  2. 以太网 TCP协议交互过程中出现丢包时的解决机制,超时重传、快速重传、SACK与DSACK

    2.7.3 以太网 TCP协议(TCP交互过程中出现丢包时的解决机制-列举部分) 参考:CSDN_TCP的重传机制_博主.Pr Young,对描述进行了整理与结合个人的理解进行编写. 一.超时重传机制 ...

  3. TCP、UDP、TCP三次握手与四次挥手、TCP如何保证可靠传输、TCP异常分析、拆包和粘包等

    4.OSI模型 4.1.OSI七层模型 4.2.七层模型功能 ​ 物理层:利用传输介质为数据链路层提供物理连接,实现比特流的透明传输,如网线:网卡标准. ​ 数据链路层:接收来自物理层的位流形式的数据 ...

  4. python socket.socket()函数 套接字详解及TCP、UDP程序示例(粘包等)

    文章目录 socket的定义 套接字的工作流程 socket函数使用 socket函数用法 服务端套接字函数 客户端套接字函数 公共用途的套接字函数 面向文件的套接字方法 打电话的流程演示 服务端.p ...

  5. Python之路(第三十一篇) 网络编程:简单的tcp套接字通信、粘包现象

    一.简单的tcp套接字通信 套接字通信的一般流程 服务端 server = socket() #创建服务器套接字server.bind() #把地址绑定到套接字,网络地址加端口server.liste ...

  6. 网络编程 socket模块 tcp协议 udp协议

    网络基础相关知识 , socket模块 , tcp协议通信代码 , tcp和udp编码流程 网络基础相关知识(1) 架构 C / S 架构: client 客户端 和 server 服务器端 优势:能 ...

  7. TCP协议与UDP协议详解

    TCP协议 TCP,即Transmission Control Protocol,传输控制协议.人如其名,要对数据的传输进行一个详细的控制. TCP协议的特点:有连接,可靠传输,面向字节流,全双工 有 ...

  8. 计算机网络中TCP连接管理,计算机网络 TCP协议

    TCP:面向连接的运输 TCP协议是面向连接的协议,把连接作为最基本的抽象.每一条TCP连接唯一的被通信两端的两个端点所确定.TCP协议是点对点,而不是点对多点.端点又被称为套接字,TCP协议规定,I ...

  9. 为什么tcp不采用停等协议_为什么 TCP 协议有粘包问题

    来自公众号:真没什么逻辑 链接:https://draveness.me/whys-the-design-tcp-message-frame/ 为什么这么设计(Why's THE Design)是一系 ...

最新文章

  1. SLAM中的卡尔曼滤波:究竟滤了谁?
  2. Linux中Eclipse开发android的配置问题
  3. 别再打字聊bug了,GitHub支持“视频留言”!手机也可以的那种
  4. MATLAB中使用streamline函数绘制正负点电荷及它们构成的电偶极子的电场线分布图
  5. 公钥密码--Diffie-Hellman密钥协商算法
  6. .NET核心正则类详解
  7. matlab晶闸管整流电路,采用Matlab/Simulink对三相桥式全控整流电路的仿真分析
  8. Tomcat4/5连接池的设置及简单应用示例
  9. pict 手册_zbrush中文手册.pdf
  10. 聊聊redo log是什么?
  11. Hibernate一对一主键单向关联
  12. 天气查询接口演示示例
  13. python 菜鸟-Python 列表(List)
  14. movie制作的电影站wordpress视频主题
  15. 大咖直播 | 大连理工赵纪军教授:人工智能算法用于团簇研究和势函数拟合
  16. Windows Server 2008的介绍及其与Windows Server 2008 R2的区别
  17. OpenVR学习01 成功打开了VR设备
  18. 个税局端服务器处理结果查询不到三方协议,「实用」电子税务局中三方协议验证失败如何处理?来看攻略啦!...
  19. 【万字长文】Dubbo 入门总结 ,一款高性能的 Java RPC 框架
  20. 每周一篇 文献阅读—paper13

热门文章

  1. flash java 6,为Flash构建 Java WebService
  2. apache2.4.39 php,win7 配置AMP环境(apache2.4.39 + php7.1.28)
  3. python命令窗口中怎么导入numpy_科学网—windows7下python3.6如何导入numpy,Astropy - 杨涛只的博文...
  4. 新录制了一个Cytoscape整合富集分析和基因表达的网络图绘制
  5. Science:把这个人类特有基因转入猴子后,它们的大脑更大更强了,但科学家没敢让它出生...
  6. java 比较源文件_Beyond Compare比较Java源代码文件的操作流程
  7. macos server 恢复安装_如何通过 macOS 恢复功能重新安装 macOS
  8. 1.5编程基础之循环控制 37 雇佣兵
  9. php通过使用curl获取http或者https的响应信息的方式
  10. Intellij IDEA的java环境与安卓sdk配置实例教程