三次握手和四次挥手
我尝试用简单的话来解释三次握手和四次挥手,因为我也刚刚开始学,如有错误欢迎指正。
通俗版的解释
1.1三次握手
- 客服端向服务器发送请求
- 服务端收到请求,同意发送
- 客户端收到了服务端的答复,并表示知道了。
1.2四次挥手
- 客户端表示我想要关闭连接了
- 服务器表示知道了(但是这时候还没有关闭,因为可能服务端的信息还没传完)。
- 服务器表示我已经关闭了(这时候确认信息传完了)。
- 客户端表示知道了。
学术点的解释
2.1三次握手
- 客户端准备和服务端建立连接,客户端会先发送一个SYN(SYN = j)包到服务端,并进入SYN_SEND状态,等待服务端的确认。
- 服务端收到SYN包,会确认客户的SYN(ACK=j+1),同时自己也发送一个包(syn=k),即SYN+ACK包。此时服务器进入SYN_RECV状态。
- 客户端收到服务器的包(SYN+ACK),向服务器发送确认包ACK(ack=k+1)。
2.2四次挥手
1.客户端发送一个FIN.用来关闭客户端到服务端的数据传送。
2.服务端收到这个FIN. 它发回一个ACK,确认序号为收到的序号+1。和SYN一样,一个FIN将占用一个序号。
3.服务端关闭与客户端的连接,发送一个FIN给客户端。
4.客户端发回ACK报文确认,并将确认序号设置为序号加1。
- 其中SYN包代表的是一个请求,每次接受并确认后都会在这个SYN包上加一(即j+1)。
- ACK包代表的是一个确认包,所以在第二次握手时服务端会给客户端一个包含了SYN和ACK的包,因为服务端确认了客户端的请求(给了一个ACK包),并准备开始和客户端进行连接(给了一个SYN包)。
- FIN代表的是一个结束包,所以在第一次挥手时客户端给了服务端一个FIN包。