计算机网络基础 第一讲:TCP和UDP

计算机网络基础

参考资料:

JavaGuide 面试指南

OSI 和 TCP/IP 网络分层模型

相关面试题:

OSI 七层模型是什么?每一层的作用是什么?
TCP/IP 四层模型是什么?每一层的作用是什么?
为什么网络要分层?

OSI 七层模型 是国际化标准组织 提出的一个网络分层模型:
在这里插入图片描述

OSI 的七层体系结构概念清楚,理论也很完整,但是它比较复杂而且不实用,而且有些功能在多个层中重复出现。

在这里插入图片描述

TCP/IP 四层模型

  1. 应用层
  2. 传输层
  3. 网络层
  4. 网络接口层

需要注意的是,我们并不能将 TCP/IP 四层模型 和 OSI 七层模型完全精确地匹配起来,不过可以简单将两者对应起来,如下图所示
在这里插入图片描述

应用层

应用层位于传输层之上,主要提供两个终端设备上的应用程序之间信息交换的服务,它定义了信息交换的格式,消息会交给下一层传输层来传输。

我们把应用层交互的数据单元称为报文。

常见的应用层 协议:

  1. HTTP:超文本传输协议(支持 Web 应用)
  2. SMTP:简单邮件传输(发送)协议(基于 TCP 协议,用来发送电子邮件。用来收邮件的是POP3协议)
  3. POP3/IMAP:邮件接收的协议
  4. FTP:文件传输协议(基于 TCP 实现可靠的传输。使用 FTP 传输文件的好处是可以屏蔽操作系统和文件存储方式。另外 客户端 和 服务器主键有两条连接【一个传数据,一个传命令】,其它程序的只有一条,这种思想提高了FTP的效率)
  5. Telnet:远程登陆协议(基于 TCP ,但不安全,被SSH取代)
  6. SSH:安全的网络传输协议 (建立与TCP之上,比Telent安全,对数据进行加密)
传输层

传输层的主要任务就是负责向两台终端设备进程之间的通信提供通用的数据传输服务
运输层主要使用以下两种协议:

  1. 传输控制协议 TCP(Transmisson Control Protocol)–提供 面向连接 的,可靠的 数据传输服务。
  2. 用户数据协议 UDP(User Datagram Protocol)–提供 无连接 的,尽最大努力的数据传输服务(不保证数据传输的可靠性)。
    在这里插入图片描述
网络层

网络层负责为分组交换网上的不同主机提供通信服务。

