最近给学员们复习接口测试的时候,有人找到一个面试的时候被问到的问题:“请说明TCP的三次握手。”然后有人笑着回答说:“就是问女朋友‘约吗’?”女朋友说:“约”,然后再说:“走吧”,这样的过程。看到这个回答,有点好像理解了,但又不知道理解什么了的感觉,所以今天我们就来聊一下TCP协议相关的内容吧,希望对大家以后做接口测试有所帮助。
不知道大家有没有寄大件物品的经历,比如寄一张床,小明同学肯定有(小明是谁?我也不知道)。有一天小明要给老家寄一张大床,于是去了物流公司,找到客服小MM咨询。小MM问:“你住哪,要把东西寄到哪里去?”于是小明赶紧说了自己的情况:“我住长沙五一新干线1430,寄到湖南省长沙县某某村222号”
小MM继续问:“这个村有很多个收快递的点,你要放到哪个点呢?”小明想了一下:“放到标有80的快递点,他们会有人来拿的。”
小MM说:“我现在还不知道那个地方是不是营业,我先帮你确定一下。”于是她叫了一个小弟说:“你给长沙县某某村去送个信,说我们要给他们发个快递,看他们还营业嘛或者有空没有”小弟听完就出去了。(不要问为什么不打电话,因为剧情需要)一个小时后,小弟回来了,说:“他们营业的,有空。”小MM说:“你再跑一趟,告诉他我们知道了,我们就要给他们送个物品过去了。”小弟又出去跑了一趟,小明觉得这个小MM是有点消遣人,让人家跑三趟,小MM做出解释:“我们要建立一个可靠的连接通道,不跑三趟怎么证明我们双方收件发件没有问题呢。我们要保证你的东西能寄到的话就一定要这么做,自己琢磨琢磨就知道了。”看到这里大家应该差不多知道TCP建立连接的三次握手是怎么回事了 。
图一:wireshark抓取的数据包
第一次握手:192.168.1.105发送位码syn=1数据包到119.75.219.45,119.75.219.45由SYN=1知道192.168.1.105要求建立联机;
第二次握手:119.75.219.45收到请求后要确认联机信息,向192.168.1.105发送ack , v发送syn=1,ack=1的确认包;
第三次握手:192.168.1.105收到后检查位码ack是否为1,若正确,192.168.1.105会再发ack=1,119.75.219.45收到后确认seq=seq 1,ack=1则连接建立成功。
图二、三次握手
小明的床经过很多次快递后,终于把所有的零部件都送出去了。这时小MM说:“都发过去了,可以跟那边不联系了。”于是把之前的小弟叫来说:“跟那边说一下,该发的包都发送完了。”过了一会,小弟回来说:“他们知道了,有事情会跟我们联系的。”过了一会,又有一个小弟过来说:“我们那边已经没有事情了,今天的事情结束了,我们会等待半小时,如果你们没有事情了,半个小时后,就不联系了。”小MM很开心说:“那你带个结束确认信过去,我们也等半小时,如果他们没有事情,今天就结束了。”小明说:“你们这结束连接也还挺麻烦的。”小MM说:“那是自然,万一有什么临时事情发生呢,这叫四次分手。”
TCP结束连接需要进行四次对话,双方确保没有数据要发送了,才能断开连接。
图三:wireshark抓取四次挥手的数据包
第一次挥手:客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。
第二次挥手:服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1,和SYN一样,一个FIN将占用一个序号。
第三次挥手:服务器B关闭与客户端A的连接,发送一个FIN给客户端A。
第四次挥手:客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。
图四、TCP数据传输的过程