起因
最近我的朋友A先生婚姻失败,又一直忙于加班应酬,为了缓解心里的压力,决定自己出发去大好河山看看,于是干脆辞职了,听说东W好水好,于是决定启程去了东W。
事先(三次握手)
第一次握手
A先生根据朋友的介绍下榻了一家服务优良的酒店,于是酒店的服务人员(服务端)向A先生(客户端)传递了一张美女卡片(SYN 报文),并用手指了指卡片上的号码(初始化序列号 ISN(x)),表示拨打这个号码就可以提供优质服务了。此时,A先生就打开了手机(客户端进入了SYN_Send 状态)。
SYN:连接请求/接收报文段
第二次握手
A先生拿着手机看了半天,没有下定决心怎么办,翻来翻去于是点开手机中的微博,心里感叹到外面的世道炮火纷飞。
于是拨打了卡片上的号码(客户端发送了SYN报文),电话那头传来了甜蜜的声音,表示收到了消息(服务端收到了SYN报文后,会将SYN 报文作为应答(SYN = 1)),一会将会让服务人员上门(指定自己的初始化序列号 ISN(y)),同时记录下客户的手机号码作为交易记录(将客户端的ISN+1作为确认号ack的值,表示已经收到了服务端的SYN报文),并且说明了一下服务事项和收费标准,希望用户准备好费用(服务端希望收到的下一个数据的第一个字节的序号是 x + 1),此时这边的服务中心就等待着收费(此时服务器处于 SYN_REVD 的状态)。
SYN-RECEIVED:在收到和发送一个连接请求后等待对连接请求的确认状态
第三次握手
A先生听到那边小姐姐的介绍后,然后告诉小姐姐请快速让服务人员过来,随后也谨慎的在收藏中记录下号码(客户端收到服务器的SYN后,反馈一个ACK报文,也是一样的将服务端的INS+1作为ack的值,表示已经收了服务端发送的SYN报文),然后跟服务小姐姐提了自己的兴趣爱好,并告诉自己加班那么久,钱包还是有MONEY的(希望收到的下一个数据的第一个字节的序号是 y + 1,并指明此时客户端的序列号 seq = x + 1(初始为 seq = x,所以第二个报文段要 +1)),并说明自己此时的状态已经的充满了活力(此时客户端处于 Establised 状态),服务端小姐姐收到了消息,也表示自己的服务人员也充满了活力。(服务器收到 ACK 报文之后,也处于 Establised 状态)
至此,双方建立起了TCP连接。
ESTABLISHED:代表一个打开的连接,数据可以传送给用户
seq:发送的第一个字节的序号
事后(四次挥手)
第一次挥手
A先生的接口传输完了数据,告诉服务人员自己结束了(客户端发送FIN报文,报文中指定一个序列号seq = u,然后停止再次发送数据,主动关闭TCP连接)。于是A先生就等待服务人员离开(此时客户端处于 FIN_WAIT-1 状态,等待服务端的确认)。
FIN-WAIT-1 : 等待远程TCP的连接中断请求,或先前的连接中断请求的确认
第二次挥手
服务人员听到了A先生说的话(服务端收到 FIN),不易察觉的说了声‘就这’,然后大声的说谢谢光临(发送ACK报文),记录下房间号码,然后出示了收款码(把客户端的序号值+1作为ACK报文得序列号值),随着一声支付宝到账XXX元(表明已经收到客户端的报文),服务人员就准备离开了(服务端处于 CLOSE_WAIT状态)。
CLOSE-WAIT : 等待从本地用户发来的连接中断请求
此时的 TCP 处于半关闭状态,客户端到服务端的连接释放。客户端收到服务端的确认后,进入FIN_WAIT2(终止等待 2)状态,等待服务端发出的连接释放报文段。
FIN-WAIT-2 : 从远程TCP等待连接中断请求
第三次挥手
服务人员觉得索然无味,准备离开了,就和A先生说,我准备走了,要是喜欢的话,记得我的工号,等待A先生得确定。(服务端也想断开连接了(没有要向客户端发出的数据),和客户端的第一次挥手一样,发送 FIN 报文,且指定一个序列号,服务端就进入了LAST_ACK状态,等待客户端确认。)。
LAST-ACK :等待原来发向远程TCP的连接中断请求的确认
第四次挥手
A先生听到服务人员话之后(客户端收到 FIN 之后),也告诉他要是喜欢自己的话,可以记下自己的手机号码直接联系(发送一个 ACK 报文作为应答(ack = w+1)),然后把工号记录下来保存到收藏中(服务端的序列值 +1 作为自己 ACK 报文的序号值),然后A先生就进入了贤者模式。(此时客户端处于 TIME_WAIT(时间等待)状态)
结局
警察大队捣毁某地下组织,A先生现在在忏悔椅上忏悔,各位看到的好兄弟V我50,我去将我的朋友A先生保释出来。