• 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接收的数据包),会丢弃

  • 相关阅读:
    对匿名函数的深入理解(彻底版)
    彻底理解js中this的指向,不必硬背。
    JavaScript中call,apply,bind方法的总结。
    再次讲解js中的回收机制是怎么一回事。
    关于在for循环中绑定事件打印变量i是最后一次。
    深入作用域之静态作用域与动态作用域
    理解js中的自由变量以及作用域的进阶
    使用WeihanLi.Npoi操作Excel
    基于 HtmlHelper 的自定义扩展Container
    JSON.Net 自定义Json序列化时间格式
  • 原文地址:https://www.cnblogs.com/yuanxingdefan/p/3758362.html
Copyright © 2020-2023  润新知