3.tcp

TCP服务器类比成开一家店。
第1步:有一个开店的想法,socket创建
第2步:选一个店面,bind
第3步:剪彩,宣布营业,listen
第4步:自己看店或则请员工看店,accept(等待客户,阻塞)
第5步:服务客户,recv/send(客户需要思考,阻塞)
第6步:服务结束,close
流式服务的特点:
不确定传输的速度,可快可慢,根据网络情况自动调节。

比喻:发送数据就像水龙头放水。
因此发送一个大数据的时候,自动根据网络情况进行数据发送,一点一点发送。

最终体现在函数的调用上:
# length = send(data)
不一定就把data这个数据一次性完整的发送,length <= len(data),因此需要调用多次才能最终把data发送出去。
# data = recv(length)
不一定一次性就能获得length长度的数据,1 <= len(data) <= length,因此也需要多次调用才最终把length长度的数据收到。
注意:len(data) == 0表示对方close。


tcp为什么要等2分钟才最终关闭?
ack包可能丢失,发送通过重传机制再次发包,给接收端,使接受发再次ack发包

4次挥手:
一个连接总共有收(rx)和发(tx)2个方向,每个方向各自关闭。
关闭一个方向需要2个报文(FIN+ACK)。总共4个报文。

先关闭tx方向,为什么?因此tx方向我能自己控制。
被动等待rx方向关闭,为什么?因为rx方向由对方控制。


TCP理论基础:
任何一个报文发送之后都可能丢失。丢失我就重传。丢失几次我就重传几次。(比喻:上甘岭战役,一个苹果都送不到前线)

为什么需要等待2分钟才最终关闭?
因为最后一个ACK确认报文发送之后可能丢失,对端没收到这个报文就会重传FIN报文。
如果我不等待,那再也无法响应重传的FIN报文。导致对端无法顺利关闭连接。
因此需要等待一定时间,这个时间默认2分钟。
posted @ 2021-10-06 08:58  mingyepf  阅读(42)  评论(0)    收藏  举报