计算机网络基础知识—— 传输层(TCP&UDP)

TCP和UDP

TCP和UDP的区别

https://blog.csdn.net/weixin_43837354/article/details/104725979

  1. 拆分组装:TCP是字节流协议:也就是一次传10个G,不管发送方一次性给TCP多少数据, TCP都会根据实际情况进行合理拆分和组装, 分割成多个数据包, 然后有序稳定的传递给接收方。UDP是面向报文的传出机制(即数据报模式), 在传输过程中对数据既不合并, 也不拆分. 通俗来说就是, UDP在接受到数据缓冲后, 数据大了不会对其进行分包, 数据小了也不会对其合并, 而是来多少我直接传多少.
  2. 可靠性级别:数据无差错,不丢失,按序到达。实现方式:检验和(看发送端和接受端检验和是否相同)、序列号/确认应答(ack每次找客户端要下一个序号)、滑动窗口,重传机制。 UDP不保证,数据可能丢失。(比如发送接收邮件必须使用tcp保证数据无差错)
  3. 全双工
    单工:任何时刻数据只能单向发送,比如只能客户端到服务端。
    半双工:允许数据两个方向传输,但是某一时刻只能在一个方向上传输。
    全双工:任何时刻数据都能双向发送,像打电话一样。
    TCP是全双工。Udp是无面向连接,不需要建立连接所以没有单工双工的说法。

TCP优点:

  1. 流量控制:接收端会控制发送端的滑动窗口大小。如果发送端每次能发送2M数据,而接受端只能接1M数据,那么发送多了就会产生数据阻塞,我们通过滑动窗口(发送端和接收端都有滑动窗口)TCP滑动窗口控制流量的原理 接受端每次通知发送端window size来改变发送端的滑动窗口大小和他期望得到的下一个数据序号。通过动态改变窗口大小来实现流量控制。
  2. 拥塞控制TCP拥塞控制机制 控制网络传输防止网络阻塞带来的影响,实现方式:慢启动(窗口指数增长),为了防止cwnd增长过大引起网络拥塞,设置一个慢开始门限,当超过门限我们开始使用拥塞避免(然后执行窗口加法增大),当出现超时了,使用快恢复(窗口减小一半,然后执行加法增大。)
  3. 可靠传输

UDP优点:

  1. 一对多通信成本低:广播,组播,成本低,因为不需要建立连接
  2. 有效信息占比高:头很短,所以有效信息占比很高,而TCP的header很长,很大信息都被头部占用了,所以如果我们传送很短的信息,那么TCP的效率就很低。
  3. 简单:UDP不需要建立连接及复杂的机制。,也没有流量控制等机制,http3.0已经用UDP实现了因为简约,创建速度很快直接发送。
  4. 实时性更好:比如(语音视频直播),可以丢包,但是不能忍受长时间延时。如果用TCP产生阻塞,那直播就一直等着了。

TCP头部控制字段

在这里插入图片描述

TCP如何保证数据顺序和可靠性

因为TCP的拆分封包,按顺序拆分,但是包到达目的地的时候是无序的。
方法:

  1. 序号确认机制:利用seq和ack这个数据对,确定包的唯一性。
  2. 使用滑动窗口 ,滑动窗口存放没有排好序的封包。比如窗口大小是4,那么接收到ABCD的时候才向后滑动窗口,如果只有BD包到达,而AC一直不到丢失超时,那么整个滑动窗口就会失效,需要ABCD重发。
    TCP 滑动窗口(发送窗口和接收窗口)
    TCP发送窗口:“已经发送并得到对端ACK的”,“已经发送但还未收到对端ACK的”,“未发送但对端允许发送的”,“未发送且对端不允许发送”
  3. 重传机制

TCP握手机制

TCP为何需要握手?为何三次

TCP可靠性,因为tcp是全双工,也就是双方同时发送消息。
使用序列号来标号每个消息。

为什么需要握手

因为需要同步序列号。当客户端和服务器相互发送消息时,因为序列号不能从0开始,因为client和server可能创建很多个连接,每次断开或者建立连接都从0开始就会混淆。所以序列号是一个生成的数,那么我们就需要通过三次握手来获取对方的序列号,然后进行连接。

为何三次握手?

首先是三次握手确保双方都有正常发送和接收到能力。那么为何不是四次握手。发送,回复,发送,回复。而建立连接必须是三次。断开连接时,使用四次握手可以一端先断开发送,而另一端还可以继续发送消息,处于半打开状态,可以长时间继续发送消息。在建立连接的时候不允许处于半打开状态,这是TCP规范,也就是说要建立一个全双工传输机制。 所以要把其中的一次回复和发送给合并。

为何断开连接需要四次挥手

客户端发送请求服务端发送确认。服务端接收到信息就能确定客户端停止发送数据了,但是这是服务端不能马上发送断开连接请求,因为这时服务端可能还在处理一些事情,比如服务端还有一些数据需要处理完发送给了客户端,所以服务端还要等待一段时间再发送消息,暂时还不能够断开连接。
就不能够合并fin和ack。

他是在四次握手时出现的,一般出现这个了就是程序出现了bug
四次握手的时候不分client和server了,谁都可以先主动进行关闭申请。
close-wait就是主动端申请关闭被动端确认,然后被动端就进入closewait状态, 也就是现在只有被动端可以发消息了。这个时间可以等待很长,但是一般这种情况下是很少的,出现这种情况就是说明有bug了。原因就是有bug。

