电工之家_电工基础知识学习网站
当前位置:电工之家 > 计算机 > 正文

tcp/ip建立连接的握手过程及原理

时间:2018-01-10 18:17 来源:电工之家 手机版

tcp/ip建立连接的握手过程及原理
1. TCP IP建立连接需要三次握手,断开连接需要四次挥手
在TCP层,有个FLAGS字段,这个字段有以下几个标识:SYN, FIN, ACK, PSH, RST, URG。
其中,对于我们日常的分析有用的就是前面的五个字段。
它们的含义是:
SYN表示建立连接,
FIN表示关闭连接,
ACK表示响应,
PSH表示有 DATA数据传输,
RST表示连接重置。
tcp/ip建立连接的握手过程及原理
握手的过程:
1. C端发送syn包(syn = j)到服务器,进入SYN_SEND状态,等待S端确认。
2. S端收到syn包,确认C端的syn(ack=j+1),向C端发送一个syn包(SYN+ACK),进入SYN_RECV状态。
3. C端收到SYN+ACK包,向服务器发送确认包ACK(ack=k+1),之后C和S进入ESTABLISHED状态,完成三次握手。
原理:
1. 解决"网络中存在延迟的重复分组"问题。
2. "为了防止已失效的链接请求报文段突然又传送到了服务端,产生错误"。
3. 保证链接的是双工的,可靠更多的是通过重传机制保证。
下面举实例说明:
假设主机1向主机2发送一个请求,这个请求在网络中游荡了好久,主机2还没有收到,这是主机1看见没有反应,放弃不再请求,而之前发送的这个请求才到达主机2:
这时主机2会发送一个确认请求给主机1,问问他是否存在这个请求,而主机1回应说我已经放弃这个请求了,所以回复REJECT(ACK = y)拒绝主机2,主机2知道后就不再理会
假设主机1向主机2发送的CR(seq = x)包以及DATA(seq = y, ACK = z)包都在网络中游荡了很久,而这时主机1已经和主机2建立了可靠的连接(seq = x + 100,ACK = y + 200)
这个时候,主机2收到的CR包将被忽略,(http://www.dgzj.com/ 电工之家)而DATA包也会因为序列号不对而被丢弃
假设主机1向主机2发送的CR(seq = x)包以及DATA(seq = y, ACK = z)包都在网络中游荡了很久,而这时主机1与主机2并没有建立连接
这个时候,主机2对与这个过期的CR包,将会发送确认给主机1问问是否真的是有这个包,而对于过期的DATA包,主机2会识别到序列号不对而忽略。
tcp/ip建立连接的握手过程及原理
tcp/ip建立连接的握手过程及原理
1. 先由客户端向服务器端发送一个FIN,请求关闭数据传输。
2. 当服务器接收到客户端的FIN时,向客户端发送一个ACK,其中ack的值等于FIN+SEQ。
3. 然后服务器向客户端发送一个FIN,告诉客户端应用程序关闭。
4. 当客户端收到服务器端的FIN是,回复一个ACK给服务器端。其中ack的值等于FIN+SEQ。
2. 为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
3. 为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态
答:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。