【网络基础】03、TCP传输连接的建立与释放

简介:

一、TCP的传输连接管理的三个阶段 

IP协议的作用范围提供主机之间的逻辑通信

TCP和UDP协议的作用范围提供进程之间的逻辑通信

TCP (Transmission Control Protocol)   传输控制协议

UDP (User Datagram Protocol )      用户数据报协议

  当运输层采用面向连接的TCP协议时,尽管下面的网络是不可靠的(只提供尽最大努力服务),但这种逻辑通信信道就相当于一条全双工的可靠信道

当运输层采用无连接的UDP协议时,这种逻辑通信信道是一条不可靠信道


1、TCP连接的建立都是采用客户端/服务器方式

主动发起连接建立的应用进程叫做客户端(client)。

被动等待连接建立的应用进程叫做服务器(server)。

传输连接就有三个阶段,即:连接建立数据传送连接释放

传输连接的管理就是使传输连接的建立和释放都能正常地进行


2、连接建立过程中要解决以下三个问题

要使每一方能够确知对方的存在

要允许双方协商一些参数(如最大报文段长度,最大窗口大小,服务质量等)。

能够对运输实体资源(如缓存大小,连接表中的项目等)进行分配。


3、TCP连接的状态转移

wKiom1YecEfCaZ9KAAO3hp3xJ8c981.jpg


wKioL1hP4BjAKdisAAF6UIMMdeM284.png

4、TCP的三次握手建立传输连接

TCP的状态 (SYN, FIN, ACK, PSH, RST, URG)

wKiom1YeH-6yoxLxAAFBKkyzRK8136.jpg


在TCP层,有个FLAGS字段,这个字段有以下几个标识:

SYN  synchronous     建立联机 

ACK  acknowledgement  确认

PSH  push         传送 

FIN  finish        结束

RST  reset         重置

URG  urgent        紧急

Sequence number      顺序号码

acknowledge number    确认号码

其中,对于我们日常的分析有用的就是前面的五个字段。

第一次握手主机A向B发出连接请求报文段

  其首部中发送位码为:同步位为SYN=1,并随机产生序号seq=x,表明传送数据时的第一个数据字节的序号是x;并进入SYN_SEND状态,等待服务器确认; 


第二次握手:主机B收到连接请求报文段后(主机B由SYN=1知道,A要求建立联机),如同意,则发回确认;

  B在确认报文段中应使SYN=1,ACK=1,其确认号ack=x+1,自己选择的序号seq=y的包;此时服务器进入SYN_RECV状态;


第三次握手:主机A收到此报文段后B给出确认

  B在确认报文段中使用ACK=1,确认号ack=y+1,序号为seq=x+1

  

A的TCP通知上层应用进程,连接已经建立

B的TCP收到主机A的确认后,也通知其上层应用进程;TCP连接已经建立


5、TCP的4次挥手释放传输连接

wKioL1YeJI7jYw0VAAE5E7jA8oI033.jpg

第一次挥手:数据传输结束后,通信的双方都可释放连接 

  现在A的应用进程先向其TCP发出连接释放报文段,并停止再发送数据,主动关闭 TCP连接。

A把连接释放报文段首部的FIN = 1,其序号seq = u,等待B的确认。


第二次挥手:B发出确认

  确认报文段中,ACK=1,确认号ack = u +1,而这个报文段自己的序号 seq = v。

  TCP服务器进程通知高层应用进程,从A到B这个方向的连接就释放了,TCP连接处于半关闭状态;

B若发送数据,A仍要接收


第三次挥手:若B已经没有要向A发送的数据,其应用进程就通知TCP释放连接

  在确认报文段中 FIN=1,ACK= 1,确认号ack=u +1,自己的序号seq=w;


第四次挥手: A收到连接释放报文段后,必须发出确认

在确认报文段中 ACK=1,确认号ack=w+1,自己的序号 seq =u+1。 


二、常问问题

1、为什么建立连接协议是三次握手,而关闭连接却是四次挥手呢?

  这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的连接请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可能未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。

 

2、为什么TIME_WAIT状态还需要等2MSL后才能返回到CLOSED状态? 

MSL 报文最大生存时间,他是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃

  这是因为虽然双方都同意关闭连接了,而且挥手的4个报文也都协调和发送完毕,按理可以直接回到CLOSED状态(就好比从SYN_SEND状态到ESTABLISH状态那样);但是因为我们必须要假想网络是不可靠的,你无法保证你最后发送的ACK报文会一定被对方收到,因此对方处于LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT状态的作用就是用来重发可能丢失的ACK报文。


3、为什么不能用两次握手进行连接?

  我们知道,3次握手完成两个重要的功能,既要双方做好发送数据的准备工作(双方都知道彼此已准备好),也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认
  如果把三次握手改成仅需要两次握手,死锁是可能发生的。

作为例子,考虑计算机S和C之间的通信,假定C给S发送一个连接请求分组,S收到了这个分组,并发送了确认应答分组。按照两次握手的协定,S认为连接已经成功地建立了,可以开始发送数据分组。可是,C在S的应答分组在传输中被丢失的情况下,将不知道S是否已准备好,不知道S建立什么样的序列号,C甚至怀疑S是否收到自己的连接请求分组。在这种情况下,C认为连接还未建立成功,将忽略S发来的任何数据分组,只等待连接确认应答分组。而S在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。