CLOSE-WAIT 和 TIME-WAIT 的状态和意义

  • close-wait :服务端收到客户端关闭连接请求并返回ACK后,服务器进入了 CLOSE-WAIT 状态,然而此时有可能服务端还有一些数据没有传输完成,因此不能立即关闭连接,而 CLOSE-WAIT 状态就是为了保证服务器在关闭连接之前将待发送的数据发送完成。出现close-wait一般是代码出现bug了,如果检查代码没有bug,close-wait状态一般持续最少两个小时,那么我们可以调整参数缩短close-wait时间

  • time-wait : 主动关闭方在收到被动关闭方的FIN包后并返回ACK后,会进入TIME_WAIT状态,1.允许老的重复报文分组在网络中消逝。
    2.保证TCP全双工连接的正确关闭。

TCP功能详解

参考 https://www.cnblogs.com/xiaolincoding/p/12732052.html

重传机制

一个RRT表示一个数据包来回的时间,发送并传回ACK的一个来回的时间。

1. 超时重传

我们发送的数据包,可能在发送丢失,或者ACK回来的时候丢失。这个时候设置超时重传机制,超过一段时间没有收到该包的ACK我们就重新发送该包。一般这个超时时间设为略大于RRT。因为一个RRT没有收到该包,说明该包应该是出问题了。如果超时时间较小,则频繁发送造成阻塞,如果太大则效率低。

2. 快速重传

他不是判断时间,而是判断事件。事件驱动。
在这里插入图片描述
seq1发送收到ACK发送seq2,但是seq2丢失,这时接收端没有收到seq2,收到seq3存储(接受窗口),则还回ACK要seq2,收到seq4存储,还回ack2。发送端收到连续三次则知道包丢失,出发快速重传,重传seq2。接收端组包,然后接着回ack6,因为之前的收到并缓存了。

3. sack(选择性重传)

他是快速重传的补充,因为快速重传并不知道重传的时候是只重传一个,还是后面的都要重传。而D-sack通过接收端会回复给发送端一个缓存地图,告诉发送端哪些包已经收到,哪些包丢失。这样发送端就可以只发送丢失的数据包。比如上面例子中,就只发送2,而不需要

滑动窗口原理

  1. 并行发送:因为如果我们发送一个包,等待接收方确认,然后再发下一个包,这就是串行发送,相当于下一个包要等到前面确认才能发,如果前面丢失了,就一直等着。但是使用一个滑动窗口机制,我们设置个窗口大小,比如一次我可以发五个,这五个不需要等待上一个的确认就并行发送。提高了发送效率。
  2. 窗口大小(流量控制原理):发送方和接收方都有一个滑动窗口,发送方的大小是根据接收方滑动窗口大小决定的,也就是说接收端决定我一次能处理多少个包,而不能说发送方无限制发送,一次发几百几千个包,这样接收方处理不过来就堵塞。接收窗口三部分:已接收并确认。窗口内未接收到,但可接收。超出处理范围的不允许发送的数据。
  3. 累计确认:也就是说其中一个数据包丢失,那么我们接收端窗口缓存会接收到后面数据包,当丢失的数据包重传过来,我们就可以告诉客户端继续发后面的。比如2丢失了,我们接收到了345,那么我们重新接收到2后,我们继续想发送端要6就可以了。

流量控制

定义:对发送方发送速率的控制,我们称之为流量控制。也就是接收方控制发送方的窗口大小。其实就是滑动窗口原理,通过滑动窗口来做流量控制。

双方在通信的时候,发送方的速率与接收方的速率是不一定相等,如果发送方的发送速率太快,会导致接收方处理不过来,放缓存,缓存不够就丢弃,大量的丢包会极大着浪费网络资源,因此,我们需要控制发送方的发送速率,让接收方与发送方处于一种动态平衡才好。

接收方根据自己能处理数据的能力动态调整接收窗口大小。

接收方每次收到数据包,可以在发送确定报文的时候,同时告诉发送方自己的缓存区还剩余多少是空闲的,我们也把缓存区的剩余大小称之为接收窗口大小,定义一个window变量来表示接收窗口的大小。

拥塞控制

产生原因

在网络出现拥堵时,如果继续发送大量数据包,可能会导致数据包时延、丢失等,这时 TCP 就会重传数据,但是一重传就会导致网络的负担更重,于是会导致更大的延迟以及更多的丢包,这个情况就会进入恶性循环被不断地放大….

拥塞窗口 cwnd是发送方维护的一个的状态变量,它会根据网络的拥塞程度动态变化的。

  1. 慢启动:窗口从开始进行指数增大。
  2. 拥塞避免(加法增大):为了防止cwnd增长过大引起网络拥塞,设置一个慢开始门限,当窗口到达门限值,开始执行加法增大。
  3. 快重传:快速重传和快速恢复算法一般同时使用,当收到连续三个相同的包就出发快速重传机制了。这时发送端会重新发送包并且修改窗口大小cwnd = cwnd/2 ,也就是设置为原来的一半;门限值现在也设为当前窗口大小ssthresh = cwnd;
  4. 快恢复:重新执行加法增大。

猜你喜欢

转载自blog.csdn.net/chongbin007/article/details/115001185