在发送数据时,网络层运输层产生的报文段或用户数据报封装成分组和包进行传送。(网络会把上一层的数据分组

网络层使用 IP 协议,因此分组也叫 IP 数据报,简称数据报。

注:不要把运输层的“用户数据报 UDP”和网络层的“IP 数据报”弄混。

网络层的还有一个任务就是选择合适的路由,使源主机运输层所传下来的分组,能通过网络层中的路由器找到目的主机。

网络层常见协议 :

IP:网际协议 :网际协议 IP 是TCP/IP协议中最重要的协议之一,也是网络层最重要的协议之一,IP协议的作用包括寻址规约、定义数据包的格式等等,是网络层信息传输的主力协议。目前IP协议主要分为两种,一种是过去的IPv4,另一种是较新的IPv6,目前这两种协议都在使用,但后者已经被提议来取代前者。
**ARP 协议 ** :ARP协议,全称地址解析协议(Address Resolution Protocol),它解决的是网络层地址和链路层地址之间的转换问题。因为一个IP数据报在物理上传输的过程中,总是需要知道下一跳(物理上的下一个目的地)该去往何处,但IP地址属于逻辑地址,而MAC地址才是物理地址,ARP协议解决了IP地址转MAC地址的一些问题。
**NAT:网络地址转换协议 ** :NAT协议(Network Address Translation)的应用场景如同它的名称——网络地址转换,应用于内部网到外部网的地址转换过程中。具体地说,在一个小的子网(局域网,LAN)内,各主机使用的是同一个LAN下的IP地址,但在该LAN以外,在广域网(WAN)中,需要一个统一的IP地址来标识该LAN在整个Internet上的位置。
在这里插入图片描述

网络接口层

数据链路层的作用是将网络层交下来的 IP 数据报组装成帧,在两个相邻节点间的链路上传送帧。

每一帧包括数据和必要的控制信息(如同步信息,地址信息,差错控制等)。

物理层的作用是实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异

在这里插入图片描述

总结:
在这里插入图片描述

应用层协议:

  • HTTP 协议(超文本传输协议,网页浏览常用的协议)
  • DHCP 协议(动态主机配置)
  • DNS 系统原理(域名系统)
  • FTP 协议(文件传输协议)
  • Telnet协议(远程登陆协议)
  • 电子邮件协议等(SMTP、POP3、IMAP)

传输层协议 :

  • TCP 协议
    1. 报文段结构
    2. 可靠数据传输
    3. 流量控制
    4. 拥塞控制
  • UDP 协议
  1. 报文段结构
  2. RDT(可靠数据传输协议)

网络层协议 :

  • IP 协议(TCP/IP 协议的基础,分为 IPv4 和 IPv6)
  • ARP 协议(地址解析协议,用于解析 IP 地址和 MAC 地址之间的映射)
  • ICMP 协议(控制报文协议,用于发送控制消息)
  • NAT 协议(网络地址转换协议)
  • RIP 协议、OSPF 协议、BGP 协议(路由选择协议)

网络层协议:

  • 差错检测技术
  • 多路访问协议(信道复用技术)
  • CSMA/CD 协议
  • MAC 协议
  • 以太网技术

分层的作用:

  1. 各层之间相互独立
  2. 提高了整体灵活性
  3. 大问题化小

TCP 和 UDP

TCP 和 UDP的区别(重要)

  1. 是否面向连接:UDP 传输数据之前不需要简历连接,而 TCP 需要先建立
  2. 是否是可靠传输:远地主机 收到UDP 报文后,不需要确认,不可靠。TCP是可靠传输,传数据之前,会三次握手来建立连接,数据传输时,也有确认机制。
  3. 是否有状态:TCP 传输时有状态的,TCP 会记录自己发的数据是否被发送,收到等等,(TCP需要维持复杂的连接状态表),UDP是无状态的,发送出数据就不管了
  4. 传输效率:TCP 传输效率比UDP 低很多
  5. 传输形式:TCP 面向字节流,UDP 是面向报文的。
  6. 首部开销:TCP首部开销(20 ~ 60节点)比 UDP(8字节)大。
  7. 是否提供广播或多播服务:TCP 只支持点对点通信,UDP 支持一对一、一对多、多对一、多对多;

对比图:
在这里插入图片描述

什么时候用TCP,什么时候用UDP ?

  • UDP 一般用于及时通信,直播,视频语音
  • TCP 用于对传输的 数据 准确性特别高的场景,发送接收邮件,文件传输等

使用 TCP 的协议有哪些? 使用 UDP 的协议有哪些 ?

(注意这些协议都是 应用层的协议

使用 TCP 的协议:

  1. HTTP协议:超文本传输协议,主要是为 Web 浏览器与 Web 服务器之间的通信而设计的
  2. HTTPS协议:更安全的超文本传输协议,身披 SSL 外衣的 HTTP 协议
  3. FTP协议:文件传输协议 FTP
  4. SMTP协议:简单邮件传输协议(只用来发邮件)
  5. POP3 / IMAP 协议:负责邮件接收的协议。
  6. Telent协议:远程登陆协议但没 SSH 可靠
  7. SSH 协议:可靠的 专为远程登录会话和其他网络服务提供安全性的协议。

使用 TCP 的协议:

  1. DHCP 协议:动态主机配置协议,动态配置 IP 协议。
  2. DNS:域名系统

HTTP 是基于 TCP 还是 UDP?

HTTP 协议是基于 TCP 协议的,所以发送 HTTP 请求之前首先要建立 TCP 连接也就是要经历 三次握手

TCP三次握手和四次挥手(非常重要)

相关面试题 :

  • 为什么要三次握手?
  • 第 2 次握手传回了ACK,为什么还要传回SYN?
  • 为什么要四次挥手?
  • 为什么不能把服务器发送的 ACK 和 FIN 合并起来,变成三次挥手?
  • 如果第二次挥手时服务器的 ACK 没有送达客户端,会怎样?
  • 为什么第四次挥手客户端需要等待 2*MSL(报文段最长寿命)时间后才进入 CLOSED 状态?

首先来看看如何建立 TCP三次握手
在这里插入图片描述

  1. 一次握手:客户端发送带有 SYN(SEQ=x) 标志的数据包 -> 服务端,然后客户端进入 SYN_SEND 状态,等待服务器的确认;
  2. 二次握手:服务端发送带有 SYN+ACK(SEQ=y,ACK=x+1) 标志的数据包 –> 客户端,然后服务端进入 SYN_RECV 状态
  3. 三次握手:客户端发送带有 ACK(ACK=y+1) 标志的数据包 –> 服务端,然后客户端和服务器端都进入ESTABLISHED 状态,完成TCP三次握手。

当建立了 3 次握手之后,客户端和服务端就可以传输数据啦!

为什么要三次挥手 ?

三次握手是为了建立可靠的通信信道

1、第一次握手,Client 什么都确定不了,Server可以 确定 Client发送正常,自己接收正常
2、第二次握手,Client 确定了:自己可以发送,接收,对方可以发送,接收,Server确认了对方发送正常,自己接收正常
3、第三次握手 :Client 确认了:自己可以发送、接收,对方可以发送、接收;Server 确认了:自己可以发送、接收,对方可以发送、接收

通过三次握手就能确定 双发收功能都正常,缺一不可

第2次握手传回了ACK,为什么还要传回SYN?

Server 传给 Client 的ACK 是微辣告诉 Client:我收到的信息确实就是你发送的。
回传 SYN 则是为了建立并确认从服务端到客户端的通信。
SYN 同步序列编号(Synchronize Sequence Numbers)

  1. 客户机首先发出一个 SYN 消息,
  2. 服务器使用 SYN-ACK 应答表示接收到了这个消息,
  3. 最后客户机再以 ACK(Acknowledgement)消息响应。这样在客户机和服务器之间才能建立起可靠的 TCP 连接,数据才可以在客户机和服务器之间传递。

断开连接-TCP 四次挥手

在这里插入图片描述

  1. 第一次挥手 :客户端发送一个 FIN(SEQ=X) 标志的数据包->服务端,用来关闭客户端到服务器的数据传送。然后,客户端进入 FIN-WAIT-1 状态
  2. 第二次挥手 :服务器收到这个 FIN(SEQ=X) 标志的数据包,它发送一个 ACK (SEQ=X+1)标志的数据包->客户端 。然后,此时服务端进入CLOSE-WAIT状态,客户端进入FIN-WAIT-2状态
  3. 第三次挥手 :服务端关闭与客户端的连接并发送一个 FIN (SEQ=y)标志的数据包->客户端请求关闭连接,然后,服务端进入LAST-ACK状态
  4. 第四次挥手 :客户端发送 ACK (SEQ=y+1)标志的数据包->服务端并且进入TIME-WAIT状态,服务端在收到 ACK (SEQ=y+1)标志的数据包后进入 CLOSE 状态。此时,如果客户端等待 2MSL 后依然没有收到回复,就证明服务端已正常关闭,随后,客户端也可以关闭连接了。

先关的 服务端 在关的客户端(注意最后一步:客户端发完ACK 进入等待,服务器收到ACK 直接关闭,客户端等待 2MSL (MSL:报文段最长寿命),再关闭)

为什么要四次挥手?

TCP是全双工通信,可以双向传输数据。任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后就完全关闭了 TCP 连接。

为什么不能把服务器发送的 ACK 和 FIN 合并起来,变成三次挥手?

因为 第二次挥手 和 第三次挥手 之间 服务器还可以发送数据,所以第二次 和 第三次挥手 不能合并在一起。

因为服务器收到客户端断开连接的请求时,可能还有一些数据没有发完,这时先回复 ACK,表示接收到了断开连接的请求。等到数据发完之后再发 FIN,断开服务器到客户端的数据传送。

如果第二次挥手时服务器的 ACK 没有送达客户端,会怎样?

客户端没有收到 ACK 确认,会重新发送 FIN 请求。

MSL(Maximum Segment Lifetime) : 一个片段在网络中最大的存活时间,2MSL 就是一个发送和一个回复所需的最大时间。如果直到 2MSL,Client 都没有再次收到 FIN,那么 Client 推断 ACK 已经被成功接收,则结束 TCP 连接。

TCP (传输层) 如何保证传输的可靠性?(重要)

前面我们讲了 UDP 是不可靠的,TCP 是可靠的,会建立连接,有状态,那么TCP是如何保证自己的传输可靠性的呢?

  1. 基于数据快传输 : 应用数据被分割成 TCP 认为最适合发送的数据块,再传输给网络层,数据块被称为报文段或段。
  2. 对失序数据包重新排序以及去重: TCP 为了保证不发生丢包,就给每个包一个序列号,有了序列号能够将接收到的数据根据序列号排序,并且去掉重复序列号的数据就可以实现数据包去重。
  3. 校验和 : TCP 将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段。
  4. 超时重传 : 当发送方发送数据之后,它启动一个定时器,等待目的端确认收到这个报文段。接收端实体对已成功收到的包发回一个相应的确认信息(ACK)。如果发送端实体在合理的往返时延(RTT)内未收到确认消息,那么对应的数据包就被假设为已丢失并进行重传。
  5. 流量控制 : TCP 连接的每一方都有固定大小的缓冲空间,TCP 的接收端只允许 发送端发送 接收端缓冲区能接纳的数据。 当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP 使用的流量控制协议是可变大小的滑动窗口协议(TCP 利用滑动窗口实现流量控制)。
  6. 拥塞控制 : 当网络拥塞时,减少数据的发送。

注意 拥塞控制 和 流量控制 的区别:
拥塞控制 往往是全局性的
流量控制 往往是点对点通信量的控制,是个端到端的

流量控制是为了防止 发送速率 大于 接收速率
阻塞控制是为了防止 请求速率 大于 发送速率(对网络中某一资源的需求超过了该资源所能提供的可用部分)


TCP 如何实现流量控制?

TCP 利用滑动窗口实现流量控制。流量控制是为了控制发送方发送速率,保证接收方来得及接收。 接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为 0,则发送方不能发送数据。

为什么需要流量控制 ?:

因为双方在通信的时,两边的速率可能不一样,如果发送速率太快,会导致接收方处理不过来。 如果处理不过来的话,就把处理不过来的数据存在 接收缓冲区 (Receiving Buffers)(失序的数据包也会被存放在缓存区里)。如果接收缓存区也满啦,那么接收方就会把收到的数据包就掉,浪费资源!!!

要达到一种动态平衡。

这里需要注意的是(常见误区):

  • 发送端不等同于客户端
  • 接收端不等同于服务端

TCP 是全双工通信,客户端和服务端既可能是发送端又可能是服务端,两端各有一个发送缓冲区和接收缓冲区,各自维护一个发送窗口和一个接收窗口。 接收窗口大小取决于引用,系统,硬件的限制(TCP 传输速率不能大于应用的数据处理速率),发送窗口和接收窗口的要求一样。


TCP 发送窗口可以划分成四个部分 :

  1. 已经发送并且确认的TCP段(已经发送并确认);
  2. 已经发送但是没有确认的TCP段(已经发送未确认);
  3. 未发送但是接收方准备接收的TCP段(可以发送);
  4. 未发送并且接收方也并未准备接受的TCP段(不可发送)。

TCP发送窗口结构图示 :
在这里插入图片描述

SND.WND :发送窗口。
SND.UNA:Send Unacknowledged 指针,指向发送窗口的第一个字节。
SND.NXT:Send Next 指针,指向可用窗口的第一个字节。

TCP 接收窗口可以划分成三个部分 :

  1. 已经接收并且已经确认的 TCP 段(已经接收并确认);
  2. 等待接收且允许发送方发送 TCP 段(可以接收未确认);
  3. 不可接收且不允许发送方发送TCP段(不可接收)。

TCP接收窗口结构图示 :

在这里插入图片描述
接收窗口的大小是根据接收端处理数据的速度动态调整的。 接收端读取数据快,接收窗口可能会扩大

TCP 的拥塞控制是怎么实现的?

在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏。这种情况就叫拥塞。拥塞控制就是为了防止过多的数据注入到网络中,这样就可以使网络中的路由器或链路不致过载

注意 拥塞控制 和 流量控制 的区别:

拥塞控制所要做的都有一个前提,就是网络能够承受现有的网络负荷。拥塞控制是一个全局性的过程,涉及到所有的主机,所有的路由器,以及与降低网络传输性能有关的所有因素。相反,流量控制往往是点对点通信量的控制,是个端到端的问题。流量控制所要做到的就是抑制发送端发送数据的速率,以便使接收端来得及接收。

在这里插入图片描述

为了进行拥塞控制,TCP 发送方要维持一个 拥塞窗口 (cwnd) 的状态变量。
拥塞控制窗口的大小取决于网络的拥塞程度,并且动态变化。
发送方让自己的发送窗口取为拥塞窗口和接收方的接受窗口中较小的一个。

TCP 的拥塞控制 有四种算法:

  1. 慢开始
  2. 拥塞避免
  3. 快重传
  4. 快恢复

网络层也可以使路由器采用适当的分组丢弃策略(如主动队列管理 AQM),以减少网络拥塞的发生。

慢开始: 慢开始算法的思路是当主机开始发送数据时,如果立即把大量数据字节注入到网络,那么可能会引起网络阻塞,因为现在还不知道网络的符合情况。经验表明,较好的方法是先探测一下,即由小到大逐渐增大发送窗口,也就是由小到大逐渐增大拥塞窗口数值。cwnd 初始值为 1,每经过一个传播轮次,cwnd 加倍。

拥塞避免: 拥塞避免算法的思路是让拥塞窗口 cwnd 缓慢增大,即每经过一个往返时间 RTT 就把发送方的 cwnd 加 1.

快重传 与 快恢复: 在 TCP/IP 中,快速重传和恢复(fast retransmit and recovery,FRR)是一种拥塞控制算法,它能快速恢复丢失的数据包。没有 FRR,如果数据包丢失了,TCP 将会使用定时器来要求传输暂停。在暂停的这段时间内,没有新的或复制的数据包被发送。有了 FRR,如果接收方 接收到一个不按顺序的数据段,它会立即给发送方 发送一个重复确认。如果发送机接收到三个重复确认,它会假定确认件指出的数据段丢失了,并立即重传这些丢失的数据段。有了 FRR,就不会因为重传时要求的暂停被耽误。  当有单独的数据包丢失时,快速重传和恢复(FRR)能最有效地工作。当有多个数据信息包在某一段很短的时间内丢失时,它则不能很有效地工作。

有 FRR就可以不暂停的 发送丢失的数据包,没有FRR就需要暂停 再去发送数据包

ARQ 协议了解吗?

自动重传请求(Automatic Repeat-reQuest,ARQ)是 OSI 模型中数据链路层和传输层的错误纠正协议之一。它通过使用确认和超时这两个机制,在不可靠服务的基础上实现可靠的信息传输。如果发送方在发送后一段时间之内没有收到确认信息 ACK(Acknoledgements),它通常会重新发送,直到收到确认或者重试超过一定的次数。

ARQ 包括停止等待 ARQ 协议和连续 ARQ 协议。

停止等待 ARQ 协议

停止等待协议是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认(回复 ACK)。如果过了一段时间(超时时间后),还是没有收到 ACK 确认,说明没有发送成功,需要重新发送,直到收到确认后再发下一个分组;

在停止等待协议中,若接收方收到重复分组,就丢弃该分组,但同时还要发送确认。

  1. ) 无差错情况:

发送方发送分组,接收方在规定时间内收到,并且回复确认.发送方再次发送。

  1. ) 出现差错情况(超时重传):

