TCP 协议下 socket 有可能丢包吗?

Posted 车小胖谈网络

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TCP 协议下 socket 有可能丢包吗?相关的知识,希望对你有一定的参考价值。

1876年法国赠送美国政府自由女神雕塑,女神体积很庞大,法国政府委托快递公司运输,先拆分成300片打包,编号为1-300,需要三艘船运输,第一艘运1-100片,以此类推。



场景一:三艘船按序到达
美国政府每天派人去快递公司查件(Receive函数),第一艘船到达,快递公司将1-100片交付美国政府,以此类推,收完300片,可以完整重构自由女神,传输任务完成。

TCP 协议下 socket 有可能丢包吗?


场景二:三艘船乱序到达



由于第一艘船动力有点问题,结果最后达到,船到达顺序为2、3、1,假设委托人也是天天去查件,在第一艘船没有到达之前,快递公司会假装什么都没有发生,直到第一艘船到达,然后按照船编号顺序将货物提交给委托人,与场景一相比,会有大一些的延迟。


场景三:有一艘船掉大西洋里了


浩瀚的大西洋,波澜壮阔,掉一艘船到海里,天知,海知,你我他不知,第一艘、第三船都到达了,可是第二艘船却迟迟未到,一周过去了,一个月过去了,还是杳无音讯,快递公司美国分公司意识到出事了,他们做了两方面工作:

1)将第一艘船的货物提交给美国政府(在刚接收到就可以提交给美国政府)
2)派人通知法国总公司将第二艘船的货物再建造一份,雕塑编号为101-200,重新运输

半个月之后,第二艘运输船到达了,然后提交给美国政府,最后是第三艘船的货物。

与场景一、二相比,传输的延迟最大。

上文的故事,法国政府代表客户端,负责发送大块数据给服务器端;美国政府是服务器端,负责接收大块数据;快递公司代表TCP,负责货物的按序提交给客户(应用程序),负责乱序的重新排序、以及丢包的超时重传。


总结一下
TCP接收方知道数据(字节流)的起始序列号,怎么知道的?同步握手里有对方的ISN(Initial Sequence Number),所以会将接收到的数据按字节排好序(1,2,3…N)放入buffer,应用程序会通过receive函数来取走,至于取走多少,取决于buffer有多少数据,以及receive函数的入口长度字段。然后应用程序对拿到的字节流进行解释、分段。

以上是关于TCP 协议下 socket 有可能丢包吗?的主要内容,如果未能解决你的问题,请参考以下文章

TCP在高时延和丢包的网络中传输效率差;tcp协议

UDP之socket通讯

基于套接字通信(tcp)

模块socket使用

3.9.2.TCP协议的学习1

102.tcp实现多线程连接与群聊