TCP连接的三报文握手和四报文挥手过程详解

在介绍TCP建立的过程之前,我们得需要有一些前置知识,才能充分理解TCP连接的完整过程。

一、OSI参考模型与因特网模型(TCP/IP模型)

OSI是一个分层网络体系模型,主要是为了方便两个不同的网络进行通信。它包括7个七个层次。其中,每一个层次又定义了适用于本层次的协议,以完成这个层次在整个网络模型的功能。
OSI参考模型的7层有下到上分别为物理层、数据链路层、网络层传输层、会话层、表示层和应用层。其中,下四层主要负责数据的传输,上三层主要面向应用程序的。
一般来说,OSI七层模型下面两的功能是通过硬件和软件向结合来实现的,上五层是一般只通过软件就能实现。

因特网模型在OSI参考模型之前就已经有了。因特网模型中传输层控制协议(TCP,Transmission Conrol Protocol)互联网协议(IP,Internet Protocol)的广泛使用。因此,因特网模型也被称作TCP/IP模型
因特网模型和OSI参考模型类似,但是更简洁。
我们可以知道,OSI参考模型一共有七层,而因特网参考模型只有四层。
很明显,TCP/IP模型比OSI少了会话层与表示层。TCP/IP模型中的应用层几乎包括了全部的高层协议,例如邮局协议(POP,Post Of Protocol)、文件传输协议(FTP,File TransportProtocol)、虚拟终端协议等等。TCP/IP模型与OSI参考模型中都有传输层和网络层,它们的功能也几乎一样。
TCP/IP模型中的网络接口层,在TCP/IP模型中并没有具体针对这一层给出详细的描述,只是指出了必须使用某个协议与网络进行连接,以便网络之间可以传送分组。
传输控制协议(TCP)是Internet协议栈的主要协议之一。它起源于最初的网络实现中,它补充了互联网协议(Internet Protocol,IP)。因此,通常把二者一起称做TCP/IP。
TCP提供可靠的,有序的,具有检错功能的数据传输。主要的互联网应用传输依赖于TCP,如万维网,电子邮件,远程管理和文件传输。

二、TCP报文结构

可以参考以下文章区分TCP和UDP协议的区别:
https://blog.csdn.net/ELSA001/article/details/124891246?spm=1001.2014.3001.5501
TCP提供的是一种可靠的数据传输。它保证接收到的所有字节与发送的字节相同,并且按接收到字节的顺序和发送字节的顺序相同。由于网络传输的不可靠性,TCP采用确认和重发技术等技术来保证传输的可靠性。这一技术要求接收端接收到正确的数据包要向发送端进行确认。发送端发送数据包后会保持一个重发计时器,如果发送端在重发计时器超时后还没有收到接收端发来的确认则重传为确认的数据包。
TCP是传输层协议,TCP数据包是封装在IP报文之中的。TCP数据包分TCP数据部分和TCP数据包头部。TCP数据部分用来装载应用层交下来的数据。TCP头部在不计算可选字段的情况下为20个字节。
在这里插入图片描述
源端口号:2个字节,用来表明发送端应用程序使用的端口号。目的端口号:2个字节,用来表明接收程序使用的端口号。
序号:4个字节,用来表明TCP发送端到TCP接收端数据字节流。序号表示这一个数据在报文段中的第一个字节。
确认序号:4个字节,用来表明TCP这一端期望收到另一端发来数据的字节的序号。
首部长度:4位,用来表明传输TCP的长度。
保留字段:目前尚未使用的字段,现全部置О。
URG:1位,紧急位。TCP中有一种方式用来方便TCP两端传输紧急的数据。该为置1时,表明紧急字段有效。收到URG置1的数据报文时应该优先传送。
ACK:1位,确认位。当ACK为置1时,表示这一帧为确认帧。
PSH:1位,推送位。当PSH置1时,表明TCP在收到这个报文是应该尽快的交给应用层,而不是等缓存空间满了再交给应用层。
RST:1位,复位位。当RST位置1是,表明TCP在收到这个报文时应该先释放这个TCP连接再重新建立。
SYN:1位,同步位。当SYN位置1时,表明这个报文时一个请求连接报文。
FIN:1位,终止位。当FIN位置1时,表明发送此报文段的发送端数据已经发送完了。
窗口大小:2个字节。用来告诉对端己端能够接受的窗口大小。
校验和:2个字节。用来校验收到的数据报文是否正确。
紧急指针:2个字节。用来指出这个报文段中有多少字节是紧急数据。
可选字段:长度可变。这个字段的长度由数据偏移字段决定。可选字段中最多包含三种字段:可选字段类型(1字节)、可选字段长度(1字节)、可选字段数据(变量)。可选字段指示选项的类型,并且是惟一必须的字段。
数据:长度可变,应用层交下来的数据。

三、TCP三报文握手

开始,服务端TCP处于LISTEN状态等待客户端发送连接请求。
客户端发送一个SYN位为置1的请求报文,表示客户端向服务端请求建立连接,此时假设客户端的请求报文序列号为x,则为:SYN=1,seq=x,然后等待客户端的响应。服务端在收到客户端的连接请求后,如果同意建立连接,就要向客户端发送确认报文。
确认报文中的ACK为和SYN位都置1,并且确认序列号位x+1。并且还要确认报文还要为自己选择一个序列号,假设为y,则确认数据报文为: SYN=1,ACK=1,seq=y,ack=x+1
客户端收到服务端发来的确认报文之后,还要对服务端的确认报文进行确认。客户端的确认报文的ACK为置1,确认号位 y+1,而客户端的序列号为x+1,则客户端的确认报文为:ACK=1,seq=x+1,ack=y+1。这时,TCP连接就建立好了,客户端进入了ESTABLISHED (已建立连接)的状态。而服务端在收到客户端发来的确认报文后也将进入ESTABLISHED(已建立连接)的状态。
在这里插入图片描述

