一,使用plantuml制图
@startuml
Client -> Server: SYN,J
Server -> Client: SYN,X;ACK,J+1
Client -> Server: ACK,X+1
Client -> Server: FIN
Server -> Client: ACK
Server -> Client: FIN
Client -> Server: ACK
@enduml
java -jar plantuml.jar sequenceDiagram.txt
建立链接过程:
1,客户端发送 SYN 报文给服务端请求建立链接,进入SYN-SENT状态
2,服务器发送 SYN+ACK报文给客户端表示同意建立链接,进入SYN_RECV状态
3,客户端发送 ACK 报文给服务端表示收到同意链接 ,进入已链接状态
问题:为何是3次而不是2次握手?
客户端发送第一个报文,超时后,发送第二个syn报文,第二个到达了服务端,服务端发送确认报文且建立链接,传完数据之后释放链接,这之后收到了客户端发送的第一个报文,发送确认报文且建立链接,但此时客户端收到了也没理会,会浪费服务器资源
释放链接过程:
1,客户端发送FIN报文,进入FIN-1
2,服务端收到返回ACK报文,进入Close-Wait状态
3,服务端发送 FIN报文
4,客户端发送ACK报文
为何是4步挥手?
因为 ack不能跟fin一起组合发送报文,服务器收到FIN报文时,可能服务端还有数据没发送完,所以先发送ACK报文表示知道了,等发送完数据之后再发送FIN报文。