TCP的三次握手和四次挥手
2016-04-21 13:22
281 查看
今天介绍下TCP协议的三次握手和四次挥手:
一:TCP三次握手:
1:第一次握手:原始状态为Closed。Client将SYN标志置1,随机产生序列号seq=J.发送数据包后,Client进入SYS_SENT状态。
2: 第二次握手:Server收到数据包后由标志位SYN=1知道Client建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
3:如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发 送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。
二:TCP四次挥手:
1:第一次挥手:原始Client状态为Established,Client发送FIN,Client
进入FIN_WAIT_1.
2:第二次挥手:Server收到数据报后,发送ACK,确认序列号为发送序列号加一(和SYN类似)。Server进入CLOSE_WAIT状态。客户端收到ACK后进行验证,无误后进入FIN_WAIT_2状态。
3:第三次挥手: Server发送FIN用来关闭与Client连接,Server进入
LAST_ACK状态。
4:第四次挥手:Client收到FIN后,然后发送ACK进入TIME_WAIT状态(等待2MSL),如果2MSL依然没有收到Server的重发的FIN则表明Server已经关闭,则主动关闭端也进行关闭,Server收到确认后进入Closed状态。
常见面试问题:
1:为什么建立连接是三次握手,而关闭连接却是四次挥手呢?
这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。
2:为什么主动关闭一端在TIME_WAIT状态后要2MSL?
因为网络是不可靠的,当TCP的一端发起主动关闭,在发出最后一个ACK包后,即第3次握手完成后发送了第四次握手的ACK包后就进入了TIME_WAIT状态,必须在此状态上停留两倍的MSL时间,等待2MSL时间主要目的是怕最后一个ACK包对方没收到,那么对方在超时后将重发第三次握手的FIN包,主动关闭端接到重发的FIN包后可以再发一个ACK应答包。
一:TCP三次握手:
过程详解:
1:第一次握手:原始状态为Closed。Client将SYN标志置1,随机产生序列号seq=J.发送数据包后,Client进入SYS_SENT状态。
2: 第二次握手:Server收到数据包后由标志位SYN=1知道Client建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
3:如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发 送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。
二:TCP四次挥手:
过程详解:
1:第一次挥手:原始Client状态为Established,Client发送FIN,Client
进入FIN_WAIT_1.
2:第二次挥手:Server收到数据报后,发送ACK,确认序列号为发送序列号加一(和SYN类似)。Server进入CLOSE_WAIT状态。客户端收到ACK后进行验证,无误后进入FIN_WAIT_2状态。
3:第三次挥手: Server发送FIN用来关闭与Client连接,Server进入
LAST_ACK状态。
4:第四次挥手:Client收到FIN后,然后发送ACK进入TIME_WAIT状态(等待2MSL),如果2MSL依然没有收到Server的重发的FIN则表明Server已经关闭,则主动关闭端也进行关闭,Server收到确认后进入Closed状态。
常见面试问题:
1:为什么建立连接是三次握手,而关闭连接却是四次挥手呢?
这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。
2:为什么主动关闭一端在TIME_WAIT状态后要2MSL?
因为网络是不可靠的,当TCP的一端发起主动关闭,在发出最后一个ACK包后,即第3次握手完成后发送了第四次握手的ACK包后就进入了TIME_WAIT状态,必须在此状态上停留两倍的MSL时间,等待2MSL时间主要目的是怕最后一个ACK包对方没收到,那么对方在超时后将重发第三次握手的FIN包,主动关闭端接到重发的FIN包后可以再发一个ACK应答包。
相关文章推荐
- OkHttp3详细介绍—— Android(一)
- 网络IO模型
- zabbix检测网络质量取代smokeping
- 基于Python的网络爬虫入门
- HTTP协议
- IOS学习之——NSURLConnection请求网络资源
- TCP连接状态详解
- 计算机网络(网络层)
- Android网络编程(六)OkHttp3用法全解析
- TCP连接的“三次握手”与“四次挥手”
- Java使用HttpURLConnection请求异常:java.net.SocketException: Software caused connection abort: recv failed
- OSI 七层协议参考模型 与 TCP/IP协议 实现网络模型
- 网络延时 201503-4
- 网络爬虫介绍
- 计算机网络面试题
- 前端进阶-让你升级的网络知识
- HTTP中Get与Post的区别
- HTTP 错误 500.19- Internal Server Error 错误解决方法
- php HttpOnly
- php tcpdf error