TCP连接的建立与释放

一. TCP协议的特点

  1. 面向连接的传输层协议;
  2. 每条TCP连接只能有两个端点,只能是点对点的;
  3. TCP提供可靠的交付服务,即无差错、不丢失、不重复;
  4. TCP提供全双工通信,允许双方进程随时都能发送数据,为此TCP连接的两头都有发送缓存和接收缓存;
  5. TCP是面向字节流的,每次传输会截取一段连续的字节流,传输单元是报文段;(UDP面向报文并直接交付,传输的是数据报)

二. TCP连接的建立—三次握手

在这里插入图片描述

  1. 首先,TCP服务器进程先创建传输控制块TCB,用来存储TCP连接中的重要信息(TCP连接表,当前发送和接收序号),TCP服务器进入监听状态,等待TCP客户的连接请求----------被动打开连接;
  2. TCP客户进程创建传输控制块TCB,向TCP服务器进程发送TCP连接请求报文段,客户端进程进入同步已经发送状态,
    SYN同步位=1 (连接请求or连接请求的确认),
    seq=x 随机初始序号,(TCP规定SYN=1时的报文段不携带数据)!----------主动打开连接
  3. TCP服务器进程收到请求报文段后,如果同意连接就发送TCP请求的确认报文段,并进入同步已接收状态,
    SYN=1(连接请求or连接请求的确认);
    ACK=1(建立连接后ACK都为1);
    ack=x+1表示期待TCP客户端进程下一次发送的下一个数据序号;
    seq=y 随机初始序号
  4. TCP客户端进程收到TCP连接请求的确认报文段后,需要向服务器进程发送确认报文段的确认(此时是普通的确认报文段,SYN=0,可以携带数据),并进入连接已建立状态,
    ACK=1 (连接已建立);
    ack=y+1 ;
    seq=x+1 (客户进程发送的第一个报文段为x,所以下一个是x+1);
    TCP服务端进程收到后也进入连接已建立状态

注意:
第一次,第二次握手的时候是绝对不可以携带数据的。也就是当SYN=1(连接请求、连接请求的确认)的时候是不可以携带数据的。必须要双方都确认连接没有问题之后才可以传输数据。

1.1 SYN 洪泛攻击

攻击者客户端利用伪造的IP地址向服务端发出请求(第一次握手),而服务端的响应报文(第二次握手)的报文将永远发送不到真实的客户端,服务端在等待客户端的第三次握手(永远都不会有的),服务端在等待这种半开的连接过程中消耗了资源,如果有成千上万的这种连接,主机资源将被耗尽,从而达到攻击的目的。

1.2 为什么要三次握手?

保证 ①连接的可靠性②避免重复链接,假设:

  1. 为了防止已失效的连接请求报文段突然又传送到了服务端(存在延迟的重复请求报文段),因而产生错误和浪费。
    假如只有两次握手,当客户端向服务器端发送的请求报文由于网络等原因滞留,未能发送到服务器端,此时连接请求报文失效,客户端会再次发送请求报文,之后与服务器端建立连接,当连接释放后,由于网络通畅了,第一次客户端发送的请求报文又突然到达了服务器端,这条请求报文本该失效了,但此时服务器端误认为客户端又发送了一次连接请求,两次握手建立好连接,但是此时【客户端处于关闭状态】,会忽略服务器端发来的确认,造成不必要的错误和资源浪费
  2. 假设使用两次握手,【建立连接时】,如果服务器的响应报文端丢失了,Client将不知道服务器是否准备好,甚至怀疑服务器是否收到了自己的连接请求。
    在这种情况下,Client认为还未建立成功,将忽略服务器发来的任何数据分组,只等待服务器端的确认报文。而服务器发出的数据报文超时后会重传,客户端依然拒收,这样就形成了死锁

三. TCP连接的释放—四次挥手

在这里插入图片描述

  1. 在连接已建立状态,假设TCP客户端进程主动关闭 TCP连接,TCP客户进程会发送TCP连接释放报文段
    FIN=1,终止位为1用来释放一个连接(TCP规定终止位=1的报文段即使不携带数据,也要消耗掉一个序号)
    ACK=1,(连接建立的状态)
    ack=v ,v是客户端进程收到的数据的最后一个字节序号+1,即期待服务器下一次发送的第一个字节序号
    seq=a,a是客户进程之前传送的数据的最后一个字节的序号+1

  2. TCP服务器进程收到TCP连接释放报文段后,会发送一个普通的TCP确认报文段,此时 客户端到服务端的连接释放 ,客户端不能再发送数据报文。
    ACK=1
    ack =a+1 对释放报文段的确认
    seq=v, v是服务器之前传过的数据的最后一个字节序号+1
    此时,从【客户端进程到服务器进程】的方向释放了,TCP连接处于半关闭状态,但服务器仍可以向客户端发送

  3. TCP服务器进程发送TCP连接释放请求报文段 进入最后确认状态
    FIN=1,表示这是一个连接是释放报文
    ACK=1
    ack=a+1,对之前收到的连接释放报文段的重复确认,(半关闭状态期间 客户进程不能再给服务进程发消息)
    seq=b,【在半关闭状态下】,服务进程可能又发送了一些数据

  4. TCP客户进程收到TCP连接释放报文段后,发送该报文段的普通TCP确认报文段
    ACK=1
    ack=b+1
    seq=a+1 客户端之前发送的TCP连接释放报文段虽然不携带数据,但要消耗一个序号
    服务器进程关闭;
    客户端进程经过两倍 msl(最长报文段寿命)后进入关闭;

3.1 TCP客户进程在发送完最后一个确认报文段后,为什么要2倍msl才进入关闭状态?为什么不能直接关闭?

如果客户进程发送对 服务器连接释放报文段的确认报文段后,立即进入了关闭状态
而这个报文段丢失了,没有传到服务器,则服务器进程会将连接释放报文段 超时重传;
由于客户进程已关闭无法接受,会造成服务器进程反复重传“第三次挥手”,造成资源浪费
而客户进程等待2msl时长,可以保证服务器进程能收到最后一个TCP确认报文段;

3.2 当TCP客户进程故障,服务器进程一直等待,如何处理?

TCP服务进程每收到一次客户进程的数据就重启 “保活计时器”
若保活计时器周期内(2h),服务器进程未收到客户进程的数据,在保活计时器到时后,服务进程给客户进程发送一个探测报文段
每隔75秒发送一次,直到10个报文都没有客户进程的相应,TCP服务器进程就关闭连接。

3.3 三次握手和四次挥手的作用是什么?

TCP依靠三次握手四次挥手来保证可靠(注意只是保证可靠但不保证安全);

3.4 为什么要四次挥手?

TCP是全双工通信,两边都可以传输数据,因此每个方向都需要单独关闭
任何⼀方都可以在数据传送结束后发出连接释放的通知,待对放确认后进入半关闭状态。当另⼀方也没有数据再发送的时候,再发出连接释放通知,对方确认后才完全关闭了TCP连接。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值