1. 网络分层结构
七层结构
** **TCP/IP 四层模型
2.TCP三次握手和四次挥手
建立一个 TCP 连接需要“三次握手”,缺一不可 :
- 一次握手:客户端发送带有 SYN(SEQ=x) 标志的数据包 -> 服务端,然后客户端进入 SYN_SEND 状态,等待服务器的确认;
- 二次握手:服务端发送带有 SYN+ACK(SEQ=y,ACK=x+1) 标志的数据包 –> 客户端,然后服务端进入 SYN_RECV 状态
- 三次握手:客户端发送带有 ACK(ACK=y+1) 标志的数据包 –> 服务端,然后客户端和服务器端都进入ESTABLISHED 状态,完成TCP三次握手。
3.为什么要三次握手?
- 第一次握手 :Client 什么都不能确认;Server 确认了对方发送正常,自己接收正常
- 第二次握手 :Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:对方发送正常,自己接收正常
- 第三次握手 :Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:自己发送、接收正常,对方发送、接收正常
4.四次握手
5.四次挥手
- 第一次挥手 :客户端发送一个 FIN(SEQ=X) 标志的数据包->服务端,用来关闭客户端到服务器的数据传送。然后,客户端进入 FIN-WAIT-1 状态。
- 第二次挥手 :服务器收到这个 FIN(SEQ=X) 标志的数据包,它发送一个 ACK (SEQ=X+1)标志的数据包->客户端 。然后,此时服务端进入CLOSE-WAIT状态,客户端进入FIN-WAIT-2状态。
- 第三次挥手 :服务端关闭与客户端的连接并发送一个 FIN (SEQ=y)标志的数据包->客户端请求关闭连接,然后,服务端进入LAST-ACK状态。
- 第四次挥手 :客户端发送 ACK (SEQ=y+1)标志的数据包->服务端并且进入TIME-WAIT状态,服务端在收到 ACK (SEQ=y+1)标志的数据包后进入 CLOSE 状态。此时,如果客户端等待 2MSL 后依然没有收到回复,就证明服务端已正常关闭,随后,客户端也可以关闭连接了。
6.第四次挥手为什么要等待2MSL?
具体来说,如果客户端发送了最后一次确认,但该确认在网络中丢失了,那么服务器端会超时并重新发送最后一次关闭请求。如果客户端已经关闭了连接,那么它无法响应这个请求,这样服务器端就会认为连接仍然存在,并继续发送数据。这种情况下,如果没有等待 2MSL,那么服务器端就可能将新连接的数据与旧连接的数据混淆,导致数据传输错误。因此,等待 2MSL 可以确保连接的可靠关闭。
如果最后一次确认没有丢失就是1MSL就可以关闭,所以两者取最大的就行。
7.为什么是四次挥手?
TCP是全双工通信,可以双向传输数据。任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后就完全关闭了 TCP 连接。
举个例子:A 和 B 打电话,通话即将结束后。
- 第一次挥手 : A 说“我没啥要说的了”
- 第二次挥手 :B 回答“我知道了”,但是 B 可能还会有要说的话,A 不能要求 B 跟着自己的节奏结束通话
- 第三次挥手 :于是 B 可能又巴拉巴拉说了一通,最后 B 说“我说完了”
- 第四次挥手 :A 回答“知道了”,这样通话才算结束。