11.计算机网络---传输层/TCP- UDP协议/三次握手、四次挥手

      最后更新:2022-07-29 01:27:20 手机定位技术交流文章

      我以前学过很多网络层协议,例如IP协议、arp协议、icmp协议等。接下来,我们将研究TCP/IP五级协议中的三级传输协议:TCP协议和UDP协议。在TCP协议中,三个或四个握手是很重要的。

      文章目录

      • 传输层协议
        • TCP和UDP
        • TCP的封装格式
        • TCP其他问题
        • 三次握手
        • 四次挥手
        • 三个手和四个握手的整体流程图
        • 关于三手和四手的常见问题
        • UDP

      传输层协议

      传输层协议包括TCP和UDP
      选择传输层的协议取决于应用层的特性和业务特性
      传输层的作用:IP层提供点到点连接,传输层提供端到端连接
      不同的应用程序监控不同的端口,以不同的端口编号区分它们,并以不同的端口编号连接应用程序层和传输层
      socket 套接字: ip+port 192.168.0.1:80 -->一个程序占用一个ip地址的一个端口号
      访问这个音节是访问一个程序
      在传输层中的经典端口数目比较:

      http    80    -TCP
      mysql   3306    -TCP
      ssh 22 - TCP(秘密转让)
      ftp     21    -TCP
      telnet 23 - TCP(远程控制,纯文本传输,不安全)
      SMTP25-TCP(发送邮件)
      pop3 110 - TCP(邮件接收)
      dns 53 - TCP(dns主机与服务器之间的数据传输)
      dns 53 - UDP(UDP在域名分析中)
      QQ    8000    -UDP
      dhcp    67    -UDP
      ntp(网络时间协议)    123    -UDP

      TCP和UDP

      TCP(Transmission Control Protocol):面向连接,可靠,手续多,但是速度慢(可以比喻成打电话)
      特点:

      • 传输控制协议
      • 可靠的连接导向协议(三个手,四个哨声反映了连接导向特性;计时器,继电器计时器反映了可靠性特性)
      • 低输送效率(面向连接,需要确认,反映低输送效率的特点)

      UDP(User Datagram Protocol):没有连接,不可靠,没有手续,而且更快(例如发送短信)
      QQ,dhcp是UDP,QQ服务器的端口号码是800
      特点:

      • 用户数据报协议
      • 不可靠、未连接服务
      • 传输效率高

      TCP的封装格式

      TCP加密格式:加密头字为20字节(IP头字也是20字节,帧头字为18字节)
      在这里插入图片描述

      1. 端口数从0到65535之间,即2^16[0-1024]是经典的端口数,不应使用
      2. 序列数:数据段标记用于重新组织到达目的地的包
      3. 确认编号(缺口序列):发送者确认信息,通知发件人,所有数据项在该序列编号之前收到(如果A至B发送的确认编号为100,B对A的回答是99,然后证明100B没有得到,如果B答案为1001,这证明了一千人已经收到了,只有ACK标记是1小时。确认序列号才有效,ack=前一个的seq+1

      教师书中的序列数和确认数的分析:
      在这里插入图片描述

      1. 6个标记位置(0或1):
        URG (urgent):紧急指针有效位,与16位紧急指针配合使用
        ACK(acknowledgement):确认序列号有效位,表明该数据包包含确认信息,三次连接之后,ACK位一直置为1
        PSH:通知接收机立即向用户进程提交数据,不要留在缓存中,等待更多数据
        RST(reset):要求重建TCP连接-替换
        SYN:请求连接-同步
        FIN(finish):数据发送完毕,请求断开连接
      2. 窗口大小:滑动窗口的大小,指示可以本地接收的字节数目(通过指定滑动窗口的大小来控制交通)

      TCP其他问题

      拥挤窗口拥挤窗口
      中间链的宽度很窄,传输过程中的窗口的大小取决于拥挤窗口的大小(称为cwnd),这决定了滑动窗口的大小
      交通堵塞控制的四个算法(交通堵塞解决方案的四个阶段):
      1)慢启动;
      2)拥塞避免;
      3)交通堵塞发生(快速重复);
      4)快速恢复
      在这里插入图片描述
      控制TCP错误有三个方法:

      • 检查和检查包装头是否更改
      • 确认
        • 受损伤的数据段
        • 丢失的数据段
        • 重复的数据段
        • 失序的数据段
        • 确认的丢失
      • 超时 —计时器
        • 重发时间表-控制丢失数据段,最多重发三次
        • 坚持计时器 - 防止零窗口僵局
        • 维护计时器-防止两个TCP之间的连接长期处于闲置状态
        • 等待时间计时器—用于连接终止期间,它不会在发送最后的ACK后立即关闭连接,而是等待一段时间,以确保重复的 FIN数据段被接收,2MSL

      三次握手

      服务器和客户端通过三个握手建立连接,那么三个握手的具体过程是什么?
      在这里插入图片描述
      至于三个手,我理解如下:
      首先,我们假设有客户A和服务器B,现在A想要访问B,所以首先我们需要连接到B。

      1. 刚开始的时候,客户端是处于一个closed的状态,服务器端由closed的状态被动的变为listen状态。
      2. 第一次握手:客户端给服务器端发送一个SYN报文(也就是TCP封装格式中的标志位的SYN置为1),并且指明客户端的初始序列号seq为x。此时,客户端处于SYN_SENT状态。
      3. 第二次握手:从服务器接收客户端SYN消息后,它还向客户发送SYN消息,表示同意建立连接,并且序列号确认该位置的有效性也是1。然后,您还指定你的序列数为y的seq,确认数ACK是x+1,指示客户已经收到SYN消息。此时,服务端处于SYN_RCVD状态。
      4. 第三次握手:客户端收到服务端的SYN报文后,会发送一个ACK报文,也会把服务端的初始序列号y+1作为自己的确认号ACK的值,表示收到了服务端的SYN报文。此时,客户端处于established状态
      5. 接收ACK消息后,服务端也处于既定状态。 自那时起,双方都建立了可以传输数据的连接。

      四次挥手

      当服务端和客户端的数据传送完成之后,便要断开连接,这个连接可以是客户端主动叉掉页面断开的,也可以超过连接时间了,服务端主动断开的,接下来我以客户端主动断开为例来说明这个过程:
      在这里插入图片描述
      刚开始的时候,双方都处于established状态。

      1. 第一次挥手:客户端发送了FIN报文给服务端,报文中指定了初始序列号为u。此时,客户端处于FIN_WAIT1的状态。
      2. 第二次手势:收到客户 FIN 消息后,向客户端发送ACK消息,指对方收到的财务报表。这个报文中,将使用客户端的序列号码u+1作为其自己的ACK消息确认号码的值,它还生成了一个初始序列数v。此时,服务端处于CLOSE_WAIT状态。
      3. 第三次挥手:如果服务器此时也想要断开,跟客户端的第一次挥手一样,会再给客户端发送一个FIN报文,随机指定一个序列号seq为w。此时,服务端处于LAST_ACK的状态。
      4. 第四个手势:客户从服务端接收 FIN消息,同样将发送ACK消息作为回应,它还使用服务端的编号w+1作为其自己的ACK消息确认号码的值。此时,客户端处于Time_WAIT状态,在进入CLOSED状态之前,需要一段时间才能确保服务端收到自己的ACK消息,它通常等待2MSL。
      5. 服务端收到ACK报文后,就处于关闭连接了,处于CLOSED状态。自此,四次挥手的过程也结束了。

      三个手和四个握手的整体流程图

      在这里插入图片描述

      关于三手和四手的常见问题

      为什么三次握手?
      三个握手的目的在于建立一个可靠的通讯渠道,在沟通方面,它只是发送和接收数据,而三个握手的主要目的是双方确认自己和对方的发送和接收是正常
      发送者: 不能确认任何东西; 接收者: 对方正常发送, 正常接受
      发送者: 发送者接受正常, 接受正常, 发送正常, 接受正常; 接收者: 发送者接受正常, 接受正常
      第三手握手,发送者:发送者正常接受,发送者正常接受;接收者:发送者正常接受,发送者正常接受
      你为什么在连接时摇晃三次,在关闭时摇摆四次?
      因为当服务器端从客户端端接收SYN连接请求消息时,您可以直接发送SYN+ACK消息。其中ACK声明用于答复,SYN消息用于同步。但是关闭连接时,当服务器端接收 FIN消息时,它可能不会马上关闭SOCKET,所以你只能先回答ACK消息,告诉客户结束,“我收到你寄来的财务报告。”只有在我服务器端的所有消息才被发送,我可以寄出财务报表,因此不能一起发送。故需要四步握手。
      问题3为什么 TIME_WAIT状态需要通过2MSL(最大报告期间存活时间)才能返回CLOSE状态?
      答:虽然按道理,所有四份报告都已送达,我们可以直接进入CLOSE状态,但我们必须假设网络不可靠。这是你输掉的最后的ACK。因此, TIME_WAIT状态被用来检索可能丢失的ACK消息。向客户发送最后的ACK响应,但ACK可能丢失。如果服务器没有收到ACK,最后的片段将被重复发送。因此客户不能立即关闭,它必须确认服务器已经收到ACK。客户端在发送ACK后进入 TIME_WAIT状态。客户端将设置一个计时器,等待2MSL时间。如果在该期间再次收到 FIN,然后客户端将重新启动ACK并再次等待2MSL。所谓的2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个网络中的断片最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。timewait理论上最长等待4分钟。
      你为什么不能用两手做联系?
      答:3次握手完成两个重要的功能,既要双方做好发送数据的准备工作(双方都知道彼此已准备好),也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。
      现在把三个手换成两个,死锁是可能发生的。作为例子,考虑计算机S和C之间的通信,假设C发送S一个连接请求子集,S收到了这个分组,同时 向 反应 单位 发出 了 确认 。根据双方的协议,S 认为, 该 联系 已 成功 地 建立,你可以开始发送数据子集。可是,C 若S 的响应子集在传输中丢失,我们不知道S是否准备好,我不知道S是怎样的序列数,C甚至怀疑S是否收到自己的连接请求分组。在这种情况下,C 认为, 尚未 成功 地 建立 联系,会忽略S发送的任何数据子集,只等待由子组答复的连接确认.在S被发送后,分组加班,重复发送相同的子组。这样就形成了死锁。
      如果连接已经建立,但客户端突然失败,怎么办?
      TCP还有一个实时计时器,显然,如果客户端失败,服务器不能永远等待,白白浪费资源。每次服务器收到客户端的请求,它会重新设置计时器,时间通常定为2小时,如果客户两个小时没有收到任何数据,服务器将发送检测信息,随后,每75秒发送一次消息。如果一行中发送了10个检测消息,但仍没有响应,服务器假设客户端有故障,接着就关闭连接。
      问6为什么服务器等待时间比平常多?
      时滞发生在四手挥手的主动断开侧面,更多的等待意味着更多的服务会被中断,一方面,可以说服务器具有大量访问权限,如果访问量小,等待这么多时间是不可能的。另外一方面,用户进入您的服务后,很长时间没有收到新的请求,也就是说,用户不再看你的网站。
      【问题7】服务器timewait比较多,会造成一定的时间和资源浪费,如何高效的利用timewait的等待时间呢?
      编辑内核文件/etc/sysctl.conf,添加以下内容:
      net.ipv4.tcp_syncookies = 1 表示SYN Cookie 的打开。 当SYN 等待队列溢出时, cookies 被启用处理, 防止少量SYN攻击, 默认值为 0, 这意味着关闭;
      net.ipv4.tcp_tw_reuse = 1 表示开放的重用。 允许重新使用新的TCP连接的 TIME-WAIT接口,默认为0,表示关闭;
      net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
      net.ipv4.tcp_fin_timeout 修改系默认的 TIMEOUT 时间
      然后执行 / sbin/sysctl - p 给参数效果.
      /etc/sysctl.Conf是一个允许运行Linux系统更改的接口,它包含一些高级选项,用于TCP/IP堆栈和虚拟存储系统,永久修改内核参数,并优化内核参数。
      只需打开系统重新使用并快速恢复 TIMEWAIT。
      服务器的 lastack 比较有什么问题?
      LAST_ACK在被动切断者手中发生四次,表明有许多主机访问您,然后再次切断,可能故意攻击您的服务器,造成资源浪费。
      问9SYN香港 Fan Pan攻击是什么?
      SYN Flood利用TCP协议缺陷,发送大量伪造的TCP连接请求,第一个接口包(SYN packet)发送大量请求的连接,通常使用伪名IP或IP号码。攻击服务器响应第二个握手包(SYN+ACK包),因为另一方是假的IP,另一人将永远不会收到袋子,也不会对第三个手提包作出反应。导致攻击服务器维持大量SYN_RECV“半连接”状态,将重新尝试默认的5个对第二个手提包的响应,大量随机的恶意被发现填补了未完成的连接队列,从而导致正常合法 syn 不会排队,不允许正常业务请求连接.服务器端的资源分配在第二次握手时分配,当三个手完成时,客户资源都分配给对方,因此服务器易受SYN洪水的影响。
      检测SYN攻击非常方便,当您看到服务器上大量半连接状态时,特别是,源IP地址是随机的,基本上,我们可以得出一个SYN攻击(SYN攻击可以通过Linux/Unix的全系统netstats命令检测)。
      问题10如何解决SYN香港 Fan攻击?
      缩短超时(SYN Timeout)时间
      增加最大半连接数
      过滤网关防护
      SYN Cookie技术:
      当服务器接受SYN消息段时,不直接分配资源给方案协调会,只要打开一个半开的插座。然后使用SYN声明部分的源ID,目的 Id,服务器本身只知道的端口号和秘密函数生成一个cookie,然后 cookie 作为序列数向客户端响应.
      如果客户端正常建立连接, cookie + 1 的确认字段将返回.然后,服务器将验证消息的源ID,目的 Id,端口号和秘密函数计算结果,如果结果的值+1等于确认字段的值,然后证明客户刚刚请求连接,这是分配资源给TCP的时机

      更多关于三次握手四次挥手的面试题目: 三次握手、四次挥手面试常考题

      UDP

      UDP流量和错误控制:
      UDP没有流控机制
      UDP只检查和提供错误控制,并要求高级协议提供错误控制:例如TFTP协议
      在这里插入图片描述

      [有些文章内容涉及其他博客,如有违反,请与我联络删除!]

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/30667.html

          热门文章

          文章分类