本文转自xiexiaojun51CTO博客,原文链接: http://blog.51cto.com/xiexiaojun/1882424  ,如需转载请自行联系原作者
相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
2月前
|
运维 架构师 安全
二层协议透明传输:让跨域二层协议“无感穿越”多服务商网络
简介:本文详解二层协议透明传输技术,适用于企业网工、运营商及架构师,解决LLDP/LACP/BPDU跨运营商传输难题,实现端到端协议透传,提升网络韧性与运维效率。
|
9月前
|
编解码 异构计算
RT-DETR改进策略【Neck】| BiFPN:双向特征金字塔网络-跨尺度连接和加权特征融合
RT-DETR改进策略【Neck】| BiFPN:双向特征金字塔网络-跨尺度连接和加权特征融合
621 10
RT-DETR改进策略【Neck】| BiFPN:双向特征金字塔网络-跨尺度连接和加权特征融合
|
3月前
|
Windows
电脑显示有问题,电脑连接不上网络,电脑没声音,电脑链接不上打印机?驱动人生就能解决所有问题
电脑显示有问题,电脑连接不上网络,电脑没声音,电脑链接不上打印机?驱动人生就能解决所有问题
78 0
|
8月前
|
网络协议 物联网
VB6网络通信软件上位机开发,TCP网络通信,读写数据并处理,完整源码下载
本文介绍使用VB6开发网络通信上位机客户端程序,涵盖Winsock控件的引入与使用,包括连接服务端、发送数据(如通过`Winsock1.SendData`方法)及接收数据(利用`Winsock1_DataArrival`事件)。代码实现TCP网络通信,可读写并处理16进制数据,适用于自动化和工业控制领域。提供完整源码下载,适合学习VB6网络程序开发。 下载链接:[完整源码](http://xzios.cn:86/WJGL/DownLoadDetial?Id=20)
306 12
|
9月前
|
计算机视觉
RT-DETR改进策略【Neck】| GFPN 超越BiFPN 通过跳层连接和跨尺度连接改进RT-DETR颈部网络
RT-DETR改进策略【Neck】| GFPN 超越BiFPN 通过跳层连接和跨尺度连接改进RT-DETR颈部网络
297 12
RT-DETR改进策略【Neck】| GFPN 超越BiFPN 通过跳层连接和跨尺度连接改进RT-DETR颈部网络
|
9月前
|
计算机视觉
YOLOv11改进策略【Neck】| GFPN 超越BiFPN 通过跳层连接和跨尺度连接改进v11颈部网络
YOLOv11改进策略【Neck】| GFPN 超越BiFPN 通过跳层连接和跨尺度连接改进v11颈部网络
1891 10
YOLOv11改进策略【Neck】| GFPN 超越BiFPN 通过跳层连接和跨尺度连接改进v11颈部网络
|
9月前
|
编解码 异构计算
YOLOv11改进策略【Neck】| BiFPN:双向特征金字塔网络-跨尺度连接和加权特征融合
YOLOv11改进策略【Neck】| BiFPN:双向特征金字塔网络-跨尺度连接和加权特征融合
2295 7
YOLOv11改进策略【Neck】| BiFPN:双向特征金字塔网络-跨尺度连接和加权特征融合
|
8月前
|
安全 网络协议 网络安全
当虚拟机出现网络连接问题时,应该先检查Hyper-V的网卡连接配置
当虚拟机出现网络连接问题时,应首先检查Hyper-V的网卡配置。具体步骤包括:确认虚拟机运行状态、检查虚拟交换机类型和物理网卡连接、确保虚拟机网络适配器正确连接到虚拟交换机,并验证网络配置(IP地址等)。常见问题如虚拟交换机配置错误、网络适配器未连接或防火墙阻止连接,可通过重新配置或调整设置解决。必要时重启虚拟机和宿主机,查看事件日志或联系技术支持以进一步排查问题。
|
11月前
|
负载均衡 网络协议 算法
不为人知的网络编程(十九):能Ping通,TCP就一定能连接和通信吗?
这网络层就像搭积木一样,上层协议都是基于下层协议搭出来的。不管是ping(用了ICMP协议)还是tcp本质上都是基于网络层IP协议的数据包,而到了物理层,都是二进制01串,都走网卡发出去了。 如果网络环境没发生变化,目的地又一样,那按道理说他们走的网络路径应该是一样的,什么情况下会不同呢? 我们就从路由这个话题聊起吧。
268 4
不为人知的网络编程(十九):能Ping通,TCP就一定能连接和通信吗?
|
9月前
|
网络协议 测试技术 Linux
Golang 实现轻量、快速的基于 Reactor 模式的非阻塞 TCP 网络库
gev 是一个基于 epoll 和 kqueue 实现的高性能事件循环库,适用于 Linux 和 macOS(Windows 暂不支持)。它支持多核多线程、动态扩容的 Ring Buffer 读写缓冲区、异步读写和 SO_REUSEPORT 端口重用。gev 使用少量 goroutine,监听连接并处理读写事件。性能测试显示其在不同配置下表现优异。安装命令:`go get -u github.com/Allenxuxu/gev`。
192 0

热门文章

最新文章