TCP面向字节流和报文段的关系是什么

问题的关键在于TCP是有缓冲区,作为对比,UDP面向报文段是没有缓冲区的。

 TCP发送报文时,是将应用层数据写入TCP缓冲区中,然后由TCP协议来控制发送这里面的数据,而发送的状态是按字节流的方式发送的,跟应用层写下来的报文长度没有任何关系,所以说是流。

作为对比的UDP,它没有缓冲区,应用层写的报文数据会直接加包头交给网络层,由网络层负责分片,所以是面向报文段的。

而基于TCP Socket编程,比如客户端使用HTTP请求服务器的主页,服务器生成了自己的主页,一共300K byte数据,包括Header + Payload,为了更清晰说明问题,假设TCP最多一次只能发送1K byte的数据,服务器端程序首先要将300K数据按照顺序砍成300块 (Segment),按照从头到尾编号,1-300,然后调用send()函数300次,严格按照时间顺序,第一次调用发编号1,第二次调用发编号2,…第三百次调用发编号300,这个不复杂,只要编写一个循环程序(300次)即可,只要每次调用的返回值都OK,应用程序的任务就算完成了。

并且:

  1. 每一层都有pdu如应用层报文、tcp报文段、ip数据报、以太网帧。
  2. tcp字节流指在发送方把从应用层发下来的所有报文组成一个字节流(而非报文流),根据拥塞控制和流量控制(由os的协议栈实现)切割出tcp报文段下交给网络层;接收方把从网络层收到的所有tcp报文段组成一个字节流(而非数据报流),切割出报文上交给应用层。
  3. 因此会导致发送方5层交给4层的包和接收方4层交给5层的包的长度不同,即所谓的tcp粘包,接收方的应用层必须有能力解决这一信息不对等的问题。总结,两端5层的每个报文可能不同,4层的字节流和3层的ip数据报一定相同。

WRITE-BUG研发团队衷心希望【WRITE-BUG数字空间】可以给每位同学一个属于自己的秘密空间,同时祝愿大家在“公开圈子”世界里,遇见志同道合的伙伴们,因为我们与大家一样,都曾孤独前行着。



 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值