精华内容
下载资源
问答
  • tcp 三次握手
    千次阅读
    2021-08-10 16:49:47

    TCP三次握手是客户端和服务端建立连接的方式,下面先让我们来看一下近一步来看一下TCP的三次握手的相关细节

    一、TCP三次握手的过程

    这里引用一下小林图解网络里面画的TCP三次握手的流程图。

    通过流程图,我们可以看到:

    第一次握手:

    ⼀开始,客户端和服务端都处于 CLOSED 状态。

    服务端:主动监听某个端⼝,处于 LISTEN 状态。
    客户端:随机初始化序号( client_isn ),将此序号置于 TCP ⾸部的「序号」字段中,同时把
    SYN 标志位置为 1 ,表示 SYN 报⽂。接着把第⼀个 SYN 报⽂发送给服务端,表示向服务端发起连接,该报⽂不包含应⽤层数据,之后客户端处于 SYN-SENT 状态。

    第二次握手:
    服务端:在收到客户端的 SYN 报⽂后,服务端也随机初始化⾃⼰的序号( server_isn ),将此序号填⼊TCP ⾸部的「序号」字段中,其次把 TCP ⾸部的「确认应答号」字段填⼊ client_isn + 1 , 接着把SYN和 ACK 标志位置为 1 。最后把该报⽂发给客户端,该报⽂也不包含应⽤层数据,之后服务端处于SYN-RCVD 状态。

    第三次握手:
    客户端:在收到服务端报⽂后,还要向服务端回应最后⼀个应答报⽂,⾸先该应答报⽂ TCP ⾸部 ACK标志位置为 1 ,其次「确认应答号」字段填⼊ server_isn + 1 ,最后把报⽂发送给服务端,这次报⽂可以携带客户到服务器的数据,之后客户端处于 ESTABLISHED 状态。
    服务端:收到客户端的应答报⽂后,也进⼊ ESTABLISHED 状态。 

    二、TCP报文的头部格式及状态的查看

    其中TCP报文的头部格式如下图所示。

    可以看到其中包含32位序列号和32位确认应答号。还有ACK,SYN等标志位。在第二次握手的过程中,服务端正是将客户端报文中的序列号+1作为确认应答号,并将SYN标志位置为1作为ACK+SYN报文返回客户端。

    可通过netstat -napt来对TCP的状态进行查看

     三、TCP为什么是三次握手而不是两次或者四次握手?

    这里分别解释:

    1)不用两次握手

    我们先来试想一种情况(可以参考下面的图),如果在第一次握手的过程中,客户端向服务端发送了SYN报文(Num=90),但由于网络原因使得报文阻塞,在一段时间没有收到服务端的响应报文后,客户端会再次发送SYN报文(Num=100)。假如此时,之前发送的被阻塞的报文(Num=90)恰好到达了服务端,此时服务端会进行第二次握手,即发送SYN+ACK报文给客户端。试想一下,如果两次握手即可建立连接,在这种情况下,客户端和服务端将会基于旧的报文建立连接,此时可能会造成错误。

     而在三次握手的机制下,客户端就可以根据确认应答号判断所接受到的ACK+SYN报文是不是历史连接,并根据是否为历史连接做出不同的应答。

    如果是历史连接,则第三次握⼿发送的报⽂是 RST 报⽂,以此中⽌历史连接;
    如果不是历史连接,则第三次发送的报⽂是 ACK 报⽂,通信双⽅就会成功建⽴连接

    这样就可以避免建立历史连接了,这是两次握手没法做到的。

    还有一个原因,那就是客户端和服务端要同步双方的初始序列号

    第二次握手中,服务端在确认应答号中将客户端在第一次握手中生成的随机序列号+1,表示对客户端SYN报文的成功接收,那么客户端也同样需要一个握手过程表示对服务端报文的成功接收。因此,这就是第三次握手的必要性。

    2)不用四次握手

    其实通过刚才的过程我们可以看到,三次握手已经可以建立可靠的TCP连接了,因此,实在是没有必要再增加一次握手过程,白白增加资源的浪费。

    四、SYN攻击及应对措施

    什么是SYN攻击?

    我们都知道 TCP 连接建⽴是需要三次握⼿,假设攻击者短时间伪造不同 IP 地址的 SYN 报⽂,服务端每接收到 ⼀个 SYN 报⽂,就进⼊ SYN_RCVD 状态,但服务端发送出去的 ACK + SYN 报⽂,⽆法得到未知 IP 主机的 ACK 应答,久⽽久之就会占满服务端的 SYN 接收队列,使得服务器不能为正常⽤户服务。

     如何应对SYN攻击?

    1.通过参数设置连接队列的大小和队列满的时候该做什么处理
    net.core.netdev_max_backlog //连接队列大小
    net.ipv4.tcp_max_syn_backlog //处于SYN_RCVD状态的连接的最大个数
    net.ipv4.tcp_abort_on_overflow //连接队列满时,对新的SYN回报RST

    该方法的原理是通过预先设定的SYN队列的大小和处于SYN_RVCD状态的连接数来对SYN攻击进行应对,当SYN队列满或者SYN_RCVD的连接数超过设定值时,对新的SYN报文回报RST即终止建立连接。

    2.设置net.ipv4.tcp_syncookies = 1

    即开启cookie模式
    当 「 SYN 队列」满之后,后续服务端收到 SYN 包后,这些SYN包将不进⼊「 SYN 队列」,此时服务端将会计算出⼀个 cookie 值,再以 SYN + ACK 中的「序列号」返回客户端,(key-value),之后,在第三次握手中客户端会发送ACK报文进行相应,服务端接收到客户端的响应报⽂时,服务器会检查这个 ACK 包的合法性。如果合法,直接放⼊到「 Accept 队列」。
    最后应⽤通过调⽤ accpet() socket 接⼝,从「 Accept 队列」取出的连接。

    五、TCP的序列号为什么是随机的?如果不是随机的会怎么样?

    因为第二次握手和第三次握手的过程中,服务端和客户端要分别对对方发送的报文进行相应。响应的实现就是把对方在之前报文中生成的序列号+1作为确认应答号加入报文中。如果这个序列号不是随机生成的话,或者说可以被推测出来的话,那么黑客就会根据推测出来的序列号,伪装成服务端与客户端建立连接,从而威胁客户端的数据安全。因此,为了保证网络安全,TCP的序列号必须随机生成。

    六、如果TCP三次握手的最后一次握手中出现丢包的情况会怎么样?

    首先,第三次握手的ACK报文发出之后,客户端就进入了established状态,即认为连接建立成功。但服务端由于没有收到ACK报文,则不会成功建立连接。

    但服务端会有定时器发送第二步SYN+ACK数据包的功能,此操作可使得客户端有机会再次发送ACK包,如果客户端再次发送ACK包成功,建立连接。

    如果还是失败,服务器会启动有超时(大概64s)设置,超时之后会给客户端发RTS报文,进入
    CLOSED状态,防止SYN洪泛攻击,这个时候客户端应该也会关闭连接。

    更多相关内容
  • TCP三次握手PPT课件.ppt

    2021-10-09 18:58:29
    TCP三次握手PPT,TCP三次握手TCP三次握手课件
  • TCP三次握手与四次挥手.pdf
  • 用wireshark实际操作来分析tcp三次握手的整个过程,看完会对三次握手有更深入了解
  • wireshark tcp三次握手

    2016-08-03 09:05:18
    ubuntu下自己写tcp协议(server.c,client.c,Makefile),通过tcpdump生成 .cap文件后,利用wireshark分析tcp三次握手的整个过程
  • 主要为大家介绍了网络协议之tcp协议,TCP三次握手与四次断开是怎么的一种情况呢,下面我们来看看观察TCP三次握手与四次断开,需要的朋友可以参考下
  • TCP 三次握手和四次挥手,面试题详解,图文并茂,欢迎技术交流
  • TCP三次握手和四次挥手不管是在开发还是面试中都是一个非常重要的知识点,它是我们优化web程序性能的基础。欢迎学习,一起进步 文章目录一.TCP简介二.TCP数据报结构三.TCP的三次握手四.TCP的四次挥手 一.TCP简介 TCP...
  • 动画:用动画给面试官解释 TCP 三次握手过程

    万次阅读 多人点赞 2019-10-12 07:55:38
    TCP 三次握手过程对于面试是必考的一个,所以不但要掌握 TCP 整个握手的过程,其中有些小细节也更受到面试官的青睐。 对于这部分掌握以及 TCP 的四次挥手,小鹿将会以动画的形式呈现给每个人,这样将复杂的知识简单...

    在这里插入图片描述
    作者 | 小鹿
    来源 | 公众号:小鹿动画学编程


    写在前边

    TCP 三次握手过程对于面试是必考的一个,所以不但要掌握 TCP 整个握手的过程,其中有些小细节也更受到面试官的青睐。

    对于这部分掌握以及 TCP 的四次挥手,小鹿将会以动画的形式呈现给每个人,这样将复杂的知识简单化,理解起来也容易了很多,尤其对于一个初学者来说。


    学习导图

    在这里插入图片描述

    一、TCP 是什么?

    TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。

    我们知道了上述了解到了 TCP 的定义,通俗一点的讲,TCP 就是一个双方通信的一个规范标准(协议)。

    我们在学习 TCP 握手过程之前,首先必须了解 TCP 报文头部的一些标志信息,因为在 TCP 握手的过程中,会使用到这些报文信息,如果没有掌握这些信息,在学习握手过程中,整个人处于懵逼状态,也是为了能够深入 TCP 三次握手的原理。


    二、TCP 头部报文

    在这里插入图片描述

    2.1 source portdestination port

    两者分别为「源端口号」和「目的端口号」。源端口号就是指本地端口,目的端口就是远程端口。

    一个数据包(pocket)被解封装成数据段(segment)后就会涉及到连接上层协议的端口问题。

    可以这么理解,我们可以想象发送方很多的窗户,接收方也有很多的窗户,这些窗口都标有不同的端口号,源端口号和目的端口号就分别代表从哪个规定的串口发送到对方接收的窗口。不同的应用程度都有着不同的端口,之前网络分层的文章中有提到过。
    在这里插入图片描述

    扩展:应用程序的端口号和应用程序所在主机的 IP 地址统称为 socket(套接字),IP:端口号, 在互联网上 socket 唯一标识每一个应用程序,源端口+源IP+目的端口+目的IP称为”套接字对“,一对套接字就是一个连接,一个客户端与服务器之间的连接。


    2.2 Sequence Numbe

    称为「序列号」。用于 TCP 通信过程中某一传输方向上字节流的每个字节的编号,为了确保数据通信的有序性,避免网络中乱序的问题。接收端根据这个编号进行确认,保证分割的数据段在原始数据包的位置。

    在这里插入图片描述
    再通俗一点的讲,每个字段在传送中用序列号来标记自己位置的,而这个字段就是用来完成双方传输中确保字段原始位置是按照传输顺序的。(发送方是数据是怎样一个顺序,到了接受方也要确保是这个顺序)

    PS:初始序列号由自己定,而后绪的序列号由对端的 ACK 决定:SN_x = ACK_y (x 的序列号 = y 发给 x 的 ACK),这里后边会讲到。


    2.3 Acknowledgment Numbe

    称为「确认序列号」。确认序列号是接收确认端所期望收到的下一序列号。确认序号应当是上次已成功收到数据字节序号加1,只有当标志位中的 ACK 标志为 1 时该确认序列号的字段才有效。主要用来解决不丢包的问题。

    若确认号=N,则表明:到序号N-1为止的所有数据都已正确收到。

    在这里,现在我们只需知道它的作用是什么,就是在数据传输的时候是一段一段的,都是由序列号进行标识的,所以说,接收端每接收一段,之后就想要的下一段的序列号就称为「确认序列号」。


    2.4 TCP Flag

    TCP 首部中有 6 个标志比特,它们中的多个可同时被设置为 1,主要是用于操控 TCP 的状态机的,依次为URG,ACK,PSH,RST,SYN,FIN

    不要求初学者全部掌握,在这里只讲三个重点的标志:


    2.4.1 ACK

    这个标识可以理解为发送端发送数据到接收端,发送的时候 ACK 为 0,标识接收端还未应答,一旦接收端接收数据之后,就将 ACK 置为 1,发送端接收到之后,就知道了接收端已经接收了数据。
    在这里插入图片描述

    此标志表示「应答域有效」,就是说前面所说的TCP应答号将会包含在 TCP 数据包中;有两个取值:0 和 1,为 1 的时候表示应答域有效,反之为 0;


    2.4.2 SYN

    表示「同步序列号」,是 TCP 握手的发送的第一个数据包。

    用来建立 TCP 的连接。SYN 标志位和 ACK 标志位搭配使用,当连接请求的时候,SYN=1,ACK=0连接被响应的时候,SYN=1,ACK=1;这个标志的数据包经常被用来进行端口扫描。扫描者发送一个只有 SYN 的数据包,如果对方主机响应了一个数据包回来 ,就表明这台主机存在这个端口。看下面动画:
    在这里插入图片描述

    2.4.3 FIN

    表示发送端已经达到数据末尾,也就是说双方的数据传送完成,没有数据可以传送了,发送FIN标志位的 TCP 数据包后,连接将被断开。这个标志的数据包也经常被用于进行端口扫描。

    这个很好理解,就是说,发送端只剩最后的一段数据了,同时要告诉接收端后边没有数据可以接受了,所以用FIN标识一下,接收端看到这个FIN之后,哦!这是接受的最后的数据,接受完就关闭了。动画如下:
    在这里插入图片描述

    2.5 Window size

    称为滑动窗口大小。所说的滑动窗口,用来进行流量控制。


    3、为什么进行 TCP 三次握手?

    如果之前你不了解网络分层的话,建议看看写的文章。

    你真的懂网络分层协议吗?

    第一,为了确认双方的接收与发送能力是否正常。第二,指定自己的初始化序列号,为后面的可靠传送做准备。第三,如果是 https 协议的话,三次握手这个过程,还会进行数字证书的验证以及加密密钥的生成到。

    如果你了解 UDP 的话,TCP 的出现正式弥补了 UDP 不可靠传输的缺点。但是 TCP 的诞生,也必然增加了连接的复杂性。


    4、TCP 三次握手过程?

    TCP 三次握手的过程掌握最重要的两点就是客户端和服务端状态的变化,另一个是三次握手过程标志信息的变化,那么掌握 TCP 的三次握手就简单多了。下面我们就以动画形式进行拆解三次握手过程。
    在这里插入图片描述

    • 初始状态:客户端处于 closed(关闭)状态,服务器处于 listen(监听) 状态。
      在这里插入图片描述
    • 第一次握手:客户端发送请求报文将 SYN = 1同步序列号和初始化序列号seq = x发送给服务端,发送完之后客户端处于SYN_Send状态。

    在这里插入图片描述

    • 第二次握手:服务端受到 SYN 请求报文之后,如果同意连接,会以自己的同步序列号SYN(服务端) = 1、初始化序列号 seq = y和确认序列号(期望下次收到的数据包)ack = x+ 1 以及确认号ACK = 1报文作为应答,服务器为SYN_Receive状态。

    在这里插入图片描述

    • 第三次握手: 客户端接收到服务端的 SYN + ACK之后,知道可以下次可以发送了下一序列的数据包了,然后发送同步序列号 ack = y + 1和数据包的序列号 seq = x + 1以及确认号ACK = 1确认包作为应答,客户端转为established状态。

    在这里插入图片描述

    5、为什么不是一次、二次握手?

    防止了服务器端的一直等待而浪费资源。

    为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。如果此时客户端发送的延迟的握手信息服务器收到,然后服务器进行响应,认为客户端要和它建立连接,此时客户端并没有这个意思,但 server 却以为新的运输连接已经建立,并一直等待 client 发来数据。这样,server 的很多资源就白白浪费掉了。


    ----------------------------------------------------------------------- 于2019/11/11 修改 ------------------------------------------------------------------
    主要对文章中存在的笔误和错误进行了修改,动画也进行了重新制作和修改,文章内容也进行的部分内容增加 —— 三次握手过程详细细节部分。再次感谢大家对小鹿文章的支持!

    下一篇:动画:用动画给女朋友讲解 TCP 四次分手过程


    福利:可以在我的公众号『小鹿动画学编程』,后台回复『资源』即可获取。

    ❤️ 不要忘记留下你学习的脚印 [点赞 + 收藏 + 评论]

    一些后台小伙伴问我平常如何学习的,学习资料哪里获取,我就不一一回复了!一般我都是通过看一些编程书籍和开源的社区进行自学,一些学习资料和电子书也分享到下边了,有需要的自取。

    编程在于永无止境的去学习,去学习前辈积累的经验,书籍就是最好的一种媒介方式,列出以下自己看过的优秀书籍,整理成了 PDF 版。

    • 前端:《javascript高级程序设计》《JavaScript 权威指南》《你不知道的JavaScript(上中下卷)》等;
    • java:《Effective Java》《Thinking in Java》《Java 编程思想》《java核心技术》等;
    • 算法:《大话数据结构》《算法图解》《算法导论》《编程之美》《数据结构与算法:C语言描述》等;
    • 其他相关计算机书籍;

    搜索我的公众号:「小鹿动画学编程」后台回复关键词

    • 回复「后台」,获取 java 等自学资料
    • 回复「前端」,获取前端等自学资料
    • 回复「电子书」获取一下书籍资料!

    动一动你的小手,点赞就完事了,每个人出一份力量(点赞 + 评论)就会让更多的学习者加入进来!非常感谢! ̄ω ̄=


    作者Info:

    【作者】:小鹿

    【原创公众号】:小鹿动画学编程。

    【简介】:和小鹿同学一起用动画的方式从零基础学编程,将 Web前端领域、数据结构与算法、网络原理等通俗易懂的呈献给小伙伴。先定个小目标,原创 1000 篇的动画技术文章,和各位小伙伴共同努力一起学习!公众号回复 “资料” 送一从零自学资料大礼包!

    【转载说明】:转载请说明出处,谢谢合作!~

    展开全文
  • 深入浅出TCP三次握手 (多图详解)

    万次阅读 多人点赞 2021-11-07 18:49:08
    TCP三次握手和四次挥手是面试题的热门考点,它们分别对应TCP的连接和释放过程,今天我们先来认识一下TCP三次握手过程,以及是否可以使用“两报文握手”建立连接?。 1、TCP是什么? TCP是面向连接的协议,它基于...

    前言

    TCP三次握手和四次挥手是面试题的热门考点,它们分别对应TCP的连接和释放过程,今天我们先来认识一下TCP三次握手过程,以及是否可以使用“两报文握手”建立连接?。

    1、TCP是什么?

    TCP是面向连接的协议,它基于运输连接来传送TCP报文段,TCP运输连接的建立和释放,是每一次面向连接的通信中必不可少的过程。

    TCP运输连接有以下三个阶段:

    • 建立TCP连接,也就是通过三报文握手来建立TCP连接。
    • 数据传送,也就是基于已建立的TCP连接进行可靠的数据传输。
    • 释放连接,也就是在数据传输结束后,还要通过四报文挥手来释放TCP连接。

    TCP的运输连接管理就是使运输连接的建立和释放都能正常的进行。

    2、TCP首部格式

    在这里插入图片描述

    源端口: 占16比特,写入源端口号,用来 标识发送该TCP报文段的应用进程。
    目的端口: 占16比特,写入目的端口号,用来标识接收该TCP报文段的应用进程。

    序号: 占32比特,取值范围[0,2^32-1],序号增加到最后一个后,下一个序号就又回到0。指出本TCP报文段数据载荷的第一个字节的序号。

    确认号: 占32比特,取值范围[0,2^32-1],确认号增加到最后一个后,下一个确认号就又回到0。指出期望收到对方下一个TCP报文段的数据载荷的第一个字节的序号,同时也是对之前收到的所有数据的确认。若确认号=n,则表明到序号n-1为止的所有数据都已正确接收,期望接收序号为n的数据。

    确认标志位ACK: 取值为1时确认号字段才有效;取值为0时确认号字段无效。TCP规定,在连接建立后所有传送的TCP报文段都必须把ACK置1。

    数据偏移: 占4比特,并以4字节为单位。用来指出TCP报文段的数据载荷部分的起始处距离TCP报文段的起始处有多远。这个字段实际上是指出了TCP报文段的首部长度。

    窗口: 占16比特,以字节为单位。指出发送本报文段的一方的接收窗。

    同步标志位SYN: 在TCP连接建立时用来同步序号。终止标志位FIN: 用来释放TCP连接。复位标志位RST: 用来复位TCP连接。

    推送标志位PSH: 接收方的TCP收到该标志位为1的报文段会尽快上交应用进程,而不必等到接收缓存都填满后再向上交付。

    校验和: 占16比特,检查范围包括TCP报文段的首部和数据载荷两部分。在计算校验和时,要在TCP报文段的前面加上12字节的伪首部。

    紧急指针: 占16比特,以字节为单位,用来指明紧急数据的长度。

    填充: 由于选项的长度可变,因此使用填充来 确保报文段首部能被4整除,(因为数据偏移字段,也就是首部长度字段,是以4字节为单位的)。

    3、TCP的连接建立

    TCP 建立连接的过程叫做握手,握手需要在客户和服务器之间交换三个TCP 报文段,称之为三报文握手,采用三报文握手主要是为了防止已失效的连接请求报文段突然又传送到了,因而产生错误。

    TCP的连接建立要解决以下三个问题:

    • 1、使TCP双方能够确知对方的存在 。

    • 2、使TCP双方能够协商一些参数( 最大窗口值是否使用窗口扩大选项和时间戳选项,以及服务质量等)。

    • 3、使TCP双方能够对运输实体资源(例如缓存大小连接表中的项目等)进行分配。

    4、三次握手图文详解

    这是两台要基于TCP进行通信的主机:

    • 主动发起TCP连接建立称为TCP客户(client)。

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

    我们可以将TCP建立连接的过程比喻为”握手“,“握手”需要在TCP客户端和服务器之间交换三个TCP报文段。

    最初两端的TCP进程都处于关闭状态。

    一开始,TCP服务器进程首先创建传输控制块,用来存储TCP连接中的一些重要信息。 例如TCP连接表、指向发送和接收缓存的指针、指向重传队列的指针,当前的发送和接收序号等。之后就准备接受TCP客户进程的连接请求, 此时TCP服务器进程就要进入监听状态等待TCP客户进程的连接请求。

    TCP客户进程也是首先创建传输控制块,然后再打算建立。 TCP服务器进程是被动等待来自TCP客户端进程的连接请求,因此称为被动打开连接。

    TCP连接时向TCP服务器进程发送TCP连接请求报文段,并进入同步已发送状态。

    • TCP 连接请求报文段首部中的同步位SYN被设置为1,,表明这是一个tcp连接请求报文段。

    • 序号字段seq被设置了一个初始值x作为TCP客户进程所选择的初始序号。

    由于TCP连接建立是由TCP客户进程主动发起的,因此称为主动打开连接。 请注意TCP规定SYN被设置为1的报文段不能携带数据但要消耗掉一个序号。

    TCP服务器进程收到TCP连接请求报文段后,如果同意建立连接,则向TCP客户进程发送TCP连接请求确认报文段,并进入同步已接收状态。

    • 该报文段首部中的同步位SYN和确认位ACK 都设置为1,表明这是一个TCP连接请求。
    • 序号字段seq被设置了一个初始值y,作为TCP服务器进程所选择的初始序号。
    • 确认号字段ack的值被设置成了x+1,这是对TCP客户进程所选择的初始序号seq的确认。

    请注意这个报文段也不能携带数据,因为它是SYN被设置为一的报文段但同样要消耗掉一个序号。

    TCP客户进程收到TCP连接请求确认报文段后,还要向TCP服务器进程发送一个普通的TCP 确认报文段并进入连接已建立状态。

    • 该报文段首部中的确认位ACK被设置为1,表明这是一个普通的TCP确认报文段 。
    • 序号字段seq 被设置为x+1,这是因为TCP客户进程发送的第一个TCP报文段的序号为x,并且不携带数据,因此第二个报文段的序号为x +1。
    • 确认号字段ack被设置为y + 1,这是对TCP服务器进程所选择的初始序号的确认。

    请注意TCP规定,普通的TCP确认报文段可以携带数据。但如果不携带数据则不消耗序号,在这种情况下所发送的下一个数据报文段的序号仍是x + 1。

    TCP服务器进程收到该确认报文段后也进入连接已建立状态,现在TCP双方都进入了连接已建立状态,他们可以基于已建立好的TCP连接进行可靠的数据传输了。

    5、三次握手文字总结

    三次握手是 TCP 连接的建立过程。在握手之前,主动打开连接的客户端结束 CLOSE 阶段,被动打开的服务器也结束 CLOSE 阶段,并进入 LISTEN 阶段。随后进入三次握手阶段:

    ① 首先客户端向服务器发送一个 SYN 包,并等待服务器确认,其中:

    • 标志位为 SYN,表示请求建立连接;
    • 序号为 Seq = x(x 一般取随机数);
    • 随后客户端进入 SYN-SENT 阶段。

    ② 服务器接收到客户端发来的 SYN 包后,对该包进行确认后结束 LISTEN 阶段,并返回一段 TCP 报文,其中:

    • 标志位为 SYN 和 ACK,表示确认客户端的报文 Seq 序号有效,服务器能正常接收客户端发送的数据,并同意创建新连接;
    • 序号为 Seq = y;
    • 确认号为 Ack = x + 1,表示收到客户端的序号 Seq 并将其值加 1 作为自己确认号 Ack 的值,随后服务器端进入 SYN-RECV 阶段。

    ③ 客户端接收到发送的 SYN + ACK 包后,明确了从客户端到服务器的数据传输是正常的,从而结束 SYN-SENT 阶段。并返回最后一段报文。其中:

    • 标志位为 ACK,表示确认收到服务器端同意连接的信号;
    • 序号为 Seq = x + 1,表示收到服务器端的确认号 Ack,并将其值作为自己的序号值;
    • 确认号为 Ack= y + 1,表示收到服务器端序号 seq,并将其值加 1 作为自己的确认号 Ack 的值。
    • 随后客户端进入 ESTABLISHED。

    当服务器端收到来自客户端确认收到服务器数据的报文后,得知从服务器到客户端的数据传输是正常的,从而结束 SYN-RECV 阶段,进入 ESTABLISHED 阶段,从而完成三次握手。

    5、是否可以使用“两报文握手”建立连接?

    为什么TCP客户进程最后还要发送一个普通的TCP确认报文段?

    考虑这样一种情况,TCP客户进程发出一个TCP连接请求报文段,但该报文段在某些网络节点长时间滞留了,这必然会造成该报文段的超时重传。

    假设重传的报文段被TCP服务器进程正常接收,TCP服务器进程给TCP客户进程发送一个TCP连接请求确认报文段,并进入连接已建立状态。

    请注意,由于我们改为两报文握手,因此TCP服务器进程发送完TCP连接请求确认报文段后,进入的是连接已建立状态,而不像三报文握手那样进入同步已接收状态,TCP服务器进程并等待TCP客户进程发来针对TCP连接请求确认报文段的普通确认报文段。TCP客户进程收到TCP连接请求确认报文段后进入TCP连接已建立状态,但不会给TCP服务器进程发送针对该报文段的普通确认报文段。

    现在,TCP双方都处于连接已建立状态,他们可以相互传输数据,之后可以通过四报文挥手来释放连接,TCP双方都进入了关闭状态。

    一段时间后,之前滞留在网络中的那个失效的TCP连接请求报文段到达了TCP服务器进程,TCP 服务器进程会误认为这是TCP客户进程又发起了一个新的TCP连接请求,于是给TCP客户进程发送TCP连接请求确认报文段并进入连接已建立状态。

    该报文段到达TCP客户进程,由于TCP客户进程并没有发起新的TCP连接请求,并且处于关闭状态,因此不会理会该报文段。

    但TCP服务器进程已进入了连接已建立状态,他认为新的TCP连接已建立好了,并一直等待TCP客户进程发来数据。这将白白浪费TCP服务器进程所在主机的很多资源。

    综上所述,采用三报文握手,而不是两报文握手来建立TCP连接,是为了防止已失效的连接请求报文段突然又传送到了TCP服务器进程因而导致错误。


    6、两次握手文字总结

    三次握手的主要目的是确认自己和对方的发送和接收都是正常的,从而保证了双方能够进行可靠通信。若采用两次握手,当第二次握手后就建立连接的话,此时客户端知道服务器能够正常接收到自己发送的数据,而服务器并不知道客户端是否能够收到自己发送的数据。

    我们知道网络往往是非理想状态的(存在丢包和延迟),当客户端发起创建连接的请求时,如果服务器直接创建了这个连接并返回包含 SYN、ACK 和 Seq 等内容的数据包给客户端,这个数据包因为网络传输的原因丢失了,丢失之后客户端就一直接收不到返回的数据包。由于客户端可能设置了一个超时时间,一段时间后就关闭了连接建立的请求,再重新发起新的请求,而服务器端是不知道的,如果没有第三次握手告诉服务器客户端能否收到服务器传输的数据的话,服务器端的端口就会一直开着,等到客户端因超时重新发出请求时,服务器就会重新开启一个端口连接。长此以往, 这样的端口越来越多,就会造成服务器开销的浪费。


    展开全文
  • 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三次握手

    2012-07-26 23:40:06
    Socket模拟TCP三次握手,网上找到
  • TCP三次握手简述

    千次阅读 2021-09-15 22:09:36
    TCP三次握手什么是TCP连接TCP头部格式TCP建立连接(三次握手)建立连接过程:建立连接过程异常:TCP 第⼀次握⼿的 SYN 丢包了:TCP 第⼆次握⼿的 SYN、ACK 丢包了:TCP 第三次握⼿的 ACK 包丢了:为什么是三次握手:...
  • TCP三次握手,四次挥手这是一个非常重要的知识点,我也来总结一下。 关于面试最经常问的问题无非就是: 握手为什么是3次? 2次可以吗? 为什么不是4次呢? 你能不能详细的介绍一下TCP三次握手的详细过程? 能不能说...
  • TCP三次握手: 废话不多说, 直接上代码以及图例 (为了让大家方便阅读, 都有自己验证过程的一些图片作为分享) 。 1. 了解 TCP Connection 1. 在了解 TCP 之前我们需要了解的一个概念 TCP Connection : 1. 在我们的...
  • tcp三次握手

    千次阅读 2020-08-25 22:28:18
    三次握手: 第一次握手:建立连接时,客户端发送SYN包到服务器,并进入SYN_SEND状态,等待服务器确认 第二次握手:服务器收到SYN包,必须确认客户的SYN,同时自己也发送一个SYN包,即SYN+ACK,此时服务端进入SYN_...
  • TCP三次握手,四次挥手详解

    千次阅读 多人点赞 2021-09-09 14:49:37
    TCP头部 首先说下TCP的头部,TCP头部是实现TCP协议的重要部分。 如上图所示,TCP头部主要包括以下信息: ...下一期望获得的数据包的序列号seq 5、 4个标识位 1、SYN SYN = 1,代表这个数据包是一个客户端的请求
  • TCP三次握手原理

    万次阅读 多人点赞 2019-10-22 09:06:54
    TCP协议\TCP三次握手
  • 使用Wireshark浅析Tcp三次握手

    千次阅读 2021-12-27 09:55:48
    用一些简单的实例,让大家真正了解三次握手
  • TCP 三次握手和四次挥手

    千次阅读 2022-02-28 10:37:54
    一、TCP 报文格式 其中比较重要的字段有: 1️⃣序号(sequence number):Seq ,占 32 位,用来标识从 TCP 源端向目的端发送的字节流,发起方发送数据时对此进行标记。 2️⃣确认号(acknowledgement number):Ack,...
  • 文章目录TCP介绍三次握手四次挥手滑动窗口拥塞避免算法 TCP介绍 三次握手 四次挥手
  • 通过图解,简单明了的介绍了tcp三次握手/四次挥手的全过程,解释为什么建立连接协议是三次握手,而关闭连接却是四次握手
  • tcp三次握手丢包后会发生什么

    千次阅读 2022-02-27 21:03:53
    本片文章会用到以下工具来学习tcp三次握手: tcpdup,一个运行在用户态的应用程序,它本质上是通过调用 libpcap 库的各种 api 来实现数据包的抓取功能。数据包到达网卡后,经过数据包过滤器(BPF)筛选后,拷贝至...
  • 三次的ACK在网络中丢失,那么Server 端该TCP连接的状态为SYN_RECV,并且会根据 TCP的超时重传机制,会等待3秒、6秒、12秒后重新发送SYN+ACK包,以便Client重新发送ACK包。 而Server重发SYN+ACK包的次数,可以...
  • TCP三次握手详解-深入浅出(有图实例演示)

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

    千次阅读 2022-01-27 22:17:49
    文章目录系列文章目录一、三次握手二、TCP安全性1.SYN洪泛攻击 一、三次握手 第一步:客户端的TCP首先向服务器端的TCP发送一个特殊的TCP报文段。该报文段中不包含应用层数据。但是在报文段的首部中的一个标志位(即...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 176,808
精华内容 70,723
关键字:

tcp 三次握手

友情链接: EC_M480_CMOS_V1.00.zip