TCP协议三次握手四次挥手过程
2016-03-04 15:47
501 查看
TCP协议是传输控制协议,是以=一个面向连接,在运用此协议进行数据传输的时候会进行连接工作 ,(三次握手)当传输完毕后,双方都会通知彼此释放连接(四次挥手)。
TCP标志位:
SYN (建立联机)
ACK (确认)
PUSH (传送)
FIN (结束)
RST (重置)
URG (紧急)
Sequence number (顺序号码)
Acknowledge number (确认号码)
图解TCP 三次握手与挥手:
三次握手过程:
第一次握手:
hsot1发送一个TCP标志位,SYN =1 的数据包 ,并随机产生一个 seq number 的数据包发送给host2, 当host2接收到这个数据后,host2根据SYN=1 可知客户端(host1)想要建立连接。
第二次握手:host2 要对客户端(host1)请求进行确认,向host1 发送 ack number=(host1的 seq number+1),ACK = 1,SYN=1 并随机产生一个seq number 的数据包,这样就告诉host1 可以进行连接。
第三次握手:
host1收到后会检查ack number 是否正确 ,即第一次发送的seq number+1 以及码 ACK =1 ,若正确host1会发送ACK=1和 ack number =(host2 的seq+1),若主机B 收到确认seq number 值与ack=1 则连接建立成功。
一个完整的三次握手就是 请求-----应答------再次确认
四次挥手的过程:
由于TCP 连接是全双功的,因此每一个方向都必须进行单独关闭,这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向上的连接。
第一次挥手:
当传输的数据到达数据的尾部的时候,host1 向host2 发送FIN=1 标志位,可以理解成host1 向host2说,我这边数据已经传输完成,准备断开连接。
第二次挥手:
因为TCP的连接需要从两边关闭,当host2收到host1发送的FIN=1 标志位后,host2不会立刻向host1发送FIN=1的请求关闭信息,而是向host1发送一个ACK应答信息,表示 :你请求关闭请求我已经收到,但我可能还有数据没有完成,你在等下,等待数据除传输完毕后就会告诉你。
第三次挥手:
当host2 数据传输完后,向host1发送FIN=1,host1收到请求关闭连接的请求后,host1 就明白host2数据已经传输完成,可以断开连接。
第四次挥手:
Host1收到FIN=1 ,hos1还是怕有与网络不稳定的原因,怕host2不知道自己要断开连接,于是向host2发送ACK=1 ,确认信息进行确认,把自己设置为TIME_WITE状态并启动定时器,如果host2没有收到ACK ,host2端的定时器到达后,会要求host1重新发送ACK,当host2收到ACK后就会断开连接,当host1等待2mls(两倍报文最大生存时间)后没有收到重传请求,就知道host2已收到ACK,所以host1此时关闭自己。
在TCP 连接的建立与释放的过程中,host1 与host2 并没有严格客户端与服务器端之分,谁先发起请求谁就是客户端。
本篇博文主要参考http://zhaochj.blog.51cto.com/368705/1317226 感谢,感谢 感谢。
TCP标志位:
SYN (建立联机)
ACK (确认)
PUSH (传送)
FIN (结束)
RST (重置)
URG (紧急)
Sequence number (顺序号码)
Acknowledge number (确认号码)
图解TCP 三次握手与挥手:
三次握手过程:
第一次握手:
hsot1发送一个TCP标志位,SYN =1 的数据包 ,并随机产生一个 seq number 的数据包发送给host2, 当host2接收到这个数据后,host2根据SYN=1 可知客户端(host1)想要建立连接。
第二次握手:host2 要对客户端(host1)请求进行确认,向host1 发送 ack number=(host1的 seq number+1),ACK = 1,SYN=1 并随机产生一个seq number 的数据包,这样就告诉host1 可以进行连接。
第三次握手:
host1收到后会检查ack number 是否正确 ,即第一次发送的seq number+1 以及码 ACK =1 ,若正确host1会发送ACK=1和 ack number =(host2 的seq+1),若主机B 收到确认seq number 值与ack=1 则连接建立成功。
一个完整的三次握手就是 请求-----应答------再次确认
四次挥手的过程:
由于TCP 连接是全双功的,因此每一个方向都必须进行单独关闭,这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向上的连接。
第一次挥手:
当传输的数据到达数据的尾部的时候,host1 向host2 发送FIN=1 标志位,可以理解成host1 向host2说,我这边数据已经传输完成,准备断开连接。
第二次挥手:
因为TCP的连接需要从两边关闭,当host2收到host1发送的FIN=1 标志位后,host2不会立刻向host1发送FIN=1的请求关闭信息,而是向host1发送一个ACK应答信息,表示 :你请求关闭请求我已经收到,但我可能还有数据没有完成,你在等下,等待数据除传输完毕后就会告诉你。
第三次挥手:
当host2 数据传输完后,向host1发送FIN=1,host1收到请求关闭连接的请求后,host1 就明白host2数据已经传输完成,可以断开连接。
第四次挥手:
Host1收到FIN=1 ,hos1还是怕有与网络不稳定的原因,怕host2不知道自己要断开连接,于是向host2发送ACK=1 ,确认信息进行确认,把自己设置为TIME_WITE状态并启动定时器,如果host2没有收到ACK ,host2端的定时器到达后,会要求host1重新发送ACK,当host2收到ACK后就会断开连接,当host1等待2mls(两倍报文最大生存时间)后没有收到重传请求,就知道host2已收到ACK,所以host1此时关闭自己。
在TCP 连接的建立与释放的过程中,host1 与host2 并没有严格客户端与服务器端之分,谁先发起请求谁就是客户端。
本篇博文主要参考http://zhaochj.blog.51cto.com/368705/1317226 感谢,感谢 感谢。
相关文章推荐
- arm qt自启+网络自动获取ip地址
- centos---无线上网的电脑所安装的虚拟机网络设置
- C#实现http协议下载的断点续传
- The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or the jar
- 如何更高效地使用 OkHttp
- Android学习之网络请求库Volley
- 最详细的 HTTPS 科普扫盲帖
- iOS真实网络 监测 RealReachability
- 二进制流文流输出成zip
- 安卓多线程编程系列2:异步任务的使用之使用异步任务带有进度的横向滚动条下载网络图片
- 页面优化——减少HTTP请求数
- 检测TCP端口占用状态的函数
- Socket与TCP/UDP编程
- 10大常见的安全漏洞!你知道吗?
- 初学Shiro摘自开涛博客http://jinnianshilongnian.iteye.com/blog/2018936
- nginx使用ssl模块配置HTTPS支持
- 安卓多线程编程系列1:异步任务的使用之使用异步任务圆圈滚动条下载网络图片
- 来自HeroKu的HTTP API 设计指南(中文版)
- HttpRequest.AppRelativeCurrentExecutionFilePath 属性
- Netty的FastThreadLocal