三次握手与四次挥手详解

目录

TCP协议

TCP协议特点

TCP报文头部

源端口

目的端口

序号

确认号

报头长度(数据偏移)

保留位

标志位

窗口大小

检验和

紧急指针

三次握手

第一次握手:

第二次握手:

第三次握手:

四次挥手

第一次挥手:

第二次挥手:

第三次挥手:

第四次挥手:

有关三次握手四次挥手常见的问题

1.第一次握手中的seq有什么作用,是不是固定的值?

2.为什么第二次握手中的ack=x+1?

3.为什么不是两次握手?

4.为什么第三次挥手中还需要ACK=1

5.第四次挥手之后,为什么需要等待2MSL,等待时间是否可以调整(调大或调小有什么影响)?

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

7.服务端主动断开连接之后,可以立即使用原来的端口重新连接吗?

 

 

 

 

 

首先,在介绍三次握手和四次挥手之前,我们需要了解以下概念:

TCP协议

TCP(Transmission Control Protocol)传输控制协议,面向连接的传输协议,在传输层。

TCP协议特点

  • 面向连接:通信之前必须建立连接,通信后断开连接
  • 每一个TCP连接只能是点对点的(一对一)
  • 提供的可靠的交付服务:通过TCP连接传输的数据,无差错,不丢失,不重复
  • 提供全双工通信
  • 面向字节流:TCP中的传输数据是以流的形式传输
  • TCP的首部占20字节

TCP报文头部

图片.png

源端口

源端口占用16bit位,表示发送方主机进程占用的端口号,通过端口可以表时主机上的某一个应用

目的端口

目的端口占用16bit位,表示的是目的主机的端口号,网络通信连接接收方需要用IP+端口,IP在网络层,端口就在传输层记录, 端口号的个数 2^16 =65536

序号

序号占用32位,对发送的数据进行编号,接收方返回的确认序号就是下一个发送包的编号

确认号

确认号32位,确认号接收端发送给发送端的确认编号,表示该编号之前的数据都成功接收,接收端接收到该消息之后就可以继续发送后续的报文

报头长度(数据偏移)

占用了4个bit位,以32位(4字节)即字长为单位,报头的长度是可变的,最大是60个字节(占用4个bit位,2^4=15, 15 *4(字节) =60字节)

保留位

保留位占6位,必须全为0

标志位

标志位占6bit,存在6个标志,每个占用一个bit,如果有效则置为1,依次URG、ACK、PSH、RST、SYN、FIN

(1)URG:该位为1表示TCP包的紧急指针有效,督促上层应用尽快的处理紧急处理

(2)ACK:确认号有效

(3)PSH:push操作,该标志位为1接收方应尽快将报文交给应用层

(4)RST:(rest)连接复位,在通信过程找那个存在主机奔溃或其他原因早成连接错误,用该标志位来拒绝连接

(5)SYN:是一个同步序号,通常是与ACK合用来建立连接,三次握手

(6)FIN:需要端口连接时用到该标志位

窗口大小

占用16bit位,TCP中用来进行流量控制,通过窗口可以告知发送方窗口的大小,通过动态的控制发送窗口大小来控制发送到网络中包的大小,网络通畅时发送大的数据包,网络发送拥塞时发送小的数据包

检验和

占用16bit,通过对首部和数据进行校验来判断当前包是否正确

紧急指针

只有当URG标志置为1时才有效,紧急指针是一个正的偏移,和序号字段中的是相加表示紧急指针的最后的序号,TCP的紧急方式发送一条数据给接收端

三次握手

å¾ç.png

第一次握手:

客户端发送请求报文到服务端,并进入SYN_SENT状态,等待服务的确认(SYN1,seq=x)

第二次握手:

服务端接收到连接请求,如果同意建立连接,向客户端发回确认报文段,服务端进入到SYN_RECV状态,

(SYN=1,ACK=1,ack=x+1,seq=y)

第三次握手:

客户端接收到服务端的确认报文后,向服务端给出确认报文段,连接完成,客户端和服务端都进入了ESTAB-LISHED状态,即可以双向通信(ACK=1,ack=y+1,seq=x+1)

四次挥手

å¾ç.png

四次挥手过程:

第一次挥手:

客户端向发送端发送断开连接报文段,客户端进入FIN-WAIT1状态(FIN1,seq=u)

第二次挥手:

服务端接收到客户端的请求报文后,确认客户端的消息,由服务端回复客户端一个ACK报文,服务端进入到CLOSE-WAIt状态(ACK=1,seq=v, ack=u+1),客户端接收到第二次挥手消息后进入到FIN-WAIT2状态,这时客户端不能给服务端发送消息,但服务端可以继续给客户端发送消息(单通道通信)

第三次挥手:

服务端向客户端发起断开连接报文,服务端进入到LASK-ACK状态(FIN=1,ACK=1,seq=w, ack=u+1)

第四次挥手:

客户端接收到服务端发送的请求报文后,向服务端发送一个确认消息,客户端进入到TIME-WAIT状态。在等待2MSL时间后才进入到CLOSED状态,服务端接收到客户端的消息后进入到CLOSED状态(ACK=1,seq=u+1,ack =w+1)

有关三次握手四次挥手常见的问题

1.第一次握手中的seq有什么作用,是不是固定的值?

答:序号seq可以保证有序性,当序号达到最大值时(2的32次方:大约4G),可以重用,这个初始序号会随时间而改变,因此每一个连接都拥有不同的初始序列号(防止重叠),这样也保证了安全性,若序号是固定值,则很容易被伪造,从而打断TCP的正常连接。

2.为什么第二次握手中的ack=x+1?

答:因为第一次握手中的SYN请求报文段不携带数据,但要消耗一个序号,所以ack=x+1。

3.为什么不是两次握手?

答:防止已失效的连接请求报文段重连,还会浪费服务器资源,因为失效的报文段会创建文件描述符从而消耗内核结构体。

为什么第二次挥手没有FIN?

答:因为TCP是全双工的,服务端可能还要给客户端发送数据。

4.为什么第三次挥手中还需要ACK=1

答:因为要给客户端通知已经收到了上一次的数据,虽然数据传送客户端的确认由内核(OS)完成。

5.第四次挥手之后,为什么需要等待2MSL,等待时间是否可以调整(调大或调小有什么影响)?

为什么第四次挥手之后需等待2MSL时间呢?

1、为了保证发送的最后一个ACK到达服务端

2、防止已经失效的连接请求报文段出现在本次连接中

答:因为要可靠地实现TCP全双工连接的终止(若最后一次ACK丢失,重发可能丢失的ACK报文)
Windows下默认为4分钟,即240秒

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

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

7.服务端主动断开连接之后,可以立即使用原来的端口重新连接吗?

答:不能,立即重连产生异常,因为该端口已被占用,TIME-WAIT时间还没到,产生的“分身”会在2MSL之后消亡。

 

 

本人才疏学浅,如有错误,烦请指出,谢谢!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值