TCP三次握手/四次挥手
来源:互联网 发布:qq空间怎么推广淘宝 编辑:程序博客网 时间:2024/06/05 03:56
一,三次握手
TCP使用三次握手建立一个连接:
第一次握手:客户端发送SYN包至服务器,并进入SYN_SENT状态,等待服务器确认
第二次握手:服务器收到客户端的SYN包,发送一个ACK,同时发送自己的SYN,此时服务器进入SYN_RCVD状态
第三次握手:客户端接收到服务器发送的SYN+ACK后,进入ESTABLISHED状态,并发送服务器SYN包的确认ACK,服务器接收到客户端ACK后,进入ESTABLISHED状态
当客户端和服务器都进入ESTABLISHED状态后,客户端和服务器之间就可以开始双向传递数据了
二,四次挥手
TCP使用四次挥手关闭一个连接:
第一次挥手:主动关闭方发送一个FIN并进入FIN_WAIT1状态
第二次挥手:被动关闭方接收到主动关闭方发送的FIN并发送ACK,此时被动关闭方进入CLOSE_WAIT状态;主动关闭方收到被动关闭方的ACK后,进入FIN_WAIT2状态
第三次挥手:被动关闭方发送一个FIN并进入LAST_ACK状态
第四次挥手:主动关闭方收到被动关闭方发送的FIN并发送ACK,此时主动关闭方进入TIME_WAIT状态,经过2MSL时间后关闭连接;被动关闭方收到主动关闭方的ACK后,关闭连接
tcp四次挥手,由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。
由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
(1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送(报文段4)。
(2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。和SYN一样,一个FIN将占用一个序号。
(3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A(报文段6)。
(4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1(报文段7)
TCP采用四次挥手关闭连接如图所示为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?
这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。
0 0
- TCP三次握手/四次挥手
- TCP三次握手/四次挥手
- TCP三次握手/四次挥手
- TCP三次握手&四次挥手
- TCP三次握手/四次挥手
- TCP 三次握手 四次挥手
- TCP三次握手四次挥手
- TCP三次握手/四次挥手
- TCP三次握手/四次挥手
- TCP三次握手/四次挥手
- TCP三次握手/四次挥手
- TCP三次握手/四次挥手
- TCP三次握手/四次挥手
- TCP三次握手+四次挥手
- TCP三次握手/四次挥手
- TCP三次握手/四次挥手
- tcp 三次握手/四次挥手
- TCP 三次握手 四次挥手
- Android View 源码解析(二)
- 学习Python:WSGI_01_小程序
- 基于传输层差异的Socket分类
- Git链接到自己的Github(1)简单的开始
- React native学习第五章:Flexbox
- TCP三次握手/四次挥手
- 详解Navicat for mysql 安装教程
- tensorflow学习笔记--embedding_lookup()用法
- Android GPS定位(二)使用过程中的一点小坑
- 如何为sudo命令定义PATH环境变量
- 第四篇:观察者模式
- 裁剪linux系统服务
- SystemUI任务管理器缩略图获取流程
- foobar 更换皮肤