传输层的TCP和UDP

      最后更新:2022-07-03 21:03:14 手机定位技术交流文章

      TCP/IP包含两个代表层协议,分别是TCP和UDP。

      • TCP是一个面向连接的可靠流量协议。流是指数据结构的连续性,当应用程序使用TCP发送消息时,虽然可以保证传输的顺序,但好像没有数据流发送到接收机之间的空隙。提供可靠的传输,实施“序列控制”或“重复控制”机制。此外,还有许多功能,如流量控制(流量控制),拥塞控制,以及增加网络利用。
      • “浏览导向”的含义是,虽然应用程序和TCP相互作用是一次数据块(大小不同),但TCP将应用程序发送的数据视为一个没有结构的流的字符串。 TCP不知道传输的字节流的意义

      在这里插入图片描述

      • UDP不是可靠的数据报告协议,精细处理将交给高级应用程序完成。 在UDP情况下,虽然可以确保发送的邮件的大小,但不能确保消息会到达,因此,应用程序有时会根据自己的需要进行重新处理。
      • TCP和UDP的优点和缺点不能以简单而绝对的方式加以比较: TCP在传输层需要可靠的传输的情况下使用;UDP主要用于通信或广播通信,要求高速度传输和实时通信。TCP和UDP应在应用程序的用途上使用。

      一、端口号

      • 端口号:数据链中的地址和IP,这些分别是MAC地址和IP地址。前者用于同一链路中识别不同的计算机,后者用于识别在TCP/IP网络中相互连接的主机和路由器。在传输层中,还有类似地址的这个概念,那就是端口号。该端口号用于识别在同一计算机上通信的不同的应用程序。因此,它也被称为程序地址。
      • 基于端口识别的应用程序:在计算机上可以同时运行多个程序。 传输层协议用于识别使用这些端口数字在主机中通信的应用程序,并准确地传输数据。
        在这里插入图片描述

      -通过IP地址、端口号、协议号识别通信:五维组的作用是确定特定通信。

      • 端口号的确定:
        **标准默认端口数:**这个方法也称为静态方法。这意味着每个应用程序都有指定的端口号码。但这并不是说你可以随意使用任何端口号码。例如,在广泛使用的应用程序协议(例如HTTP、FTP和TELNET)中使用的端口数目是固定的。这些港口被称为著名的港口,分布于0至1023之间;除已知的港口号码外,还有一些正式注册的港口号码,分布于1024至49151之间。然而,这些端口号码可以用于任何通信目的。
        **序列分配方法:**服务器需要确定监控端口号码,然而,接受服务的客户端不需要指定端口号码。在这种方法下,客户端应用程序完全可以自由设置自己的端口号码,所有权利都分配给分配的操作系统。动态分配的端口数从49152到65535之间。
        端口号码问题目前有一个客户端端口号码的末端问题

      • 端口号与协议:
        端口数由它使用的层协议确定,因此,不同的层协议可以使用相同的端口数。
        此外,这些众所周知的端口号码与传输层协议无关。 只要端口一致,同样的应用程序将被分配用于处理。

      二、 TCP

      • TCP与UDP之间存在着相当大的区别,它能充分实现数据传输中各种控制功能,可以对丢失的包进行重新控制,也可以对破损的包进行序列控制。

      • 此外,TCP作为一种以连接为导向的协议,只在通信对手存在时发送数据,从而控制流量的浪费。

      • 三次握手(重点):
        TCP提供以连接为导向的通信传输,以连接为导向的是指在数据通信开始之前,两个端之间进行准备。
        所谓“三个手”意味着当一个TCP连接建立时,客户端和服务器端必须一起发送三个包来确认连接的建立。
        在这里插入图片描述
        三次握手:

      • 第一个握手:客户端设置SYN为1,随机生成值seq=J,并发送包到服务器,客户端输入SYN_SENT状态,等待服务器确认。

      • 第二次握手:从服务器端接收包后,SYN = 1表示客户端请求建立连接,服务器端设置SYN和ACK为1,ack=J+1,随机生成的值seq=K,并向客户发送数据包,以确认连接请求,服务器端输入SYN_RCVD状态。

      • 第三次握手:客户收到确认后,检查Ack是否是J+1,ACK是否为1,如果正确,将ACK标记在1,ack=K+1,并将数据包发送到服务器上,服务器端检查Ack是否是K+1,ACK是否为1,如果正确, 连接成功地建立,客户端和服务器进入“调用”状态,完成三次握手,然后,客户端可以开始在服务器和端之间传输数据。
        SYN攻击:
        在三次握手过程中,服务器发送SYN-ACK后,在接收客户端ACK之前的TCP连接称为半开连接。此时服务器处于SYN_RCVD状态,当收到ACK后,服务器输入了STABLISHED状态。SYN攻击是一个在短时间内伪造大量不存在的IP地址的客户端,并继续向服务器发送SYN包,服务器答复了确认包,并等待客户确认,因为源地址不存在,因此,服务器需要重复到迟到为止,这些假的SYN包将占不连接的队列的生产时间,导致正常SYN请求被丢弃,因为队列已经满了,这会导致网络阻塞,甚至导致系统瘫痪。当SYN攻击时,一个典型的DDOS攻击,检测SYN攻击的方法非常简单,也就是说,如果服务器有大量的半连接状态和源IP地址是随机的,那么你就可以确定SYN被攻击了,使用下列命令使它运行:

      四次挥手:
      所谓的四波波手终止了TCP连接。指由TCP连接中断,客户端和服务端需要总共四个包,以确认连接中断。在插座编程中,这个过程由客户端或服务端用户执行关闭,整个过程的图表如下:
      在这里插入图片描述
      因为TCP连接都是双重检查的,因此,每个方向必须单独关闭,原则是当一方完成发送数据的任务时,发送 FIN以终止此方向的连接,收到 FIN 只 意味着 没有 数据 流入 这个 方向,也就是说,不再收到数据,但是,仍然可以发送数据的TCP连接,芬也被派往这个方向。关闭的第一方将执行主动关闭,另一方则实施了消极关闭,这就是上面所描述的。
      (1)第一波:客户端发送一个 FIN来关闭客户端的数据传输到服务器,然后客户端输入 FIN_WAIT_1状态。

      (2)第二波:服务器接收FIN后,发送ACK给客户端,确认该序列是接收的序列+1(与SYN类似,一个FIN占据一个序列),服务器进入CLOSE_WAIT状态。

      (3)第三波:服务器发送一个 FIN来关闭服务器向客户端的数据传输,服务器输入LAST_ACK状态。

      (4)第四波:当客户端接收 FIN后,客户端进入 TIME_WAIT状态,然后向服务器发送ACK,确认接收的序列号码+1,服务器进入CLOSED状态,完成第四波。
      为什么 TIME_WAIT状态需要通过2MSL(最大报告周期存活时间)才能返回CLOSE状态?
      原因有二:
      确保TCP协议的全双plex连接可以可靠地关闭
      确保此连接的重复数据段从网络中消失

      先说第一点,如果客户直接关闭,因此,由于IP协议或其他网络原因的不可靠,因此,服务器没有收到客户端最后的ACK响应。然后服务器将继续在加班后发送 FIN,现在客户已关闭,无法找到与重复 FIN 相符的连接,最后,服务器将接收RST而不是ACK,服务器会认为这是连接错误,并向顶层报告问题。虽然这种情况并不会导致数据丢失,然而,TCP协议不满足可靠的连接的要求。所以,客户不直接关闭,相反,保持时间等待,当你再次得到芬时,可以保证另一方收到ACK,最后正确关闭连接。

      再说第二点,如果客户直接关闭,然后再向服务器启动新的连接,我们不能保证这个新连接与新关闭的连接的端口号码不同。这意味着新的连接可能具有与旧连接相同的端口号码。通常没有问题。但有一个特殊情况:假设新的连接与已关闭的旧连接端口号码相同,如果先前的连接数据的一部分仍留在网络中,这些延迟的数据只在建立一个新的连接后到达服务器,因为新连接与旧连接的端口号码相同,另外,由于TCP协议根据接口对判断不同的连接,于是,TCP协议认为延迟的数据属于新连接,这将数据包与真正的新的连接混淆。因此TCP连接必须在 TIME_WAIT状态下等待两次MSL,这确保从这个连接中的所有数据从网络中消失。

      上面的例子是,一方面是主动关闭,另一方面是被动关闭,实际上,也有主动关闭的同时启动的例子。
      具体流程如下图:
      在这里插入图片描述
      同时挥手

      通过确认序列数目和确认响应来提高可靠性

      • 在 TCP 中,当发送器数据到达接收机主机时,接收机主机有返回已收到消息的通知的机会。这个消息称为确认响应(ACK)。当发送器发送数据时,它等待来自另一端的确认响应。如果有确认应答,说明数据已经成功地达到相反的目的.反之,数据丢失的概率很高。
      • 没有等待一定时间的确认响应,发送者可以假定数据已经丢失,然后检索。 因此,即使丢失发生,仍然可以确保数据能够到达相反的端点并实现可靠的传输。
      • 没有收到确认响应并不意味着数据必须丢失。 数据可能被另一方接收,但返回的确认在过程中应该丢失。
      • 此外,还有其他原因可能导致确认的到达延迟,而且它们往往只在源主重新发送数据后才到达,此时,源主只能根据机制检索数据。
      • 对于目标主机来说,重复接收相同的数据是不可接受的。 为了向顶级应用程序提供可靠的传输,目标主机必须放弃重复包。
      • 序列数是发送数据的序列中每个字符(8位)的数目。接收者查询接收数据TCP头部的序列数目和数据长度,发送回您应下一次收到的序列号码作为确认您应答复的.通过序列号码和认可的答复号码,TCP可以确定数据是否收到,它还能够确定是否需要接受,从而实现可靠传输。
        在这里插入图片描述
        延迟ACK:
        如果您简单地发送确认,费用将更高(IP字节20字节 + TCP字节20字节)。
        TCP延迟ACK旨在解决这一问题并提高网络性能,它将多个ACK响应结合成一个响应,或将ACK响应与响应数据一起发送给另一方,从而降低协议成本。
        具体如下:

      如需发送答复数据,ACK将立即向另一方发送答复数据;
      如果没有响应数据,ACK将延迟发送,等待查看响应数据是否可以一起发送。 在Linux系统中,默认延迟时间是40ms;
      如果另一方的第二批包裹在等待运送货物时到达,则立即运送货物。

      Nagle算法:
      Nagle算法是一种通过减少网络传输包来提高TCP/IP网络效率的方法。它以发明家约翰·纳格尔的名字命名,约翰·纳格尔(John Nagle)于1984年首次尝试这种算法来解决福特汽车公司的网络拥堵问题。
      想象一下,如果应用程序一次生成一个字节的数据,所有这些都以网络数据包的形式发送到远程服务器,因此,由于太多的包,很容易重载网络。在这种情况下,只传输一个有效数据的字节的数据包,但额外花费40字节(即IP头上20字节 + TCP头上20字节),这种有效载荷的利用率非常低。
      具体如下:

      如果消息大于一个MSS(MSS是每个TCP包传输的最大数据段),则立即发送;
      如果一个包不是以前的ACK, 缓存发送的内容;
      如果收到ACK,立即发送缓存内容

      延迟ACK和Nagle算法同时使用:
      Nagle 和 Delayed ACK 可以提高网络传输效率, Nagle 在发送者上使用, Delayed ACK 在接收者上使用。
      A和B负责数据传输,运行纳格尔算法,B运行延迟ACK算法;如果A发送一个包到B,B因为延迟的ACK没有立即响应;而A使用Nagle算法,你会等B的ACK,ACK并不总是缓存剩余的包;如果两个包都响应相同的请求,那么这个请求将延迟40ms。

      二、 超时重传机制

      • **重复加班是指重复数据发生前的时间,等待特定时间间隔来确认应收到答复。**如超过该期间没有收到确认,发送器将检索数据.最理想的是,找到一个最小时间,它可以保证“确认答复必须在这段时间内返回”。

      • TCP要求在任何网络环境中提供高性能通信,不管网络拥塞有多大,所有 国家 都 必须 保持 这 一 特点 。为此,它计算了每次装运的回程时间及其偏差。再加这个24小时时间和偏差时间,加班的复发比总数稍大.

      • 在BSD、Unix和Windows中,超时为0.5秒是单元控制的,所以复发超时为0。 乘5秒整数。

      • 如果数据被重新传输,并且确认响应没有收到,则再发送。 此时,响应确认的等待时间将由指数函数延长2到4倍。

      • 一旦达到一定数量的重复,如果仍然没有确认应返回的响应,它将确定在网络或外围主机上发生了异常,并迫使连接关闭。 并通知异常通信的应用,迫使终止。
        在这里插入图片描述
        以段为单位发送数据

      • 在建立TCP连接的同时,也可以确定发送数据包的单元,也可以称之为“最大消息长度”(MSS)**。

      • 在传输大量数据时,TCP将数据单独发送到MSS的大小。 在重复情况下,该单元也称为MSS。

      • **MSS当你握手三次时,它被计算在主机两端之间。**当两个端的主机发出建立连接的请求时,在TCP标题中写MSS选项,告诉对方自己的接口能容纳的MSS的大小。然后在两者之间选择一个较小的值输入。P209

      三、 窗口机制

      TCP协议中的窗口机制分为两部分:

      • 固定的窗口大小
      • 滑动窗口

      固定窗口存在的问题

      如下图所示:
      在这里插入图片描述
      我们假设这个固定窗口的大小是1,也就是说,你只能一次发送一个数据。只有接收机确认数据后才能发送第二个数据。在图中我们可以看到,每个发送者发送一个数据接收器给发送者一个ACK确认数据。只有收到此确认数据后,发送者才能发送下一个数据。

      有一个问题:如果窗口太小,在发送较大的数据时需要不断确认时,它会造成大量延迟。

      如果窗口过大,我们假设发送者一次发送100个数据,但是接收机只能处理50个数据,所以每次,只有这些50个数据被证实。下次发送者发送100个数据,但接收器只能处理50个数据。这防止不必要的数据堵塞我们的链路。

      总结了后续内容等。

      我推荐免费的公共课程在自由声音学院,我个人认为老师讲得很好。
      与您分享:[Linux,Nginx,ZeroMQ,MySQL,Redis,
      fastdfs,ongoDB,ZK,flow media,CDN,P2P,K8S,Docker,
      TCP/IP,编码,DPDK和其他技术内容,点击学习即时:服务器课程

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

          热门文章

          文章分类