关键回答的点:
为什么TCP要握手? 握手为什么是三次?
为什么TCP要握手?
TCP有一个重要的特性,就是可靠性
怎么实现可靠性呢?
就是我现在发一个消息给到对方,
并不是我发完了就完了,
需要对方说我收到了,这样算真的发成功
只要它没有说,
我就要不停的重复的发,这就是可靠性。
通过可靠性可以反推出,
我们在发的过程中,怎么证明我这个消息发过去了,
我才能发下一个消息,
这样我们需要对每一个消息进行编号,
就是所谓的序列号:sequence (seq)
现在的客户端和服务器在同步的同时发消息
(同时发消息也叫双工),
就需要知道对方的序列号,否则的话,
就无法回复说我收到你哪一个消息的序列号,
是第一个第二个还是第三个消息。
单工:一个只能发送,另一个只能接受
这里的序列号不能从0开始,客户端和服务器会建立很多个连接,如果从0开始,这样就会产生混淆。
所以序列号会根据很多设置生成的,相对随机一些的。
在TCP在通信之前,就需要获得对方的序列号,怎么获得呢?就需要三次握手来获得。
当然在握手中不只是同步序列号,还做了其他事情,比如同步MSS(最大报文长度)、同步滑动窗口等
为什么是三次握手,不是两次握手呢?
为什么不是四次握手,客户端发送连接,服务端回复确认,服务端发送连接,客户端回复收到。
关闭连接是四次,为什么建立连接是三次??
关闭连接简称关连接
关连接的时候,它可以让连接处于半打开状态,继续传输消息,
也就是说服务器说我关连接了,客户端没有关连接的情况下,客户端还能继续长时间发送消息,
只要服务器没有强制关链接的情况下,在符合协议的情况下,它可以几天几个月的不关都是可以的。
在像Linux操作系统下,永远不会对半打开状态设置超时时间,可以无限的使用这个时间。
在建立连接的过程中,不允许出现,连接处于半打开状态,半建立的状态下,就开始传输消息。
这是TCP的规范所不允许的。
所以,服务器在回复ACK的时候,它就必须把它的seq发过来,这样就是三次握手。
|