• TCP传输连接管理:三次握手与四次挥手


    TCP传输连接管理

    一、传输连接的三个阶段

    1.1.概述

    • 传输连接就有三个阶段,即:连接建立数据传送连接释放

    • 连接建立过程中要解决以下三个问题:

      • 要使每一方能够确知对方的存在。
      • 要允许双方协商一些参数(如最大报文段长度,最大窗口大小,服务质量等)。
      • 能够对运输实体资源(如缓存大小,连接表中的项目等)进行分配。
    • TCP 连接的建立都是采用客户服务器方式

    • 主动发起连接建立的应用进程叫做客户(client)。

    • 被动等待连接建立的应用进程叫做服务器(server)。


    二、TCP 的连接建立

    2.1.用三次握手建立 TCP 连接

    当客户端A想要访问服务器B上的服务,需要与B建立连接了,就要经历如下三次握手过程:

    image-20200130170026670

    • 第一次握手:A先向B发送一个同步数据包(报文)。

      在报文的TCP首部中:标志位:同步SYN为1,表示这是一个请求建立连接的数据包;确认标记位ACK为0,说明该数据包的确认号无效,所以该标志位可省略;序号Seq=xx为所传送数据的第一个字节的序号。

    • 第二次握手:B收到A发送的第一个数据包后,根据标志位SYN=1与ACK=1,判断出为主动建立连接的数据包。若B同意连接,则B发送一个数据包进行回应。

      在数据包的TCP首部中:标志位:同步SYN=1;标志位:确认ACK=1;序号seq=y,y的值由B指定表示B发送数据时的第一个数据字节的序号;确认号ack=x+1,表示已经收到A发送的x个字节数据,并告诉A下次应从数据的第x+1个字节开始发送。

    注意区分ACK和ack:在TCP首部中前者为标志位确认 ACK ——占 1 字节,只有当 ACK = 1 时确认号字段才有效。当 ACK = 0 时,确认号无效。;后者为确认号字段——占 4 字节,是期望收到对方的下一个报文段的数据的第一个字节的序号。

    • 第三次握手:A收到B的确认之后,再给A发送一个数据包。

      在数据包的TCP首部中:已经没有有效的标志位:同步SYN了(即SYN=0),表示双方已同意建立连接;标志位确认ACK=1,表示收到B的确认数据包;序号seq=x+1,表示发出的数据包就是数据的第x+1个字节;确认号ack=y+1,表示收到了B发送y字节数据,并告诉B下次应从数据的第y+1个字节开始发送。

    2.2.为何有第三次握手?

    客户端向服务器发出建立连接的请求以及服务器向客户端确认这个请求,这两个数据包(前两次握手)足以证明客户端与服务器之间的网络是畅通的,并且协商数据通信所需要的参数。比如协商接收窗口大小,所支持的数据包最大字节数等。

    如果没有最后一个数据包确认(第三次握手),A先发出一个建立连接的请求数据包,由于网络原因绕远路了。A经过设定的超时时间后还未收到B的确认数据包,于是发出第二个建立连接的请求数据包,这次网路通畅,数据包很快到达B,B的确认数据包也很快就到达A。于是A与B开始传输数据,过了一会A第一次发出的建立连接的请求数据包到达了B,B以为是再次建立连接,所以又发出一个确认数据包。由于A已经收到了一个确认数据包,所以会忽略B发来的第二个确认数据包,但是B发出确认数据包之后就要一直等待A的回复,而A永远也不会回复。由此造成服务器资源浪费,这种情况多了B计算机可能就停止响应了。

    第三次握手(第三个数据包)作用在于,告诉B计算机,B第二次握手发给A的确认数据包A收到了,是有效的。避免B计算机等待造成资源浪费。随后A与B可进行下一步的通信。

    2.3.三次握手建立TCP连接过程的各状态

    image-20200130165906308

    • A发出请求建立连接的数据包之后进入SYN-SENT状态,表示发送了请求建立连接的同步数据包。

    • B收到A发出的请求建立连接的数据包之后,结束LISTEN状态,进入SYN-RCVD状态并向A发出确认数据包。

    • A收到确认数据包之后,结束SYN-SENT状态,进入ESTABLISHED状态,并向B发送确认数据包。

    • B收到A的确认数据包之后,结束SYN-RCVD状态,进入ESTABLISHED状态。

    A与B都进入ESTABLISHED状态之后,开始传输数据,由此完成三次握手。

    查看这些状态

    可通过:

    netstat -n
    

    在命令行窗口查看计算机建立的会话的装态。由于建立TCP连接的三次握手过程非常快,我们可以通过访问一个不存在的网址来查看:比如http://192.168.80.200

    image-20200130171444612

    可以看到建立TCP连接时,本计算机访问了该地址的80端口(对应Web服务),并且TCP连接状态为SYN-SENT。此外本计算机还有其他已经建立的TCP连接,状态为ESTABLISHED。

    如何查看SYN-RCVD状态呢?可通过模拟SYN攻击(大量模拟虚构地址与本计算机建立会话)即可查看该状态:

    image-20200130172613268

    框内为SYN攻击虚构的地址,可看到建立TCP连接的会话都处于SYN-RECEIVED状态。

    那么平常如果看到计算机有大量处于SYN-RECEIVED状态的会话说明有人利用SYN攻击器在攻击你的电脑。


    三、TCP的连接释放

    3.1.使用四次挥手释放TCP连接

    数据传输结束后,通信的双方都可主动释放连接。下为A主动释放TCP连接。

    image-20200130183903175

    • 第一次挥手:首先A向B发送连接释放请求报文(数据包),并停止发送数据。

      在连接释放报文(数据包)的TCP首部中:标志位:终止FIN=1,意味着A要主动释放A—>B的TCP连接;序号位seq为u,u值由A指定。随后等待B的确认。

    • 第二次挥手:B收到连接释放报文之后,给A发送确认报文,此时TCP服务器进程通知高层应用进程,这样从A到B这个方向上的连接就释放了,TCP连接处于半关闭状态。此时A没有数据要发给B了,但是B还有数据要发送给A,A仍可以接收。

      在确认报文的TCP首部中:标志位:确认ACK=1,表示收到了A发送的数据包,同意A释放连接;序号位seq=v,v值由B指定;确认号ack=u+1,表示已经收到A发送的u个字节数据,并告诉A下次应从数据的第u+1个字节开始发送,下面同理;此时B还可以向A传输数据。

    • 第三次握手:若B已经没有向A发送的数据了,其应用进程就通知TCP释放连接,并向A发送确认报文。

      在确认报文的TCP首部中:标志位:确认ACK=1,表示B已经把需要发给A的数据发完了;标志位:终止FIN=1,意味着B要释放B—>A的TCP连接;序号seq=w,w值由B指定;确认号ack=u+1;此后B不再向A发送数据,但能接收数据。

    • 第四次挥手:A收到B的连接释放报文段后,向B发出确认报文。

      在确认报文的TCP首部中:标志位:确认ACK=1,表示收到B的确认报文,并同意B释放连接;序号seq=u+1;确认号ack=w+1;

    由此通过四次挥手释放了TCP连接。

  • 相关阅读:
    mysql,apache,php的关系
    简析 Tomcat 、Nginx 与 Apache 的区别
    Linux中涉及到环境变量的文件
    如何在Linux启动的时候执行一个命令
    sed的额外用法(网摘)
    shell脚本执行方式
    在rhel7上搭建centos7的yum源
    MYSQL三种安装方式--二进制包安装
    ssh连接不上排查方法总结
    MySQL启动很慢的原因
  • 原文地址:https://www.cnblogs.com/AhuntSun-blog/p/12332240.html
Copyright © 2020-2023  润新知