精华内容
下载资源
问答
  • tcp三次握手详解
    千次阅读 多人点赞
    2019-06-26 23:04:09

    为什么必须是三次握手?

      大家都知道传输层(点击这里去传输层)中的TCP协议是面向连接的,提供可靠的连接服务,其中最出名的就是三次握手和四次挥手,今天先讲解三次握手(四次挥手点这里),如下图
    在这里插入图片描述
      喜欢钻牛角尖的我在学习三次握手的时候就想到了几个问题:为什么三次握手是三次?不是一次、两次或者更多?如果是两次或者是一次会出现什么情况?带着这个问题我找了好多资料,发现了其中的奥秘。

    一次握手的情况:

      由于TCP是面向连接的,一次很明显时不可能的,因为客户端发出连接消息后,却没有接收到来自服务端的回应,客户端就无法确定服务端接是否收到了连接请求,当然也就不能确定是否连接成功。
    在这里插入图片描述

    两次握手的情况:

      既然一次客户端接收不到服务端的回应,那就连接两次,接收到回应就说明服务端接收到了连接请求,可以连理连接了。结果并不是这样。
    如果客户端想建立连接,给服务端发了一个连接请求(SYN),但是由于网络中种种情况,导致没有及时到达服务端,这就导致客户端在很长一段时间中没有收到回复消息(ACK),这时客户端又给服务端发送一个SYN,这次的发送和接收的很顺利,很快就收到了ACK,但是这时之前的SYN终于到了服务端,服务端规规矩矩的为这个SYN申请资源,然后返回ACK。由于之前的SYN已经失效了,所以客户端也不会去理会这个ACK,但是傻乎乎的服务端并不知道这个SYN已经失效了,一直为他委会着资源,这就造成了资源的浪费。
    在这里插入图片描述

    三次握手的情况:

      一发一收的两次握手既然不行,那么三次握手就可以了吗?接着往下看。
      在两次握手中服务端不知道当前这个SYN是不是有效的,三次握手就很好的解决了这个问题,第三次握手就是客户端给服务端回复第二次握手,这也就是说服务端会等第三次握手的到来,如果第三次握手迟迟不来,服务端就可以识别这个SYN是无效的,就会将他的资源释放了。还有一种情况就是第三次握手由于网络中的种种原因失败了,这时候客户端认为自己已经连接好了,就会给服务端发送数据,服务端由于没有收到第三次握手,就会以RST包对客户端响应,收到RST的的客户端就知道第三次握手没有成功,就会重新连接。在谢希仁著《计算机网络》第四版中讲“三次握手”的目的是“为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误”。
    在这里插入图片描述
    四次握手和两次握手的情况一样,五次握手和三次握手的情况一样,以此类推,奇数次握手的情况与三次握手相同,同理偶数次握手与两次握手一样,所以为了更快的连接,就使用三次握手最合适。

    每次握手失败对应的措施:

    第一次握手失败:

      如果第一次的SYN传输失败,两端都不会申请资源。如果一段时间后之前的SYN发送成功了,这时客户端只会接收他最后发送的SYN的SYN+ACK回应,其他的一概忽略,服务端也是如此,会将之前多申请的资源释放了。

    第二次握手失败:

      如果服务端发送的SYN+ACK传输失败,客户端由于没有收到这条响应,不会申请资源,虽然服务端申请了资源,但是迟迟收不到来自客户端的ACK,也会将该资源释放。

    第三次握手失败:

      如果第三次握手的ACK传输失败,导致服务端迟迟没有收到ACK,就会释放资源,这时候客户端认为自己已经连接好了,就会给服务端发送数据,服务端由于没有收到第三次握手,就会以RST包对客户端响应。但是实际上服务端会因为没有收到客户端的ACK多次发送SYN+ACK,次数是可以设置的,如果最后还是没有收到客户端的ACK,则释放资源。

      这是我自己理解,有什么不合适的地方,欢迎各位大佬批评指正。

    更多相关内容
  • TCP三次握手详解

    千次阅读 多人点赞 2021-11-10 10:40:24
    TCP三次握手失败了怎么办? 初始序列号ISN(Initial Sequence Number)是固定的吗? 三次握手是否可以携带数据? SYN泛洪攻击 TCP提供面向有连接的通信传输。面向有连接是指在数据通信开始之前先做好通信两端...

     准备工作

    进行连接

    能把三次握手改为两次握手吗?

    改为四次握手行不行?

    TCP第三次握手失败了怎么办?

    初始序列号ISN(Initial Sequence Number)是固定的吗?

    三次握手是否可以携带数据?

    SYN泛洪攻击

    总结



     

    TCP提供面向有连接的通信传输。面向有连接是指在数据通信开始之前先做好通信两端之间的准备工作。

    准备工作

    TCP服务器先创建传输控制块TCB,时刻准备接收客户进程的连接请求,此时服务器处于LISTEN(监听)状态,客户端处于CLOSE(关闭)状态。

    什么是传输控制块?

    TCB传输控制块包含了数据发送双方对应的socket信息以及拥有装载数据的缓冲区。

    在两个设备在建立连接之前,双方都必须要做一些准备工作,分配内存建立起TCB传输控制块就是连接之前必须要做的工作。

    进行连接

    第一次握手:客户端给服务器发送一个同步报文段SYN,并指定客户端的初始序列号ISN,此时客                        户端处于SYN_SENT状态

                          首部的同步位SYN = 1(SYN只是一个比特位,0表示不是SYN,1表示是SYN),初始                       序列号seq = m

                          SYN = 1的报文段不能携带任何的数据,但要指定序号。

    第二次握手:服务器接收到来自客户端的同步报文段SYN后,会以自己的SYN报文作为应答,                             并且也指定了自己的初始序列号ISN。同时会把客户端的 seq+1 确认序列号ack的                           值,表示自己已经收到了客户端的同步报文段SYN,此时服务器处于SYN_RCVD的                       状态。

                        确认报文段中SYN = 1,ACK = 1(ACK也只是一个比特位,0表示不是ACK,1表示是                        ACK),确认序列号ack = m+1,初始序列号seq = n

    第三次握手:客户端收到来自服务器的同步报文段SYN之后,会发送一个确认报文段ACK,以服                         务器的 seq+1作为ack的值 ,表明自己已经收到来自服务器的同步报文段SYN。客                         户端进入ESTABLISHED状态,服务器确认报文段ACK之后,也会进入                                           ESTABLISHED状态

                         确认报文段中,ACK = 1,确认序列号 ack = n+1,序列号 seq = m+1

    双方已经建立起连接,可以正常的发送数据。

    能把三次握手改为两次握手吗?

    肯定不行!!!第三次握手是为了防止失效的请求连接到达服务器,让服务器错误的打开连接。

    举个列子:

    TCP的三次握手和打电话非常的类似 

            电话拨通后,发送方不知道自己的发送能力是否正常,

     于是“歪?歪?”两声看看对方能不能听到。

    接收方听到发送方的声音后,此时接受方就可以得出发送方的发送能力和自己的接收能力是正常的。但此时发送方还不知道自己的发送能力是否正常,于是接收方对发送方回复: "歪 你找我干啥"。

    查看源图像

    发送方收到来自接收方的回复后,就知道 自己的发送能力和接收能力是正常的,接受方的发送能力和接收能力也是正常的。但此时接收方并不知道自己的发送能力和发送方的接收能力是否正常。

     

    发送方为了让接收方知道自己已经收到回复,就向接收发发送了"你是猪"。接收方收到后,接收方就知道自己的发送能力和发送方的接收能力也是正常的。

    这下子双方可以进行愉快的交流啦!

    总的来说,经过三次握手让客户端和服务器互相知道了自己的发送、接收和对方发送、接收都是正常的。

    改为两次握手会出现什么后果?

    假如客户端发出了连接请求,但因为网络波动导致服务器并没有收到来自客户端的请求连接,于是客户端又重发了一次连接请求,客户端和服务器经过两次握手就建立好连接。双方开始传输数据,数据传输完成以后,双方断开连接。过一段时间后,原本在网络传输中搁置的连接请求到达了服务器。服务器以为是客户端又发出来一次新的连接请求,于是就向客户端发送确认报文段,同意建立连接(两次握手只需要服务器发出确认报文段,就建立好连接)。此时服务器一直在等待客户端发送的数据,一直浪费着系统资源。

    改为四次握手行不行?

    行!!!TCP三次握手原本应该是"四次握手",但是中间的同步报文段SYN和应答报文ACK是可以合在一起的,这两个操作在时间上是同时发送的。

    当客户端的到达同步报文段SYN到达服务器的时候,服务器的内核就会第一时间进行应答报文段ACK, 同时也会第一时间发起同步报文段SYN,这两件事情同时触发,于是就没必要分成两次传输,直接一步到位。分成两次反而会更浪费系统资源(需要进行两次的封装和分用)。

    TCP第三次握手失败了怎么办?

    服务器发送了SYN+ACK报文后就会启动一个定时器,等待客户端返回的ACK报文。如果服务器在定时器的范围内没有收到来自客户端的ACK报文,服务器会再次重发SYN+ACK报文。重传的次数可以根据/proc/sys/net/ipv4/tcp_synack_retries来指定,默认为5次。

    达到重传的指定次数后仍然没有收到ACK应答,那么一段时间后,服务器自动关闭这个连接。但是client认为这个连接已经建立好了。

    如果客户端向服务器发送数据,服务器将以RST包(重置连接)响应。

    初始序列号ISN(Initial Sequence Number)是固定的吗?

    序列号是按顺序给发送数据的每一个字节(8位字节)都标上号码的编号。

    当一端为建立连接而发送它的SYN时,它会为连接选择一个初始的序列号ISN(客户端和服务器会分别选择一个初始序列号ISN)。初始序列号ISN并非为0,而是由随机数生成,而后面的计算则是对每一字节加一。

    三次握手的其中一个重要功能是客户端和服务端交换初始序列号ISN,以便让对方知道接下来接收数据的时候如何按序列号组装数据。如果 初始序列号 ISN 是固定的,攻击者很容易猜出后续的确认号,从而打断正常的TCP连接,因此 ISN 是动态生成的。

    三次握手是否可以携带数据?

    第一次、第二次不可以,第三次可以。

    如果第一次握手可以携带数据的话,那么将会使服务器更容易遭受攻击。如果第一次握手携带就大量的数据,那么服务器需要花老长的时间才能对此解析。如果进行重复的发送,那么服务器就会因为系统资源殆尽而崩溃。

    第三次握手可以携带数据。第三次握手时客户端处于ESTABLISH状态。对于客户端来说,它已经建立好了连接,并且它已经知道服务器的接收能力和自己的发送能力是正常的,所以可以进行正常的发送数据。

    SYN泛洪攻击

    SYN泛洪攻击利用的是TCP的三次握手机制,攻击端利用伪造的IP地址向服务器发出请求,而被服务器发出的响应响应将永远发送不到目的地,那么就会触发服务器的超时重传机制等待客户端的响应(客户端的IP地址不存在,根本不会进行响应)。那么被服务器在等待关闭这个连接的过程中消耗了资源,如果有成千上万的这种连接,主机资源将被耗尽,从而达到攻击的目的。

    措施:

            降低SYN timeout时间

            采用SYN cookie设置

            增加半连接数

            合理地采用防火墙等外部网络安全设施

    总结

             三次握手不是TCP本身的要求, 而是为了满足"在不可靠信道上可靠地传输信息"这一需求所导致的。三次握手的过程中会同步客户端和服务器的序列号,为确认应答处理、重发控制以及重复控制等功能提供了保证。

    展开全文
  • TCP三次握手会涉及到状态转换所以这里贴出TCP的状态转换图如下: 2.TCP三次握手简述 要想简单了解TCP三次握手,我们首先要了解TCP头部结构,如下: TCP传递给IP层的信息单位称为报文段或段,下面都用段做单位...

    1. 准备

    TCP是属于网络分层中的运输层(有的书也翻译为传输层),因为OSI分为7层,感觉太麻烦了,所以分为四层就好了,简单。
    分层以及每层的协议,TCP是属于运输层(有的书也翻译为传输层),如下两张图:

    图1 

    这里写图片描述

     

    TCP三次握手会涉及到状态转换所以这里贴出TCP的状态转换图如下:

    这里写图片描述
    2.TCP三次握手简述

    要想简单了解TCP三次握手,我们首先要了解TCP头部结构,如下:

    在这里插入图片描述

     
    TCP传递给IP层的信息单位称为报文段或段,下面都用段做单位。

    TCP三次握手如图:

    这里写图片描述
    2.1 第一次握手

    客户端给服务器发送一个SYN段(在 TCP 标头中 SYN 位字段为 1 的 TCP/IP 数据包), 该段中也包含客户端的初始序列号(Sequence number = J)。

    SYN是同步的缩写,SYN 段是发送到另一台计算机的 TCP 数据包,请求在它们之间建立连接

    2.2 第二次握手

    服务器返回客户端 SYN +ACK 段(在 TCP 标头中SYN和ACK位字段都为 1 的 TCP/IP 数据包), 该段中包含服务器的初始序列号(Sequence number = K);同时使 Acknowledgment number = J + 1来表示确认已收到客户端的 SYN段(Sequence number = J)。

    ACK 是“确认”的缩写。 ACK 数据包是任何确认收到一条消息或一系列数据包的 TCP 数据包

    2.3 第三次握手

    客户端给服务器响应一个ACK段(在 TCP 标头中 ACK 位字段为 1 的 TCP/IP 数据包), 该段中使 Acknowledgment number = K + 1来表示确认已收到服务器的 SYN段(Sequence number = K)。

    2.4 实例观察

    2.4.1 tcpdump

    使用tcpdump观察如下:因为都是在本机同时运行client和server所以命令为:tcpdump -i lo port 5555, 只能监听回路lo接口,结果如下

    这里写图片描述

     如图用红色圈起来的就是3次握手,但是为什么最后一次握手,为什么ack = 1,而不是369535922 呢,
    这是因为这里的第三次握手tcpdump显示的是相对的顺序号。但是为了便于观察我们需要把tcpdump的
    顺序号变为绝对的顺序号。

    命令只需要加-S(大写)便可,即:tcpdump -i lo port 5555 -S
     

    加上之后结果就正常了如下图:

    这里写图片描述 

    从tcpdump的数据,可以明显的看到三次握手的过程是:

    • 第一次握手:client SYN=1, Sequence number=2322326583 —> server
    • 第二次握手:server SYN=1,Sequence number=3573692787; ACK=1, Acknowledgment number=2322326583 + 1 —> client
    • 第三次握手:client ACK=1, Acknowledgment number=3573692787 + 1 -->server

    想简单了解一下TCP三次握手的话, 看到这里就可以了.

    3.TCP三次握手详细解析过程:

    这里写图片描述
    3.1 第一次握手

    客户在socket() connect()后主动(active open)连接上服务器, 发送SYN ,这时客户端的状态是SYN_SENT
    服务器在进行socket(),bind(),listen()后等待客户的连接,收到客户端的 SYN 后,

    3.1.1 半连接队列(syn queue)未满

    服务器将该连接的状态变为SYN_RCVD, 服务器把连接信息放到半连接队列(syn queue)里面。

    3.1.2 半连接队列(syn queue)已满

    服务器不会将该连接的状态变为SYN_RCVD,且将该连接丢弃(SYN flood攻击就是利用这个原理,
    对于SYN foold攻击,应对方法之一是使syncookies生效,将其值置1即可,路径/proc/sys/net/ipv4/tcp_syncookies,
    即使是半连接队列syn queue已经满了,也可以接收正常的非恶意攻击的客户端的请求,
    但是这种方法只在无计可施的情况下使用,man tcp里面的解析是这样说的,

    这里写图片描述

     但是我不知道为什么Centos6.9默认是置为1,所以这让我很疑惑
    这里写图片描述

    半连接队列(syn queue)最大值 /proc/sys/net/ipv4/tcp_max_syn_backlog

     这里写图片描述

    SYN flood攻击

    攻击方的客户端只发送SYN分节给服务器,然后对服务器发回来的SYN+ACK什么也不做,直接忽略掉,
    不发送ACK给服务器;这样就可以占据着服务器的半连接队列的资源,导致正常的客户端连接无法连接上服务器。-----[维基百科]

    (SYN flood攻击的方式其实也分两种,第一种,攻击方的客户端一直发送SYN,对于服务器回应的SYN+ACK什么也不做,不回应ACK, 第二种,攻击方的客户端发送SYN时,将源IP改为一个虚假的IP, 然后服务器将SYN+ACK发送到虚假的IP, 这样当然永远也得不到ACK的回应。)

    3.2 第二次握手

    服务器返回SYN+ACK段给到客户端,客户端收到SYN+ACK段后,客户端的状态从SYN_SENT变为ESTABLISHED,
    也即是connect()函数的返回。

    3.3 第三次握手

    全连接队列(accept queue)的最大值 /proc/sys/net/core/somaxconn (默认128)

    全连接队列值 = min(backlog, somaxconn)
    这里的backlog是listen(int sockfd, int backlog)函数里面的那个参数backlog

    3.3.1 全连接队列(accept queue)未满

    服务器收到客户端发来的ACK, 服务端该连接的状态从SYN_RCVD变为ESTABLISHED,
    然后服务器将该连接从半连接队列(syn queue)里面移除,且将该连接的信息放到全连接队列(accept queue)里面。

    3.3.2 全连接队列(accept queue)已满

    服务器收到客户端发来的ACK, 不会将该连接的状态从SYN_RCVD变为ESTABLISHED。
    当然全连接队列(accept queue)已满时,则根据 tcp_abort_on_overflow 的值来执行相应动作
    /proc/sys/net/ipv4/tcp_abort_on_overflow 查看参数值


     tcp_abort_on_overflow = 0

    则服务器建立该连接的定时器,

    这个定时器是一个服务器的规则是从新发送syn+ack的时间间隔成倍的增加,
    比如从新了第二次握手,进行了5次,这五次的时间分别是 1s, 2s,4s,8s,16s,
    这种倍数规则叫“二进制指数退让”(binary exponential backoff)

    给客户端定时从新发回SYN+ACK即从新进行第二次握手,(如果客户端设定的超时时间比较短就很容易出现异常)


    服务器从新进行第二次握手的次数/proc/sys/net/ipv4/tcp_synack_retries

    这里写图片描述
     

    tcp_abort_on_overflow = 1
    关于tcp_abort_on_overflow的解析如下:

    这里写图片描述 

     意思应该是,当 tcp_abort_on_overflow 等于1 时,重置连接(一般是发送RST给客户端),
    至于怎么重置连接是系统的事情了。
    不过我在查资料的过程发现,阿里中间件团队博客说并不是发送RST, —[阿里中间件团队博客]

    这个博客跑的实例观察到的是服务器会忽略client传过来的包,然后client重传,一定次数后client认为异常,然后断开连接。
    当然,我们写代码的都知道代码是第一手的注释,实践是检验真理的唯一标准,
    最好还是自己以自己实践为准,因为可能你的环境跟别人的不一样。)

    查看全连接队列(accept queue)的使用情况

    这里写图片描述 

    如上图,第二列Recv-Q是,全连接队列接收到达的连接,第三列是Send-Q全连接队列的所能容纳最大值,
    如果,Recv-Q 大于 Send-Q 那么大于的那部分,是要溢出的即要被丢弃overflow掉的。


    感想:
    1.本来想写TCP连接的建立和终止的,没想到要讲清楚TCP连接的建立已经很大的篇幅了,就只讲TCP连接的建立而已。
    2.以前看书的时候,没有解决一个问题的来的深刻或者说脉络清晰,这个就是主题阅读的好处吧。
    3.以前没有养成一个遇到问题深入解析,解决问题的习惯,今后慢慢养成。

    下面的参考1有实例,会比较详细一点,清晰一些。
    参考:

    http://jm.taobao.org/2017/05/25/525-1/
    https://coolshell.cn/articles/11564.html
    https://zh.wikipedia.org/wiki/SYN_cookie
    https://zh.wikipedia.org/wiki/SYN_flood
    https://www.cnblogs.com/menghuanbiao/p/5212131.html
     

    展开全文
  • TCP三次握手详解-深入浅出(有图实例演示)

    万次阅读 多人点赞 2018-08-08 21:13:48
    TCP三次握手 TCP三次握手简单如下图: TCP三次握手的过程描述: 1.客户主动(active open)去connect服务器,并且发送SYN 假设序列号为J, 服务器是被动打开(passive open) 2.服务器在收到SYN后,它...

    1. 准备

    TCP是属于网络分层中的运输层(有的书也翻译为传输层),因为OSI分为7层,感觉太麻烦了,所以分为四层就好了,简单。
    分层以及每层的协议,TCP是属于运输层(有的书也翻译为传输层),如下两张图:
    图1
    这里写图片描述

    TCP三次握手会涉及到状态转换所以这里贴出TCP的状态转换图如下:
    这里写图片描述

    2.TCP三次握手简述

    要想简单了解TCP三次握手,我们首先要了解TCP头部结构,如下:
    在这里插入图片描述

    TCP传递给IP层的信息单位称为报文段或段,下面都用做单位。

    TCP三次握手如图:
    这里写图片描述

    2.1 第一次握手

    客户端给服务器发送一个SYN段(在 TCP 标头中 SYN 位字段为 1 的 TCP/IP 数据包), 该段中也包含客户端的初始序列号(Sequence number = J)。

    SYN是同步的缩写,SYN 段是发送到另一台计算机的 TCP 数据包,请求在它们之间建立连接

    2.2 第二次握手

    服务器返回客户端 SYN +ACK 段(在 TCP 标头中SYN和ACK位字段都为 1 的 TCP/IP 数据包), 该段中包含服务器的初始序列号(Sequence number = K);同时使 Acknowledgment number = J + 1来表示确认已收到客户端的 SYN段(Sequence number = J)。

    ACK 是“确认”的缩写。 ACK 数据包是任何确认收到一条消息或一系列数据包的 TCP 数据包

    2.3 第三次握手

    客户端给服务器响应一个ACK段(在 TCP 标头中 ACK 位字段为 1 的 TCP/IP 数据包), 该段中使 Acknowledgment number = K + 1来表示确认已收到服务器的 SYN段(Sequence number = K)。

    2.4 实例观察

    2.4.1 tcpdump

    使用tcpdump观察如下:因为都是在本机同时运行client和server所以命令为:tcpdump -i lo port 5555, 只能监听回路lo接口,结果如下
    这里写图片描述
    如图用红色圈起来的就是3次握手,但是为什么最后一次握手,为什么ack = 1,而不是369535922 呢,
    这是因为这里的第三次握手tcpdump显示的是相对的顺序号。但是为了便于观察我们需要把tcpdump的
    顺序号变为绝对的顺序号。

    命令只需要加-S(大写)便可,即:tcpdump -i lo port 5555 -S
    加上之后结果就正常了如下图:
    这里写图片描述
    从tcpdump的数据,可以明显的看到三次握手的过程是:
    第一次握手:client SYN=1, Sequence number=2322326583 —> server
    第二次握手:server SYN=1,Sequence number=3573692787; ACK=1, Acknowledgment number=2322326583 + 1 —> client
    第三次握手:client ACK=1, Acknowledgment number=3573692787 + 1 -->server

    想简单了解一下TCP三次握手的话, 看到这里就可以了.

    3.TCP三次握手详细解析过程:

    这里写图片描述

    3.1 第一次握手

    客户在socket() connect()后主动(active open)连接上服务器, 发送SYN ,这时客户端的状态是SYN_SENT
    服务器在进行socket(),bind(),listen()后等待客户的连接,收到客户端的 SYN 后,

    3.1.1 半连接队列(syn queue)未满

    服务器将该连接的状态变为SYN_RCVD, 服务器把连接信息放到半连接队列(syn queue)里面。

    3.1.2 半连接队列(syn queue)已满

    服务器不会将该连接的状态变为SYN_RCVD,且将该连接丢弃(SYN flood攻击就是利用这个原理,
    对于SYN foold攻击,应对方法之一是使syncookies生效,将其值置1即可,路径/proc/sys/net/ipv4/tcp_syncookies,
    即使是半连接队列syn queue已经满了,也可以接收正常的非恶意攻击的客户端的请求,
    但是这种方法只在无计可施的情况下使用,man tcp里面的解析是这样说的,
    这里写图片描述
    但是我不知道为什么Centos6.9默认是置为1,所以这让我很疑惑
    这里写图片描述)。
    半连接队列(syn queue)最大值 /proc/sys/net/ipv4/tcp_max_syn_backlog
    这里写图片描述
    SYN flood攻击

    攻击方的客户端只发送SYN分节给服务器,然后对服务器发回来的SYN+ACK什么也不做,直接忽略掉,
    不发送ACK给服务器;这样就可以占据着服务器的半连接队列的资源,导致正常的客户端连接无法连接上服务器。-----[维基百科]

    (SYN flood攻击的方式其实也分两种,第一种,攻击方的客户端一直发送SYN,对于服务器回应的SYN+ACK什么也不做,不回应ACK, 第二种,攻击方的客户端发送SYN时,将源IP改为一个虚假的IP, 然后服务器将SYN+ACK发送到虚假的IP, 这样当然永远也得不到ACK的回应。)

    3.2 第二次握手

    服务器返回SYN+ACK段给到客户端,客户端收到SYN+ACK段后,客户端的状态从SYN_SENT变为ESTABLISHED,
    也即是connect()函数的返回。

    3.3 第三次握手

    全连接队列(accept queue)的最大值 /proc/sys/net/core/somaxconn (默认128)
    这里写图片描述
    全连接队列值 = min(backlog, somaxconn)
    这里的backlog是listen(int sockfd, int backlog)函数里面的那个参数backlog

    3.3.1 全连接队列(accept queue)未满

    服务器收到客户端发来的ACK, 服务端该连接的状态从SYN_RCVD变为ESTABLISHED,
    然后服务器将该连接从半连接队列(syn queue)里面移除,且将该连接的信息放到全连接队列(accept queue)里面。

    3.3.2 全连接队列(accept queue)已满

    服务器收到客户端发来的ACK, 不会将该连接的状态从SYN_RCVD变为ESTABLISHED。
    当然全连接队列(accept queue)已满时,则根据 tcp_abort_on_overflow 的值来执行相应动作
    /proc/sys/net/ipv4/tcp_abort_on_overflow 查看参数值
    这里写图片描述

    3.3.2.1 tcp_abort_on_overflow = 0

    则服务器建立该连接的定时器,

    这个定时器是一个服务器的规则是从新发送syn+ack的时间间隔成倍的增加,
    比如从新了第二次握手,进行了5次,这五次的时间分别是 1s, 2s,4s,8s,16s,
    这种倍数规则叫“二进制指数退让”(binary exponential backoff)

    给客户端定时从新发回SYN+ACK即从新进行第二次握手,(如果客户端设定的超时时间比较短就很容易出现异常)
    服务器从新进行第二次握手的次数/proc/sys/net/ipv4/tcp_synack_retries
    这里写图片描述

    3.3.2.2 tcp_abort_on_overflow = 1

    关于tcp_abort_on_overflow的解析如下:
    这里写图片描述
    意思应该是,当 tcp_abort_on_overflow 等于1 时,重置连接(一般是发送RST给客户端),
    至于怎么重置连接是系统的事情了。
    不过我在查资料的过程发现,阿里中间件团队博客说并不是发送RST, —[阿里中间件团队博客]

    这个博客跑的实例观察到的是服务器会忽略client传过来的包,然后client重传,一定次数后client认为异常,然后断开连接。
    当然,我们写代码的都知道代码是第一手的注释,实践是检验真理的唯一标准
    最好还是自己以自己实践为准,因为可能你的环境跟别人的不一样。)

    查看全连接队列(accept queue)的使用情况
    这里写图片描述
    如上图,第二列Recv-Q是,全连接队列接收到达的连接,第三列是Send-Q全连接队列的所能容纳最大值,
    如果,Recv-Q 大于 Send-Q 那么大于的那部分,是要溢出的即要被丢弃overflow掉的。

    希望热心的网友帮忙提改进意见时可以直接指出哪一段第几句(比如 2.4.1 tcpdump 第一段第一句, 命令tcpdump -i lo port 5555 里参数 i 用错了,应该用 I),这样比较快速找到好改正。

    您的一次小小的打赏或点赞能让我知道,我的文章对您有帮助.同时它能给我提供源源不断的动力,创作出更多高质量的文章,帮助更多的像您一样的人.

    在这里插入图片描述

    感想:
    1.本来想写TCP连接的建立和终止的,没想到要讲清楚TCP连接的建立已经很大的篇幅了,就只讲TCP连接的建立而已。
    2.以前看书的时候,没有解决一个问题的来的深刻或者说脉络清晰,这个就是主题阅读的好处吧。
    3.以前没有养成一个遇到问题深入解析,解决问题的习惯,今后慢慢养成。

    下面的参考1有实例,会比较详细一点,清晰一些。
    参考:

    1. http://jm.taobao.org/2017/05/25/525-1/
    2. https://coolshell.cn/articles/11564.html
    3. https://zh.wikipedia.org/wiki/SYN_cookie
    4. https://zh.wikipedia.org/wiki/SYN_flood
    5. https://www.cnblogs.com/menghuanbiao/p/5212131.html
    展开全文
  • TCP三次握手详解

    千次阅读 2022-01-19 20:00:15
    由于TCP不存在连接的概念,只存在请求和响应,请求和响应都是数据包,它们之间都是经过由TCP创建的一个从客户端发起,服务器接收的类似连接的通道,这个连接可以一直保持,http请求是在这个连接的基础上发送的;...
  • TCP用3次握手建立连接的过程 注意:TCP客户端主动建立连接,TCP服务端等待连接 起初两端都是关闭状态 ...第三次握手:客户端接收到服务器的确认报文后,给服务器再次发送确认报文,然后进入连接已建立状态
  • TCP三次握手和四次挥手不管是在开发还是面试中都是一个非常重要的知识点,它是我们优化web程序性能的基础。欢迎学习,一起进步 文章目录一.TCP简介二.TCP数据报结构三.TCP的三次握手四.TCP的四次挥手 一.TCP简介 TCP...
  • wireshark tcp三次握手

    2016-08-03 09:05:18
    ubuntu下自己写tcp协议(server.c,client.c,Makefile),通过tcpdump生成 .cap文件后,利用wireshark分析tcp三次握手的整个过程
  • TCP三次握手(含常见面试题)详解

    千次阅读 2022-04-13 08:09:06
    TCP 头格式 序列号:在建立连接时就由计算机随机生成,每发送一数据,该序列号+1,用来解决网络中包乱序的问题 确认应答号:表示下一期望收到的报文序列号,表示以前的数据报都已经收到了,用来解决网络中丢包...
  • TCP三次握手详解及释放连接过程(“三次握手”和“四次挥手”) TCP在传输之前会进行三次沟通,一般称为“三次握手”,传完数据断开的时候要进行四次沟通,一般称为“四次挥手”。 TCP的传输连接分为3个阶段,连接...
  • TCP三次握手详解和SYN攻击

    千次阅读 2019-01-04 09:43:12
    有很多三次握手的文章,我觉得讲的都比较不容易懂,有点冗杂,下面我来总结一下。   三次握手的过程: 说到三次握手,大家肯定都会用这张图,我这里也用这张图了,下面来看看这个过程: 第一次握手:client...
  • 那么在一网络的传输过程中具体的流程是怎么样的,我们先从一个数据包的传输说起(以TCP为例): TCP协议根据上层应用提供的信息生成TCP报文 TCP报文在交由下面的IP层(网络层)进行处理,委托IP模块将TCP报文...
  • 深入浅出TCP三次握手 (多图详解

    万次阅读 多人点赞 2021-11-07 18:49:08
    TCP三次握手和四次挥手是面试题的热门考点,它们分别对应TCP的连接和释放过程,今天我们先来认识一下TCP三次握手过程,以及是否可以使用“两报文握手”建立连接?。 1、TCP是什么? TCP是面向连接的协议,它基于...
  • TCP协议目的是为了保证数据能在两端准确连续的流动,可以想象两个建立起TCP通道的设备就如同接起了一根水管,数据就是水管中的水由一头流向另一头。然而TCP为了能让一个设备连接多根“水管”,让一个设备能同时与多...
  • 三次握手3. SYN洪泛攻击4. 为什么是“三次” TCP是面向连接的(connection-oriented),即收发双方在发送数据之前,必须首先建立一个连接,这样在连接断开之前,就一直使用这个连接传输数据。建立连接包括参数的设置...
  • TCP 三次握手和四次挥手,面试题详解,图文并茂,欢迎技术交流
  • TCP三次握手简介: 为了建立连接TCP连接,通信双方必须从对方了解如下信息: 1、对方报文发送的开始序号。 2、对方发送数据的缓冲区大小。 3、能被接收的最大报文段长度MSS。 4、被支持的TCP选项。 在TCP协议...
  • 通过图解,简单明了的介绍了tcp三次握手/四次挥手的全过程,解释为什么建立连接协议是三次握手,而关闭连接却是四次握手
  • [ 网络协议篇 ]TCP三次握手和四次挥手详解

    千次阅读 多人点赞 2021-11-19 16:48:43
    TCP三次握手和四次挥手是大厂常见的面试考题,具有一定的水平区分度。 如果你的回答不符合面试官期待的水准,有可能就直接凉凉。 目录 三次握手 为什么两次握手不可以 1. 确认双方的收发能力 2. 序列号可靠...
  • 详解TCP 三次握手和四次挥手

    千次阅读 2022-01-28 14:46:39
    TCP 虐我千百遍,我仍待 TCP 如初恋。 过去不会没关系,今天就让我们来消除这份恐惧,微笑着勇敢的面对它吧!...序列号:在建立连接时由计算机生成的随机数作为其初始值,通过 SYN 包传给接收端主机,每发送一...
  • 传输控制协议,TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接,文档介绍TCP三次握手和4次挥手过程以及详细实例介绍,
  • TCP头部: 其中 ACK SYN 序号 这个部分在以下会用到,它们的介绍也在下面。 暂时需要的信息有: ACK : TCP协议规定,只有ACK=1时有效,也规定连接建立后所有发送的报文的ACK必须为1 SYN...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 26,310
精华内容 10,524
关键字:

tcp三次握手详解

友情链接: polynomial_method.zip