wisecsj / wisecsj.github.io

Blog
Apache License 2.0
0 stars 0 forks source link

[计网] TCP连接管理 #22

Open wisecsj opened 5 years ago

wisecsj commented 5 years ago
  1. TCP连接的建立过程(三次握手)是怎样的?(A为客户端,B为服务端)

问题

  1. 为什么需要初始序号?
    • 防止有人伪造报文段干扰A、B之间的正常通信
    • 防止A、B新旧连接的数据报产生混淆(假想这么一种场景:A在与B建立连接-> 断开连接 -> 迅速又建立连接)

当一个新连接建立时,初始序列号( initial sequence number ISN)生成器会生成一个新的32位的 ISN。 这个生成器会用一个32位长的时钟,差不多4µs 增长一次,因此 ISN 会在大约 4小时多循环一次

  1. 为什么需要三次,而不是两次握手?

TCP是一个面向连接的、可靠的传输层协议。而tcp协议用来保证可靠、有序的根本是通过什么------序列号。所以说,握手的本质是为了同步A、B的初始序列号,那这样的话,本来是需要握手四次的。但是通过,将2、3步合并(在一个报文段里既确认了对方的序列号,又告知了自己的序列号),就可以提高效率简化为三次握手了。

wisecsj commented 5 years ago
  1. TCP是如何释放连接的(四次挥手)?

图片

问题

  1. TCP为什么第四次挥手要等待2MSL(A向B发起释放连接)

对于1,它的最大等待时间就是2MSL( Maximum Segment Life):去向ACK消息最大存活时间(MSL) + 来向FIN消息的最大存活时间(MSL).只有这样,A才能放心地释放连接占用的资源。

wisecsj commented 5 years ago

PS:当时写到四次挥手的时候,在想:为什么不把四次挥手中的第二步和第三步合并呢?B的ACK和FIN在一个报文段里都给发送了啊,还提高了效率。后来查了下,发现还真存在三次挥手!

tcp/ip 四次挥手?no, 还有三次挥手

大概就是说,当A向B发起FIN,B也确定再没有数据需要发送给A,那么它就可以将四次挥手简化为三次挥手了

wisecsj commented 3 years ago

如果挥手过程中前两次fin ack已完成。但是b不立即发fin给a,而是继续写数据,写完之后才发fin,结果如何?