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

[Network] TCP 3-Way Handshake & 4-times close #21

Open
zhonghuasheng opened this issue Jan 13, 2018 · 0 comments
Open

[Network] TCP 3-Way Handshake & 4-times close #21

zhonghuasheng opened this issue Jan 13, 2018 · 0 comments

Comments

@zhonghuasheng
Copy link
Owner

zhonghuasheng commented Jan 13, 2018

Information:

The Transmission Control Protocol(TCP) level of the TCP/IP transport protocol is connection-oriented. Connection-oriented means that, before any data can be transmitted, a reliable connection must be obtained and acknowledged.

Why need 3-Way Handshake?

这个问题的本质是信道不可靠,但是通信双方需要就某个问题达成一致。而要解决这个问题,无论在消息中包含什么信息,三次通信是理论最小值。所以三次握手不是TCP本身的要求,而是为了满足“在不可靠信道上进行可靠的传输信息”这个需求所导致的,也就是说信道不可靠,但是数据传输要可靠。三次握手达到了,那么后面你想接着握手也好,发数据也好,跟进行可靠信息传输的需求就没有关系了(三次握手之后没必要再握手)。So,如果信道是可靠的,即无论什么时候发出消息,对方一定能收到。

在谢希仁著《计算机网络》第四版中讲“三次握手”的目的是“为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误”。在另一部经典的《计算机网络》一书中讲“三次握手”的目的是为了解决“网络中存在延迟的重复分组”的问题。
在谢希仁著《计算机网络》书中同时举了一个例子,如下:

“已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。”

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