TCP建立与断开
三次握手三次握手
这里我用本机50319端口要求远端80做事, 能清楚的看到三次TCP的连接,你是否有疑问为什么是三次,不是两次,不是四次,实在这里是兼容安全与效率。

我们说TCP数据担保基于SYN与ACK的存在,实在这里明显看到要求号72(也便是80->50319的回答)是将SYN+ACK合为了一条数据返回,这里我想该当可以拆开吧,但是拆开摧残浪费蹂躏一次链接。以是这里建立连接须要三次。
再来说下三次握手:
小明:你好丽丽,在吗?我是小明 要求号65 50319---->SYN(Seq=0)------>80
小丽:你好小明,我在呀~~ 80->SYN+ACK(Seq=0,Ack=1)-->50319
小明:好的,那我们开始谈谈心吧!
!
50319->ACK(Seq=1, Ack=1)---->80
小丽:[爱慕] Established
小明:[送心] Established
四次挥手四次挥手
这里先解释一点,HTTP1.1之后能自带keep-alive属性,也便是说同一个客户真个http要求可以共用一个tcp连接,这样能防止tcp连接的摧残浪费蹂躏,截图解释
HTTP keep-alive
我们在测试的时候可以关闭这个keep-alive, 在要求的时候设置connetion:close就可以了,这样可以方便我们抓包验证。如果开着的话,当前的tcp连接就不会急速断开的截图解释
postman 关闭keep-alive
再说回四次挥手,我们看到要求号(212)80->56427发送FIN标识的,这代表80端要结束连接了,56427->80回答了ACK,要求号(214), 随后呢56247->80发送FIN标识要求号(215),代表自己也没有发送可以结束了,随后要求号(216)80->56247发送ACK确认,至此连接关闭。
.......
小明:好吧,我说完了!
80-----FIN----->56427
小丽:嗯嗯!
56427------ACK--->80
小丽:我也没话说了! 56427-----FIN----->80
小明:再见!
!
!
80-----ACK----->56427
小明:[堕泪]closed!!
小丽:[吐]closed!!
那为啥是四次挥手呢,如果是三次就像连接建立一样将末了56427->80的ACK+FIN合并为一条可以吗,当然不可以,这是由于TCP的连接双方能发也能接管,FIN的发出代表本方将关闭发送,而无法确认对方是否还有发送过来,估须要双方分别确定已关闭发送。
关于状态的解释
这里我们在做事端加入sleep操作限定连接的急速断开如代码
<?phpsleep(60);echo "hello World ";
我们不雅观察下链接状态的变革
做事端状态流转:
LISTEN->SYN-RECEIVED->ESTABLISHED->CLOSE-WAIT->LAST-ACK->CLOSED
客户端状态流转:
SYN-SENT->ESTABLISHED->FIN-WAIT1->FIN-WAIT2->TIME-WAIT->CLOSED
这里可能跟上面说的有差别,是由于我们这里是80主动关闭的连接。其余有些状态流转太快,我根本看不到啊[吐血]
状态我还须要再学习学习,里面的玩意太多了,下个分享,我们找一些例子来学习下,重点是TIME_WAIT、2SML啥的。
总结:
TCP的可靠性通过SYN+ACK实现TCP三次握手+四次挥手是有缘故原由的TCP的连接双方都有各自的状态流转要通过一些工具如netstat、tcpdump去实际查看网络连接状况