博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TCP的3次握手/4次握手
阅读量:5251 次
发布时间:2019-06-14

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

三次握手:

TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接,如图下所示:

 

(1) 第一次握手:建立连接时,客户端A发送SYN包(SYN=j)到服务器B,并进入SYN_SEND状态,等待服务器B确认。

 (2) 第二次握手:服务器B收到SYN包,必须确认客户A的SYN(ACK=j+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器B进入SYN_RECV状态。

 (3) 第三次握手:客户端A收到服务器B的SYN+ACK包,向服务器B发送确认包ACK(ACK=k+1),此包发送完毕,客户端A和服务器B进入ESTABLISHED状态,完成三次握手。

完成三次握手,客户端与服务器开始传送数据。

 

服务端的LISTEN状态下的SOCKET当收到SYN报文的连接请求后,它可以把ACKSYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可能未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。换句话说,TCP的连接的拆除需要发送四个包,因此称为四次挥手(four-way handshake)。在socket编程中,客户端执行connect()时,将触发三次握手建立连接,而客户端或服务器均可主动发起挥手动作以结束连接,在socket编程中,任何一方执行close()操作即可产生挥手操作。

 

注意:

1.默认情况下(不改变socket选项),当你调用close( or closesocket,以下说close不再重复)时,如果发送缓冲中还有数据,TCP会继续把数据发送完。

2. 发送了FIN只是表示这端不能继续发送数据(应用层不能再调用send发送),但是还可以接收数据。

3. 通常在socket编程中,在最简单的阻塞模型中,当你调用recv时,如果返回0,则表示对端关闭。在这个时候通常我们的做法就是也调用close,那么TCP层就发送FIN,继续完成四次握手。如果我们不调用close,那么对端就会处于FIN_WAIT_2状态,而本端则会处于CLOSE_WAIT状态。

4. 在很多时候,TCP连接的断开都会由TCP层自动进行,例如CTRL+C终止正在的程序,TCP连接依然会正常关闭

 

四次握手:

 

 

综上可知,由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

(1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。

(2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1,和SYN一样,一个FIN将占用一个序号。

(3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A。

(4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。

转载于:https://www.cnblogs.com/kunhu/p/3618920.html

你可能感兴趣的文章
$_POST和$GLOBALS['HTTP_RAW_POST_DATA'] 的区别
查看>>
类和结构
查看>>
遍历文件夹下所有dll的类
查看>>
CSS3选择器(二)之属性选择器
查看>>
关于浏览器行为和服务器行为下的重定向和转发再次理解
查看>>
c语言枚举型常量
查看>>
spring-mybatis整合项目 异常处理2
查看>>
linux命令:set 指定行,直接替换并修改文件
查看>>
异步 携程 网络小爬虫
查看>>
缺少动态连接库.so--cannot open shared object file: No such file or directory
查看>>
用 Django 管理现有数据库
查看>>
LeetCode -- Word Break
查看>>
HTML 5的革新之一:语义化标签一节元素标签。
查看>>
雷达极化论文
查看>>
error C2248: 'QObject::QObject' : cannot access private member declared in class 'QObject'
查看>>
c#扩展方法
查看>>
Xcode no visible @interface for XXX declares
查看>>
Break Standard Weight (ZOJ 3706)
查看>>
OI实用工具 持续更新ing
查看>>
Android开发 第一篇
查看>>