博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TCP/IP链接的三次握手与四次挥手
阅读量:6175 次
发布时间:2019-06-21

本文共 1556 字,大约阅读时间需要 5 分钟。



一.概述图:

建立TCP需要三次握手才能建立,而断开连接则需要四次握手。整个过程如下图所示:

先来看看如何建立连接的。


首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源。Client端接收到ACK报文后也向Server段发生ACK报文,并分配资源,这样TCP连接就建立了。

那如何断开连接呢?简单的过程如下:



二.注意点:

(1).标志位:

tcp标志位,有6种标示:

SYN(synchronous建立联机)

ACK(acknowledgement 确认)

PSH(push传送)

FIN(finish结束)

RST(reset重置)

URG(urgent紧急)

Sequence number(顺序号码)(自己的)

Acknowledge number(确认号码)(对方的)

具体作用请参考《计算机网络》谢希仁 第6版

(2).链接关闭方:中断连接端可以是Client端,也可以是Server端。

假设Client端发起中断连接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以你先发送ACK,"告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息"。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文,"告诉Client端,好了,我这边数据发完了,准备好关闭连接了"。Client端收到FIN报文后,"就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。“,Server端收到ACK后,"就知道可以断开连接了"。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。Ok,TCP连接就这样关闭了!



三.状态机:

整个过程Client端所经历的状态如下:


而Server端所经历的过程如下:转载请注明:


【注意】 在TIME_WAIT状态中,如果TCP client端最后一次发送的ACK丢失了,它将重新发送。TIME_WAIT状态中所需要的时间是依赖于实现方法的。典型的值为30秒、1分钟和2分钟。等待之后连接正式关闭,并且所有的资源(包括端口号)都被释放。

【问题1】为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文(SYN与ACK是在一个报文中的)。其中ACK报文是用来应答的,SYN报文是用来同 步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你 发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

【问题2】为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

答:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是如果网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。

本文转自 ye小灰灰  51CTO博客,原文链接:http://blog.51cto.com/10704527/1774642,如需转载请自行联系原作者
你可能感兴趣的文章
Docker系列之安装docker
查看>>
浅谈js中的继承
查看>>
c#获取逻辑硬盘信息
查看>>
Redhat6.5中MySQL数据库的搭建
查看>>
Mysql 5.7 编译安装(附有软件包)
查看>>
支付系统设计白皮书:支付系统的概念与架构
查看>>
LB集群小结
查看>>
从SHAttered事件谈安全
查看>>
Tower上手:当个性与理想遇到现实
查看>>
Java类加载器( 死磕9)
查看>>
使用TensorFlow 来实现一个简单的验证码识别过程
查看>>
telnet 命令使用
查看>>
C语言编程 两种方法打印一个菱形(渐入显示)
查看>>
怎么将电脑桌面上dwg格式图纸进行打开查看?
查看>>
如何用Excel设置合同到期提醒?
查看>>
Sql server 视图
查看>>
Qt笔记(8)自定义控件 三 让使用了自定义控件的工程运行起来
查看>>
大磁盘分区 parted
查看>>
Linux第七次作业
查看>>
outlook设置默认不下载附件
查看>>