计算机网络——三次握手,四次挥手

目录

一、认识常用的序号和标识位

二、TCP连接建立(三次握手)

1、三次握手过程

2、问题

三、TCP连接释放(四次挥手)

1、四次挥手过程

2、过程解释:

3、问题


一、认识常用的序号和标识位

(1)序号:seq,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。

(2)确认序号:ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,ack=seq+1。

(3)标识位:

        ACK:确认序号有效

       SYN:发起一个新连接。
       FIN:释放一个连接

二、TCP连接建立(三次握手)

1、三次握手过程

在本例中A运行的为TCP客户程序,B运行的为TCP服务器程序,A属于主动打开连接,B属于被动打开连接

第一次发送消息:A向B发送请求报文段,A随机选取一个初始序号(seq=x)并将同步位SYN置为1,发送之后,TCP客户进入SYN-SENT(同步已发送状态)

第二次发送消息:当B服务器收到来自A的请求报文段后,若同意建立连接,则向A发送确认,因为B已经收到序列号为x的数据包,B准备接受序列号为x+1的包,所以ack=x+1。同时B告诉A自己的初始序列号:seq = y,并将SYN,ACK都置为1,B发送确认消息后,进入SYN-RCVD(同步收到状态)

第三次发送消息:当A客户进程收到B的确认消息后,还要向B发送确认告诉B已经收到了它发来的确认信息并准备建立连接,A自己这条消息的序列号是x+1,所以seq=x+1, 而ack=y+1是表示A正准备接受B序列号为y+1的数据包。A向B发送确认后进入ESTABLISHED(已建立连接状态)

当B收到A的确认后也进入建立连接状态,则建立连接结束。

2、问题

为什么是三次握手,不能是两次握手?
1.如果A没有向B发送ACK确认收到消息,则服务器会不断地超时重传ACK/SYN(第二个报文段)
2.若为2次,会浪费服务器的资源(SYN溢出攻击或网络环境影响 客户端的SYN会被重传多次)

三次握手的必要性?

防止已失效的连接请求报文段突然又传送到了B,因而产生错误

假定出现一种异常情况,即A发出的第一个连接请求报文到并没有丢失,而是因为某些网络节点长时间滞留了,以致延误到连接释放后的某个时间才到达B

但是B收到此“已失效的报文段”后,就误以为A又发出一次新的连接请求。于是就向A发出确认报文段,同意建立连接。

由于现在A并没有再次向B发出建立请求的连接,因此就不会理会B,也不会向B发送数据。但是B却一直等待A发来数据。这样就会浪费B的资源利用。

采用“三次握手”的方法可以防止上述现象的发生。如上述的假定情况,A不会向B发送确认信息。B由于收不到确认,就知道A并没有要求建立连接

三、TCP连接释放(四次挥手)

1、四次挥手过程

2、过程解释:

建立连接,数据传输结束后,通信双方就可以释放连接了。

此例中A位主动关闭方,B为被动关闭方。

(1)、主动关闭方A向被动关闭方B发送终止连接请求,将终止控制位FIN置为1,序列号seq=u,此时A进入FIN-WAIT-1(终止等待1)状态,虽然FIN不携带数据,但也消耗一个序号

(2)、当被动关闭方B收到A发来的释放连接报文后向A发送确认信息,确认号ack=seq+1,即ack=u+1,自己的序列号为v,发送后B进入CLOSE-WAIT(关闭等待状态),此时A到B方向的连接就释放了,TCP连接处于半关闭状态

(3)、A收到了B发来的释放确认后就进入了FIN-WAIT-2(终止等待2)状态,被动关闭方过一段时间如果没有要向A发送的数据了,就通知TCP进程也释放连接,这时B向A发送释放连接通知,FIN置为1,其序列号为W,由于半封闭状态可能有数据,则B要重复上次的确认号ack=u+1,这时B进入LAST-ACK(最后确认状态)

(4)、当A收到B发来的释放请求时,要发出确认,ACK=1,seq=u+1,sck=w+1,然后进入TIME-WAIT(时间等待状态)经过2MSL进入CLOSED状态,当B收到A发来的确认消息,则也进入CLOSED状态,释放连接结束。

3、问题

为什么要进行两次FIN?
   因为为全双工信道,任意时刻双方互相通讯,至少有2条通讯信道,一个FIN只能关一条,所以得有两个FIN。

第一条FIN为关闭主动方到被动方的传输通道,第二条FIN关闭被动方到主动方的传输通道。

为什么要设置等待时间TIME-WAIT?
         1.保证迟来的数据能被识别并丢弃
         2.保证可靠的终止TCP连接,防止对后续运行的程序造成影响(TIME_WAIT存在时间               内,主动断开方无法用相同的IP地址端口号再启动一个网络通讯)

         (存在时间大约是2MSL:MSL为报文段在网络中最大生存时间)

### TCP 连接建立与断开过程 #### 三次握手过程详解 TCP 使用三次握手来建立可靠的连接。具体过程如下: 当客户端希望与服务器建立通信时,会发送一个带有 SYN 标志的数据包给服务器,此时该数据包中的序列号设为 `x`。 服务器收到这个请求后,如果同意建立连接,则向客户端回送一个 ACK 报文作为应答,并设置确认序号为 `x+1` 同时也携带自己的初始序列号 `y` SYN 标记[^1]。 最后一步是由客户端再次回应服务器一个 ACK 数据段,其中包含对服务器之前发送过来的序列号加一后的值即 `y+1` 来表示已经成功接收到了来自对方的信息并准备就绪可以开始传输实际数据了[^2]。 ```python # 客户端发起SYN请求 client.send(SYN, seq=x) # 服务端响应SYN/ACK server.receive(SYN, seq=x) server.send(ACK, ack=x + 1, seq=y, SYN=True) # 客户端完成第三次握手 client.receive(ACK, ack=x + 1, seq=y) client.send(ACK, ack=y + 1) ``` #### 四次挥手流程 对于终止一条已有的TCP连接来说,通常采用的是四步挥手的方式来进行操作。以下是具体的步骤描述: 一方(假设为客户方)先主动关闭连接并向另一方发送 FIN 控制位置位的数据报;接着等待被通知的一侧回复一个 ACK 应答信号以表明它收到了结束指示并且不再期待更多来自原方向上的新信息流[^3]。 随后被动关闭的那一边也会发出自己想要中断的意思表达也就是第二个 FIN 帧,与此同时还要附带有一个新的序列编号用于跟踪这条消息的状态变化情况;最终由最初提出切断提议者给出最后一个确认答复——第三个也是第四个 ACK 消息,以此正式宣告整个双向通讯链路彻底解除关系。 ```python # 主动关闭方发送FIN active_side.send(FIN, seq=a) # 被动关闭方返回ACK passive_side.receive(FIN, seq=a) passive_side.send(ACK, ack=a + 1) # 被动关闭方发送FIN passive_side.send(FIN, seq=b) # 主动关闭方返回ACK active_side.receive(FIN, seq=b) active_side.send(ACK, ack=b + 1) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值