什么是三次握手与四次挥手
其中tcp和udp之间得区别就是一个基于连接,一个基于非连接。可以将tcp比作打电话,udp比作发信息。
三次握手
三次握手是建立连接得阶段:
首先客户端要和服务器端建立连接,客户端要向服务器端发送一包数据,询问一下是否能建立连接,这数据就称之为SYN
包。
如果服务器端同意建立连接会回复一个SYN+ACK
。
然后客户端收到之后会回复一个ACK包。之后就连接建立了
因为这个过程中互相发送了三包数据,所以称之为三次握手。
为什么不是两次握手
服务端回复完SYN+ACK之后就建立连接,这是为了防止因为已失效的请求报文。突然又传到服务器引起错误。假如说我们是两次握手:
首先客户端向服务端发送了一个SYN请求建立连接。
但是由于某种未知得原因,并没有到达服务端。在中间某个网络节点产生了滞留。为了建立连接客户端会重发SYN包。并且这次SYN包成功到达。
然后服务端回复SYN+ACk之后。建立起了连接
但是第一包数据阻塞得网络节点突然恢复。第一包SYN包又送达到了服务端。
这是服务端会认为是客户端又发起了一个新的连接。然后又给客户端发送了一个SYN+ACK包,然后就进入了等待数据状态。
然后这是服务端会认为这是两个连接。客户端认为是一个连接。造成了状态不一致。
如果在三次握手的情况下,服务端收不到最后的ACK包,自然不会认为第二次连接建立成功
所以三次握手就是为了解决网络信道不可靠的问题,为了在不可靠的信道上建立可靠的连接。
四次挥手
处于连接状态的客户端和服务端,都可以发起关闭连接请求。
此时需要4次挥手来进行关闭请求。假设客户端主动发起连接关闭请求。这时候客户端需要向服务端发送一包FIN包。表示要关闭连接。
然后自己进入终止等待1状态,这是第一次挥手
服务端收到SYN包,然后发送一包ACK包。表示自己进入了关闭等待状态。然后客户端进入关闭等待2状态,这是第二次挥手。
服务端此时还可以发送未发送的数据。而客户端还可以继续接收数据。待服务端发送完数据之后。发送一包FIN包。进入最后确认状态。这是第三次挥手。
客户端收到之后回复一个ACK包。然后进入超时等待状态。超时之后关闭连接。而服务端收到ACK包后立即关闭连接。
为什么客户端需要超时等待时间
这是保证对方已经收到ACK包。因为假设客户端发送完最后一包ACK包后就释放了连接。一旦ACK在网络中丢失。服务端将一直停留在最后确认状态。如果客户端发送最后一包ACK包后等待一段时间。这时服务端因为没有收到ACK包。服务端会重发FIN包。客户端会响应这个FIN包,重发ACK包并刷新超时时间。这个机制和三次握手一样,也是为了在不可靠的信道上建立可靠的连接。
tcp前两次握手可以携带数据吗
答案是不能的。
一般情况下,不管 TLS 握手次数如何,都得先经过 TCP 三次握手后才能进行。tcp的前两次握手是不能携带数据的。因为还没有建立可靠传输,所以不能携带数据。
还要这个题目:HTTPS 中 TLS 和 TCP 能同时握手吗?
是不能的,参考这个
https://xiaolincoding.com/network/3_tcp/tcp_tls.html#tcp-fast-open