Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[计网] TCP连接管理 #22

Open
wisecsj opened this issue Mar 18, 2019 · 4 comments
Open

[计网] TCP连接管理 #22

wisecsj opened this issue Mar 18, 2019 · 4 comments

Comments

@wisecsj
Copy link
Owner

wisecsj commented Mar 18, 2019

No description provided.

@wisecsj wisecsj changed the title [计网] TCP [计网] TCP连接管理 Mar 18, 2019
@wisecsj
Copy link
Owner Author

wisecsj commented Mar 18, 2019

  1. TCP连接的建立过程(三次握手)是怎样的?(A为客户端,B为服务端)
  • A随机初生成一个序号n,作为报文段的序号字段;将报文段标记字段中的SYN标志置为1;发送给B

  • B收到A发送来的报文,检测到SYN标志为1,于是为该tcp连接分配缓存和变量(使得tcp易于受到SYN洪泛攻击),并向A发送允许连接的报文段:SYN位置为1,确认号置为n+1,生成数字m作为初始序号

  • A在收到B发来的确认报文后,也为该连接分配缓存和变量,并向B发送一个确认报文段:SYN位为1,序号为n+1,确认号为m+1,这一步中可以携带应用层数据

问题

  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
Copy link
Owner Author

wisecsj commented Mar 18, 2019

  1. TCP是如何释放连接的(四次挥手)?

图片

问题

  1. TCP为什么第四次挥手要等待2MSL(A向B发起释放连接)
  • 被动关闭的B无需任何wait time,直接释放资源
  • 如上图所示,A在第四步发送完ACK后,并无法确定B是否成功接收到了. 有如下两种情况:1)如果B没有收到自己的ACK,会超时重传FIN 2)如果B收到自己的ACK,也不会再发任何消息,包括ACK

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

@wisecsj
Copy link
Owner Author

wisecsj commented Mar 18, 2019

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

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

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

@wisecsj
Copy link
Owner Author

wisecsj commented Jan 15, 2021

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant