zoukankan      html  css  js  c++  java
  • TCP与UDP的不同接包处理方式

    转自:http://hi.baidu.com/libra1588/item/adf05d5c0cd146464eff20ee

    TCP与UDP的不同接包处理方式

    1.UDP发包的问题
    问:udp 发送两次数据,第一次 100字节 ,第二次200字节, 接包方一次recvfrom( 1000 ), 收到是 100,还是200,还是300?
    答:UDP是数据报文协议,是以数据包方式,所以每次可以接收100,200,在理想情况下,第一次是无论recvfrom多少都是接收到100。当然,可能由于网络原因,第二个包先到的话,有可能是200了。对可能会由于网络原因乱序,所以可能先收到200,所以自定义的udp协议包头里都要加上一个序列号,标识发送与收包对应

    2.TCP的发包问题
    问:同样如果换成tcp, 第一次发送 100字节 ,第二次发送200字节,recv( 1000 )会接收到多少?
    答:tcp是流协议,所以recv( 1000 ),会收到300 tcp自己处理好了重传,保证数据包的完整性

    3.有分片的情况下如下处理
    问:如果MTU是1500,使用UDP发送 2000,那么recvfrom(2000)是收到1500,还是2000?
    答: 还是接收2000,数据分片由ip层处理了,放到udp还是一个完整的包。接收到的包是由路由路径上最少的MTU来分片,注意转到UDP已经在是组装好的(组装出错的包会经crc校验出错而丢弃),是一个完整的数据包

    4.分片后的处理
    问:如果500那个片丢了怎么办?udp又没有重传
    答:udp里有个crc检验,如果包不完整就会丢弃,也不会通知是否接收成功,所以UDP是不可靠的传输协议,而且TCP不存在这个问题,有自己的重传机制。在内网来说,UDP基本不会有丢包,可靠性还是有保障。当然如果是要求有时序性和高可靠性,还是走TCP,不然就要自己提供重传和乱序处理( UDP内网发包处理量可以达 7w~10w/s )

    5.不同连接到同一个端口的包处理
    问:TCP
    A -> C 发100
    B -> C 发200
    AB同时同一端口
    C recv(1000) ,会收到多少?
    答:A与C是一个tcp连接,B与C又是另一个tcp连接, 所以不同socket,所以分开处理。每个socket有自己的接收缓冲和发送缓冲

    6.什么是TCP粘包

    由于TCP是流协议,对于一个socket的包,如发送 10AAAAABBBBB两次,由于网络原因第一次又分成两次发送, 10AAAAAB和BBBB,如果接包的时候先读取10(包长度)再读入后续数据,当接收得快,发送的慢时,就会出现先接收了 10AAAAAB,会解释错误 ,再接到到BBBB10AAAAABBBBB,也解释错误的情况。这就是TCP的粘包。
       解决的办法TLV方式,先接收包头,在包头里指定包体长度来接收。设置包头包尾的检查位(如群空间0x2开头,0x3结束来检查一个包是否完整)。对于TCP来说:1)不存在丢包,错包,所以不会出现数据出错 2)如果包头检测错误,即为非法或者请求,直接重置即可

    7.TCE怎么处理TCP包
    TCE的Tcp包处理:
    1.先按可用buf接收tcp包
    2.按照协议头检查,提出多个请求包
    3.如果检查失败,当前接收缓存就会重置( 位置从0开始 ) -> 
    1)由于tcp保证了包的完整性,不会出现错包
    2)如果是非法请求(对应的一个socket接收的数据包),会丢弃

  • 相关阅读:
    人为什么会生气 --- 答案是什么?
    职场中我们常犯的8个错误
    职场上最常见的20条错误,犯三条就够致命啦
    C语言,基于单向链表实现,变长动态数据缓冲区(线程安全) ---- 类似java的StringBuffer --- 亲测OK
    门限签名
    基于RSA的实用门限签名算法
    图解密码技术(第3版)-第4章
    各种加密算法比较
    密码那点事儿
    数字签名,我有疑问。
  • 原文地址:https://www.cnblogs.com/yuanxingdefan/p/3758362.html
Copyright © 2011-2022 走看看