4-10:TCP协议之面向字节流和粘包问题
文章目录
- 一:面向字节流
- 二:粘包(应用层数据包)问题
- 三:TCP异常情况
一:面向字节流
经过前面的叙述,现在我们对TCP面向字节流的理解就更加深刻了。
创建一个TCP的socket,就会在内核中创建一个发送缓冲区和一个接受缓冲区。主要有以下这么几点:
- 调用write接口,数据会先写入发送缓冲区
- 如果发送的字节数太长,会被拆分成多个TCP的数据包发出
- 如果发送的字节数太短,会在缓冲区内等待,等待缓冲区长度差不多了,或者在其他合适的时机将其发送出去
- 接受数据的时候,数据也是从网卡驱动程序到达内核的接受缓冲区的
- 应用层可以调用read从接受缓冲区中拿取数据
TCP的一个连接,既有发送缓冲区也有接受缓冲区,所以对于这一个连接,既可以读取数据也可以写入数据——全双工
二:粘包(应用层数据包)问题
TCP协议中是没有同UDP一样的“报文长度”的字段,因此站在应用层角度来看,看到的只是一串连续的字节数,因此应用程序就无法分清数据的界限,有可能会产生粘包问题。
如果避免呢?关键就在于:应用层的协议应该要明确两个包的边界
- 对于定长的包,保证每次都按固定大小读取即可。例如Request,那么就从缓冲区从头开始按照sizeof(Request)大小依次读取即可
- 对于变长的包,可以在包头的位置,约定一个包总长度的字段,从而就知道了包的结束位置(比如HTTP协议中conten-length);同时还可以在包与包之前使用特殊的分隔符(比如HTTP协议中的空行)
三:TCP异常情况
我们都知道运行中的程序会由于各种各样的原因崩溃,对于非网络程序来说并没有什么大的问题,不过对于网络应用程序由于它还涉及连接问题,所以它不能简单单的拍屁股走人
所以在客户端应用程序崩溃或死亡时,接收端会认为连接还在,一旦接收端有写入操作,接收端发现连接不在了,就会进行reset。即使没有写入操作,TCP自己也会内置一个保活定时器即使询问对方是否还在,如果不在就会释放连接。最经典的就是QQ了。
4-10:TCP协议之面向字节流和粘包问题相关推荐
- Linux_网络_传输层协议 TCP通信滑动窗口(快重传),流量控制,拥塞控制(慢启动),延迟应答,捎带应答,TCP常见问题(字节流,粘包),Listen半连接队列
紧跟Linux_网络_传输层协议 TCP/UDP继续补充 文章目录 1. TCP通信时滑动窗口(效率) 2. 流量控制(可靠性) 3. 拥塞控制(慢启动) 4. 延迟应答 5. 捎带应答(提高通信效率 ...
- 以太网 TCP协议交互过程中出现丢包时的解决机制,超时重传、快速重传、SACK与DSACK
2.7.3 以太网 TCP协议(TCP交互过程中出现丢包时的解决机制-列举部分) 参考:CSDN_TCP的重传机制_博主.Pr Young,对描述进行了整理与结合个人的理解进行编写. 一.超时重传机制 ...
- TCP、UDP、TCP三次握手与四次挥手、TCP如何保证可靠传输、TCP异常分析、拆包和粘包等
4.OSI模型 4.1.OSI七层模型 4.2.七层模型功能 物理层:利用传输介质为数据链路层提供物理连接,实现比特流的透明传输,如网线:网卡标准. 数据链路层:接收来自物理层的位流形式的数据 ...
- python socket.socket()函数 套接字详解及TCP、UDP程序示例(粘包等)
文章目录 socket的定义 套接字的工作流程 socket函数使用 socket函数用法 服务端套接字函数 客户端套接字函数 公共用途的套接字函数 面向文件的套接字方法 打电话的流程演示 服务端.p ...
- Python之路(第三十一篇) 网络编程:简单的tcp套接字通信、粘包现象
一.简单的tcp套接字通信 套接字通信的一般流程 服务端 server = socket() #创建服务器套接字server.bind() #把地址绑定到套接字,网络地址加端口server.liste ...
- 网络编程 socket模块 tcp协议 udp协议
网络基础相关知识 , socket模块 , tcp协议通信代码 , tcp和udp编码流程 网络基础相关知识(1) 架构 C / S 架构: client 客户端 和 server 服务器端 优势:能 ...
- TCP协议与UDP协议详解
TCP协议 TCP,即Transmission Control Protocol,传输控制协议.人如其名,要对数据的传输进行一个详细的控制. TCP协议的特点:有连接,可靠传输,面向字节流,全双工 有 ...
- 计算机网络中TCP连接管理,计算机网络 TCP协议
TCP:面向连接的运输 TCP协议是面向连接的协议,把连接作为最基本的抽象.每一条TCP连接唯一的被通信两端的两个端点所确定.TCP协议是点对点,而不是点对多点.端点又被称为套接字,TCP协议规定,I ...
- 为什么tcp不采用停等协议_为什么 TCP 协议有粘包问题
来自公众号:真没什么逻辑 链接:https://draveness.me/whys-the-design-tcp-message-frame/ 为什么这么设计(Why's THE Design)是一系 ...
最新文章
- SLAM中的卡尔曼滤波:究竟滤了谁?
- Linux中Eclipse开发android的配置问题
- 别再打字聊bug了,GitHub支持“视频留言”!手机也可以的那种
- MATLAB中使用streamline函数绘制正负点电荷及它们构成的电偶极子的电场线分布图
- 公钥密码--Diffie-Hellman密钥协商算法
- .NET核心正则类详解
- matlab晶闸管整流电路,采用Matlab/Simulink对三相桥式全控整流电路的仿真分析
- Tomcat4/5连接池的设置及简单应用示例
- pict 手册_zbrush中文手册.pdf
- 聊聊redo log是什么?
- Hibernate一对一主键单向关联
- 天气查询接口演示示例
- python 菜鸟-Python 列表(List)
- movie制作的电影站wordpress视频主题
- 大咖直播 | 大连理工赵纪军教授:人工智能算法用于团簇研究和势函数拟合
- Windows Server 2008的介绍及其与Windows Server 2008 R2的区别
- OpenVR学习01 成功打开了VR设备
- 个税局端服务器处理结果查询不到三方协议,「实用」电子税务局中三方协议验证失败如何处理?来看攻略啦!...
- 【万字长文】Dubbo 入门总结 ,一款高性能的 Java RPC 框架
- 每周一篇 文献阅读—paper13
热门文章
- flash java 6,为Flash构建 Java WebService
- apache2.4.39 php,win7 配置AMP环境(apache2.4.39 + php7.1.28)
- python命令窗口中怎么导入numpy_科学网—windows7下python3.6如何导入numpy,Astropy - 杨涛只的博文...
- 新录制了一个Cytoscape整合富集分析和基因表达的网络图绘制
- Science:把这个人类特有基因转入猴子后,它们的大脑更大更强了,但科学家没敢让它出生...
- java 比较源文件_Beyond Compare比较Java源代码文件的操作流程
- macos server 恢复安装_如何通过 macOS 恢复功能重新安装 macOS
- 1.5编程基础之循环控制 37 雇佣兵
- php通过使用curl获取http或者https的响应信息的方式
- Intellij IDEA的java环境与安卓sdk配置实例教程