[TCP/IP] TCP与UDP不同的包处理方式
2017-09-08 18:26
274 查看
TCP与UDP不同的包处理方式
声明:本文转载自博客UDP发包的问题
举个例子:udp发送两次数据,第一次发送100字节, 第二字发送200字节,接收方一次recvfrom(1000),收到是100,还是200,还是300?
UDP是数据报文协议,是以数据包形式,所以每次可以接收100,200,在理想情况下,第一次是无论recvfrom多少都是接收到100,当然可能由于网络原因,第二个包先到的话,有可能是200了。对可能由于网络原因乱序,所以可能先收到200,所以自定义的udp协议包头里都要加上一个序列号,标识发送与收包对应。
TCP发包问题
举个例子:如果换成tcp, 第一次发送 100字节 ,第二次发送200字节,recv( 1000 )会接收到多少?
tcp是流协议,所以recv( 1000 ),会收到300 tcp自己处理好了重传,保证数据包的完整性
有分片的情况
举个例子:如果MTU是1500,使用UDP发送 2000,那么recvfrom(2000)是收到1500,还是2000?
还是接收2000,数据分片由ip层处理了,放到udp还是一个完整的包。接收到的包是由路由路径上最少的MTU来分片,注意转到UDP已经在是组装好的(组装出错的包会经crc校验出错而丢弃),是一个完整的数据包
TCP粘包
举个例子:由于TCP是流协议,对于一个socket的包,如发送 10AAAAABBBBB两次,由于网络原因第一次又分成两次发送, 10AAAAAB和BBBB,如果接包的时候先读取10(包长度)再读入后续数据,当接收得快,发送的慢时,就会出现先接收了 10AAAAAB,会解释错误 ,再接到到BBBB10AAAAABBBBB,也解释错误的情况。这就是TCP的粘包。
解决的办法TLV方式,先接收包头,在包头里指定包体长度来接收。设置包头包尾的检查位(如群空间0x2开头,0x3结束来检查一个包是否完整)。对于TCP来说:1)不存在丢包,错包,所以不会出现数据出错 2)如果包头检测错误,即为非法或者请求,直接重置即可
相关文章推荐
- TCP与UDP的不同接包处理方式
- TCP与UDP的不同接包处理方式
- TCP与UDP的不同接包处理方式
- TCP与UDP的不同接包处理方式
- 通过TCP/IP方式不间断的读取条码扫描结果,并高速处理,停机不断线
- Server端和Client端常见的通信方式TCP/IP和UDP
- TCP UDP 包处理方式
- boost asio处理tcp和udp的不同之处及要点
- TCP/IP具体解释--TCP/UDP优化设置总结& MTU的相关介绍
- 关于在Cisco路由器接口上应用ip tcp adjust-mss命令后,TCP头中出现选项的解释以及处理方法
- 用vlc搭建简单流媒体服务器(UDP和TCP方式)
- linux下端口扫描的实现(TCP connect、TCP SYN、TCP FIN、UDP四种方式)6 UDP扫描
- Ubuntu 使用NAT方式设置与主机不同IP网段的静态IP
- SOCKET,TCP/IP,UDP,HTTP,FTP总结
- ip、tcp、udp 报头结构体分析
- TCP/IP笔记(六)TCP与UDP
- TCP/IP之UDP协议
- TCP / IP (一)―― 传输层概述、UDP
- Cisco测试命令和TCP/IP连接故障处理
- python: tcp/ip学习、端口、udp和tcp的应用