停止等待协议中超时重传是指只要超过一段时间仍然没有收到确认,就重传前面发送过的分组(认为刚才发送过的分组丢失了)。因此每发送完一个分组需要设置一个超时计时器,其重传时间应比数据在分组传输的平均往返时间更长一些。这种自动重传方式常称为 自动重传请求 ARQ 。另外在停止等待协议中若收到重复分组,就丢弃该分组,但同时还要发送确认。

超时重传 和 快重传与快恢复 要区分开:
超时重传 和 快重传
超时重传:是 发送方没有收到接收方的确认,发送方认为接收方没有接收到(丢失了) 就自动重传
快重传:是接收方 发给 发放方 三个重复确认,告诉发送方丢失数据,发送方立即 重传丢失的数据段
所以如果接收方收到重复的数据也要给发送方 发送确认ACK

  1. ) 确认丢失和确认迟到

    • 确认丢失 :确认消息在传输过程丢失。当 A 发送 M1 消息,B 收到后,B 向 A 发送了一个 M1 确认消息,但却在传输过程中丢失。而 A 并不知道,在超时计时过后,A 重传 M1 消息,B 再次收到该消息后采取以下两点措施:1. 丢弃这个重复的 M1 消息,不向上层交付。 2. 向 A 发送确认消息。(不会认为已经发送过了,就不再发送。A 能重传,就证明 B 的确认消息丢失)。
    • 确认迟到 :确认消息在传输过程中迟到。A 发送 M1 消息,B 收到并发送确认。在超时时间内没有收到确认消息,A 重传 M1 消息,B 仍然收到并继续发送确认消息(B 收到了 2 份 M1)。此时 A 收到了 B 第二次发送的确认消息。接着发送其他数据。过了一会,A 收到了 B 第一次发送的对 M1 的确认消息(A 也收到了 2 份确认消息)。处理如下:1. A 收到重复的确认后,直接丢弃。2. B 收到重复的 M1 后,也直接丢弃重复的 M1。

连续 ARQ 协议

连续 ARQ 协议可提高信道利用率。发送方维持一个发送窗口,凡位于发送窗口内的分组可以连续发送出去,而不需要等待对方确认。接收方一般采用累计确认,对按序到达的最后一个分组发送确认,表明到这个分组为止的所有分组都已经正确收到了。

优点: 信道利用率高,容易实现,即使确认丢失,也不必重传。

缺点: 不能向发送方反映出接收方已经正确收到的所有分组的信息。 比如:发送方发送了 5 条 消息,中间第三条丢失(3 号),这时接收方只能对前两个发送确认。发送方无法知道后三个分组的下落,而只好把后三个全部重传一次。这也叫 Go-Back-N(回退 N),表示需要退回来重传已经发送过的 N 个消息。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值