网络协议 TCP的三次握手

1.TCP的有链接性决定了它一切从连接开始

那为啥要握手呢,不握手不行么,这样就可以有效隔离病毒了,…噢,好吧,我要全民免疫。。。,必须的握手,因为tcp区别于udp的最明显的就是他的有链接性,所以,在他俩通信的的过程中,必须先通过交换数据的方式建立链接,这样才能通信。

  1. 客户端向服务端发送连接请求
  2. 服务端收到请求后向客户端发送接受连接请求消息
  3. 客户端收到服务端的接受连接消息后向服务端发送确认连接消息
    那三次握手客户端和服务端都干了什么,具体携带怎样的消息体和状态吗,这里就用到上节讲到的数据包结构TCP 数据段 . 帧

1.三次握手的过程

1. 第一次握手,客户端向服务端发送连接请求

在这之前先来了解下tcp连接的状态:
tcp连接状态码
客户端向服务端发送第一次连接请求一之前,是出于CLOSED 状态,这时表示两端都没有在活动或者会话,是处于关闭状态的,当客户端向服务端发送当syn=1,ack=0(syn 表示消息类型为请求连接,且值为1时有效)消息后,处于SYN send状态,,表示已经发送一个连接请求,正在等待对方确认,这也就是第一次握手。

2. 第二次握手,服务端向发送端发送连接确认消息

      在服务端未收到消息前,服务端处于LISTEN 状态,表示等待新的传输接入,当收到客户端的SYN ==1 连接消息后,服务端会发送一个 SYN==1,ack==1(ACK置1表示是一个确认数据段) ,的接受连接消息到客户端,这时服务端处于SYN RCVD 状态,这是第二次握手。

3. 第三次握手,客户端收到服务端的接受连接消息后向服务端发送确认连接消息。

         当客户端收到服务端的syn 和 ack 后,会向服务端发送一个ack 数据段,并进入到 ESTABLISHED 状态,当服务端收到消息后也进入到ESTABLISHED 状态,此时双方可以进行数据传输了, 这是tcp的第三次握手。

服务端收到来自客户端的ack 确认数据段后,完成整个tcp 传输的三次握手过程,也进入established 状态,此时双方可进行自由的数据传输。

2 .握手失败

但是,凡事都是有意外的,万一握手失败或者拒绝握手了,那该如何呢?
1.服务器不想建立连接 。
1.服务端向客户端发送一个FIN 数据段(fin 字段置1),然后进入到FIN WAIT 1 状态,等待客户端确认
2.当客户端收到服务器发来的FIN 数据段后,向服务器发送以一个ack 确认数据,进入closing状态,表示双方同时尝试关闭连接。
3.服务端收到来自客户端的确认数据ack 数据段后,进入到 TIMED WAIT 状态。
4.在超时后双方关闭连接,超时时间一般是2msl( msl最大报文生存时间)
Windows : MSL = 2 min
linux(Ubuntu, CentOs) : MSL = 60s
Unix : MSL = 30s
建议设置 2min

3.三次握手流程图:

TCP三次握手
这里如果你不了解tcp包的组成,可能会被大写的SYN ACK 和 小写的 ack 搞晕,建议先了解下包结构。大写的表示标志位,值为1 表示该位有效,比如 ACK =1 表示确认号有效,那么ack 小写的确认号才有效。

3.那么为什么要建立三次握手连接?

首先我们站在人与人交流的角度来说,你和别人交流沟通肯定有一个先发话,然后等到对方响应,这才算一个沟通的完整过程,通信也是一样的,至少需要两次握手(一来一回),才算一个完整的过程,这样可以最大限度的节省交流成本,或者说节省资源,且减少协议的复杂程度.但是网络毕竟是有各种异常情况,可能阻塞,可能丢失。
比如说:A 向B 发送连接请求,但是A 发送的第一包数据后在网络的某个节点被滞留了,这时A又向B发送了一条数据,并且A, B 连接完成并且顺利的关闭了链接。 但是这时 发送的第一包SYN 数据发送到了B , B向A 发送 确认连接请求。 假设握手机制是两次,那么这时链接就会建立,B 一直在等A 发送消息,但实际A 不会再发消息了,这样就极大的浪费了B 的资源,假如是三次握手,就不会出现类型情况,B 发送数据包给A ,A不会发送确认消息给B ,B也不会建立连接,所以说三次握手,是一种非常有效的握手机制。多一次浪费,少一次会出先资源浪费。

4.双方同时发起握手过程是什么样?

这种连接方式比较极端,但是也有可能发生
在这里插入图片描述这个时候A 或 B 即使客户端也是服务端,他们比三次握手多一次握手,但他们建立的是一个连接。

5.握手过程一方突然挂了,另一方如何断开?

在SYN 过程中假设 客户端A发送给服务端B的SYN 包客户端收到后 ,B 发送SYN 确认消息给A ,但是A 在发送完消息后就已经挂了,此时这个连接既没建立起来,也不能算失败。这就需要一个超时时间让Server将这个连接断开,否则这个连接就会一直占用Server的SYN连接队列中的一个位置,大量这样的连接就会将Server的SYN连接队列耗尽,让正常的连接无法得到处理,Linux下默认会进行5次重发SYN-ACK包,重试的间隔时间从1s开始,下次的重试间隔时间是前一次的双倍,从1秒开始, 2s 4s 8s 16s 32s 五次总共需要63 s ,如果五次都没有得到响应,就关闭连接,不再发送。

参考:1.https://blog.youkuaiyun.com/scdxmoe/article/details/78663232?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2allsobaiduend~default-1-78663232.nonecase&utm_term=tcp%E5%8D%8F%E8%AE%AE%E6%8F%A1%E6%89%8B%E8%BF%87%E7%A8%8B%E9%BB%98%E8%AE%A4%E5%87%A0%E7%A7%92%E8%B6%85%E6%97%B6&spm=1000.2123.3001.4430
2.《深入理解计算机网络》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值