在前几次的面试经历中,小猿多次被问到TCP的三次握手和四次挥手,所以来这里记录一下这个知识点。
一、建立连接---->TCP三次握手:
这里首先以一个例子,理清楚三次握手的思路:将客户端和服务端看成正在进行对话的两个人A,B。
第一次握手:C to S | 我申请建立连接。 |
第二次握手:S to C | 我已经收到请求,可以连接。 |
第三次握手:C to S | 我收到你的批准通知了。 |
这三次已经确保了双方信息没有丢失,已经满足建立连接的条件了。
下面以较专业性的语言来阐述三次握手:
第一次握手:C to S | 主机A发送syn到主机B,要求建立a到b的连接。此时主机为syn sent |
第二次握手:S to C | 主机B回复ack+syn,要求建立b到a的连接,主机B的状态为syn rcvd |
第三次握手:C to S | 主机A回复第二步syn的ack。主机A的状态 |
二、断开连接----->四次挥手
这里同样举一个例子,方便去理解四次挥手。
我和我女朋友打视频,打了很久,我想挂掉视频了。
我说:我没啥想说的了。
她说:我知道了。
但是,她又开始巴拉巴拉的讲,我不敢直接挂点,结束视频,因为她还有话在讲。直到她不想讲了,
最后,她说:我说完了。
我说:我知道了。这样才算通话结束。
这样简单的例子对我理解四次挥手很有帮助,下面通过稍微专业性的语言来阐述四次挥手。
1.主机A发送fin到主机B,请求关闭a到b的连接
2.主机B回复ack,主机B的状态置为close_wait
3.主机B发送fin到主机A,请求关闭b到a的连接
4.值即A回复ack(第三步的fin),状态置为time_wait
主机B接收到第四步的数据报,状态置为closed
主机A经过2MSL(超时等待时间)之后,状态置为closed