建立完连接之后就可以传输数据了。

四、TCP三次握手过程以及每次握手后的状态改变

客户端——发送带有SYN标志的数据包——服务端 一次握手 Client进入syn_sent状态

服务端——发送带有SYN/ACK标志的数据包——客户端 二次握手 服务端进入syn_rcvd

客户端——发送带有ACK标志的数据包——服务端 三次握手 连接就进入Established状态

五、TCP三次握手为什么两次握手不行?

主要是为了建立可靠的通信信道,保证客户端与服务端同时具备发送、接收数据的能力。
1、防止已失效的请求报文又传送到了服务端,建立了多余的链接,浪费资源。
2、 两次握手只能保证单向连接是畅通的(为了实现可靠数据传输,TCP 协议的通信双方,都必须维护一个序列号,以标识发送出去的数据包中,哪些是已经被对方收到的。 三次握手的过程即是通信双方相互告知序列号起始值,并确认对方已经收到了序列号起始值的必经步骤;如果只是两次握手,至多只有连接发起方的起始序列号能被确认,另一方选择的序列号则得不到确认)。

六、TCP四报文挥手

TCP连接的断开有两种方式:一种是主动断开;一种是被动断开。
主动断开(也就是TCP的四报文挥手),当数据传输结束后,TCP连接的双方都可以断开连接。现在客户端和服务端都处于已建立连接的状态,假设客户端先申请断开连接。客户端先发出断开连(已建立连接)的状态。
第一次挥手:客户端发送一个 FIN 报文,报文中会指定一个序列号。此时客户端处于FIN_WAIT1状态。
即发出连接释放报文段(FIN=1,序号seq=u),并停止再发送数据,主动关闭TCP连接,进入FIN_WAIT1(终止等待1)状态,等待服务端的确认。
第二次挥手:服务端收到 FIN 之后,会发送 ACK 报文,且把客户端的序列号值 +1 作为 ACK 报文的序列号值,表明已经收到客户端的报文了,此时服务端处于CLOSE_WAIT状态。
即服务端收到连接释放报文段后即发出确认报文段(ACK=1,确认号ack=u+1,序号seq=v),服务端进入CLOSE_WAIT(关闭等待)状态,此时的TCP处于半关闭状态,客户端到服务端的连接释放。客户端收到服务端的确认后,进入FIN_WAIT2(终止等待2)状态,等待服务端发出的连接释放报文段。
第三次挥手:如果服务端也想断开连接了,和客户端的第一次挥手一样,发给 FIN 报文,且指定一个序列号。此时服务端处于 LAST_ACK 的状态。
即服务端没有要向客户端发出的数据,服务端发出连接释放报文段(FIN=1ACK=1,序号seq=w,确认号ack=u+1),服务端进入LAST_ACK(最后确认)状态,等待客户端的确认。
第四次挥手:客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答,且把服务端的序列号值 +1 作为自己 ACK 报文的序列号值,此时客户端处于 TIME_WAIT 状态。需要过一阵子以确保服务端收到自己的 ACK 报文之后才会进入 CLOSED 状态,服务端收到 ACK 报文之后,就处于关闭连接了,处于 CLOSED 状态。
即客户端收到服务端的连接释放报文段后,对此发出确认报文段(ACK=1seq=u+1ack=w+1),客户端进入TIME_WAIT(时间等待)状态。此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL后,客户端才进入CLOSED状态。
收到一个FIN只意味着在这一方向上没有数据流动。客户端执行主动关闭并进入TIME_WAIT是正常的,服务端通常执行被动关闭,不会进入TIME_WAIT状态。
在这里插入图片描述

七、TCP四次挥手过程以及状态改变

客户端——发送带有FIN标志的数据包——服务端,关闭与服务端的连接 ,客户端进入FIN-WAIT-1状态
服务端收到这个 FIN,它发回⼀ 个 ACK,确认序号为收到的序号加1,服务端就进入了CLOSE-WAIT状态
服务端——发送⼀个FIN数据包——客户端,关闭与客户端的连接,客户端就进入FIN-WAIT-2状态
客户端收到这个 FIN,发回 ACK 报⽂确认,并将确认序号设置为收到序号加1,TIME-WAIT状态
为什么四次挥手:因为需要确保客户端与服务端的数据能够完成传输。
CLOSE-WAIT:
该状态的含义是表示在等待关闭。
TIME-WAIT:
为了解决网络的丢包和网络不稳定所带来的其他问题,确保连接方能在时间范围内,关闭自己的连接。

八、TCP四次挥手为什么需要四次?

因为当服务端收到客户端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当服务端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉客户端,“你发的FIN报文我收到了”。只有等到我服务端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四次挥手。

九、TCP被动断开连接方式

TCP还有一种断开连接的方式是被动断开连接。
TCP中还存在一个保活计时器。在TCP传输的过程中,有一方主机假设是客户端忽然出现故障。那么服务端就收不到客户端传过来的数据了。此时,让服务端一直等下去显然是不合理的。所以就要采取一定的措施让服务端等一段时间都还等不到数据传过来就断开连接。这里就要用到保活计时器。TCP通信的双方都有保活计时器。TCP通信中的任何一方每收到一次数据,就要重置保活计时器。若有一端在保活计时器到时后还没有收到数据,则发送一个探测报文,以后则每过一段时间发一次。如果连续发送10探测报文都收不到另一端的反应,则认为另一端发生故障,自己这一端关闭连接。

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值