计算机网络知识点

1. OSI、TCP/IP、五层协议的体系结构?

**OSI分层(七层):**物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。

**TCP/IP(4层):**网络接口层、网际层、运输层、应用层。

**五层协议(5层):**物理层、数据链路层、网络层、运输层、应用层。

每一层的作用如下:

物理层:激活、维持、关闭通信短点之间的机械特性、电气特性、功能特性以及工程特性。该层为上层协议提供了一个传输数据的物理媒体。

数据链路层:数据链路层在不可靠的物理介质上提供可靠的传输。改层的作用包括:物理地址寻址、数据的成帧、流量控制、数据的检错、重发等。

网络层:网络层负责对子网间的数据包进行路由选择。此外,网络层还可以实现拥塞控制、网际互连等功能。

传输层:第一个端到端,即主机到主机的层次。传输层负责将上层数据分段并提供端到端的、可靠的或不可靠的传输。此外,传输层还要处理端到端的差错控制和流量控制问题。

会话层:会话层管理主机之间的回话进程,即负责建立、管理、终止进程间的会话。会话层还利用在数据中插入校验点来实现数据的同步。

表示层:表示层对上层数据或信息进行变换以保证一个主机应用层信息可以被另一个主机应用程序理解。表示层的数据转换包括数据的加密、压缩、格式转换等。

应用层:为操作系统或网络应用程序提供访问网络服务的接口。

2. IP地址的分类

所谓的“分类的IP地址”就是将IP地址划分为若干个固定类,每一类地址都是由两个固定长度的字段组成,其中一个字段是网络号(net-id),它标志主机(或路由器)所连接到的网络。一个网络号在整个因特网范围内必须是唯一的。第二个字段时主机号(host-id),它标志该主机(或路由器)。一个主机号在它前面的网络号所指明的网络范围内必须是唯一的。由此可见,一个IP地址在整个英特网范围内是唯一的

IP地址可以分为A类、B类、C类、D类和E类地址。

A类地址:以0开头,第一个字节作为网络号,地址范围为:0.0.0.0 ~ 127.255.255.255。

B类地址:以10开头,前两个字节作为网络号,地址范围为:128.0.0.0 ~ 191.255.255.255.

C类地址:以110开头:前三个字节作为网络号,地址范围为:192.0.0.0 ~ 223.255.255.255。

D类地址:以1110开头,地址范围为:224.0.0.0 ~ 239.255.255.255,D类地址作为组播地址(即一对多通信)。

E类地址:以1111开头,地址范围为:240.0.0.0 ~ 255.255.255.255,E类地址为保留地址,供以后使用。

需要注意的是:只有A、B、C类地址有网络号和主机号之分,D和E类地址没有划分网络号和主机号。

3. TCP与UDP的区别?

  1. TCP是面向连接的(如打电话需要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接。
  2. TCP提供可靠的服务,也就是说通过TCP连接传送的数据无差错、不重复、且按序到达;而UDP不保证数据传输的可靠性。
  3. TCP是面向字节流的,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的。UDP没有拥塞控制,因此网络出现拥塞不会使得源主机的发送速率降低(对实时应用很有用,如IP电话、实时视频会议等)。
  4. 每一条TCP连接只能是点对点的;而UDP支持一对一、一对多、多对一、多对多的交互通信。

4. TCP如何实现数据的可靠性?

TCP通过校验和、序列号、确认应答、超时重传、连接管理、流量控制、拥塞控制等机制来保证可靠性。

\1. 校验和:在数据传输过程中,将发送的数据段都当做一个16位的整数。将这些整数加起来,并且前面的进位不能丢弃,补在最后,然后取反,得到校验和。

  1. 发送方:在发送数据之前计算校验和,并进行校验和的填充。
  2. 接收方:收到数据后,对数据以同样的方式进行计算,求出校验和,与发送方进行比较。img

\2. 序列号:TCP传输时将每个字节的数据都进行了编号,这就是序列号。序列号的作用不仅仅是应答作用,有了序列号能够将接收到的数据根据序列号进行排序,并且去掉重复的数据。这也是TCP可靠性的保证之一。

\3. 确认应答:TCP传输过程中,每次接收方接收到数据后,都会对传输方进行确认应答。也就是发送ACK报文,这个ACK报文中带有对应的确认序列号,告诉发送方,接收了哪些数据,下一次数据从哪里传。

\4. 超时重传:在进行TCP传输时,由于存在确认应答与序列号机制,也就是说发送方发送一部分数据后,都会等待接收方发送的ACK报文,并解析ACK报文,判断数据是否传输成功。如果发送方发送完数据后,迟迟都没有接收到接收方传来的ACK报文,那么就对刚刚发送的数据进行重发,如果是数据在传输过程中用于网络原因等发生丢包,导致接收方没有接收到,那么接收方第二次收到了数据后就会发送ACK报文给发送方;如果是接收方已经发送了ACK报文,但是ACK报文由于网络原因丢包了,导致发送方没有收到ACK报文,那么此时发送过来的报文已经存在就直接丢弃,仍然发送ACK报文。

\5. 连接管理:就是三次握手、四次挥手的过程。

\6. 流量控制:接收端在接收到数据后,对其进行处理。如果发送方的发送速度太快,导致接收方的接收缓冲区填充满了。此时如果继续传输数据,就会造成大量丢包,继而引起丢包重传等等一系列问题。因此TCP支持根据接收端的处理能力,来决定发送端的发送速度,这就睡流量控制机制。接收端可以将自己的接收缓冲区大小放入TCP首部的“窗口大小”字段中,通过ACK通知发送端。以此来决定发送端的发送速度。如果接收缓冲区满了,窗口设置为0,这时发送方将不会再发送数据,但是会定期发送一个窗口探测数据段,使接收端把窗口大小告诉发送端。

\7. 拥塞控制:TCP传输过程中,发送端开始发送数据的时候,如果一开始就发送大量数据,那么就有可能造成一些问题。如:网络可能在刚开始的时候就很拥堵,如果给网络中再扔出大量数据,那么这个拥堵就会加剧。拥堵的加剧会导致大量丢包,就会产生大量的超时重传,严重影响传输效率。

所以TCP引入了慢启动机制,在开始发送数据的时候,先发少量的数据探探路。探清楚当前的网络状况如何,再决定按照多大的速度传输数据。这里需要引入一个拥塞窗口,发送开始的时候,拥塞窗口大小为1,每次接收到一个ACK应答,拥塞窗口加1,每次发送数据包的时候,将拥塞窗口和接收端的主机反馈的窗口大小做比较,取较小的值作为作为实际发送的窗口。

虽然“慢启动” 初始值很小,但是增长速度非常快,是指数级别的。因此在这里引入了一个慢启动阈值,当拥塞窗口超过这个阈值的时候,不再按照指数的方式增长了,而是线性增长。当TCP 开始启动的时候,慢启动的阈值等于窗口的最大值,在每次超时重发的时候,慢启动阈值会变成原来的一半,同时拥塞窗口会置为1。

img

5. TCP协议如何提高传输效率?

TCP协议提高效率的方式有滑动窗口、快重传、延迟应答、捎带应答等

\1. 滑动窗口:如果每一个发送的数据段,都要给一个ACK应答之后再发送下一个数据段,这样的话我们效率很低,大部分时间都用在了等待ACK应答上了。

既然如此,那么我们可以一次发送多条数据,这样就能使等待时间大大减少,从而提高性能。

img

窗口大小指的是无需等待确认应答而可以继续发送数据的最大值。上图的窗口大小就是4000个字节(四段数据)。

发送前四个段的时候,不需要等待任何ACK,直接发送;

收到第一个ACK后,滑动窗口向后移动,继续发送第五个段的数据,依次类推;

操作系统内核为了维护这个滑动窗口,需要开辟发送缓冲区来记录当前还有哪些数据没有应答;只有确认应答过的数据,才能从缓冲区删掉;

窗口越大,则网络吞吐量越大。

img

2. 那么如果出现了丢包,如何进行重传?这里分两种情况。

情况一:数据包已经抵达,ACK被丢了。

img

这种情况下,部分ACK丢了并不影响,因为可以通过后续的ACK进行确认;

情况二:数据包直接丢了。

img

当某一段报文段丢失后,发送端会一直收到1001这样的ACK,就像是在提醒发送端“我想要的是1001”一样;

如果发送端主机连续三次收到了同样一个“1001”这样的应答,就会将对应的数据段 1001~2000 重新发送;

这个时候接收端接收到了1001之后,再返回的ACK就是7001了,因为2001~7000这段数据接收端之前就已经收到了,被放到了接收端操作系统内核的接收缓冲区。

这种机制就叫做“高速重发控制”(也称“快重传”)。

3. 延迟应答

如果接收数据的主机立刻返回ACK应答,这时候返回的窗口大小可能比较小。

  • 假设接收端缓冲区为1M,一次收到了512K的数据;如果立刻应答,返回的窗口就是512K;
  • 但实际上可能处理端处理速度很快,10ms之内就把512K的数据从缓存区消费掉了;
  • 在这种情况下,接收端处理还远没有达到自己的极限,即使窗口再放大一些,也能处理过来;
  • 如果接收端稍微等一会在应答,比如等待200ms再应答,那么这个时候返回的窗口大小就是1M;

窗口越大,网络吞吐量就越大,传输效率就越高;我们的目标是在保证网络不拥塞的情况下尽量提高传输效率。

4. 捎带应答:在延迟应答的基础上,很多情况下,客户端服务器在应用层也是一发一收的。这时候常常采用捎带应答的方式来提高效率,而ACK响应常常伴随着数据报文共同传输。如:三次握手。

6. 三次握手和四次挥手全过程

img

6.1 三次握手

\1. 建立连接时,客户端向服务端发送请求报文段,这时首部中的同步位SYN=1,同时选择一个初始序号seq=x,这时客户端进入SYN_SENT(同步已发送)状态。

\2. 服务端收到连接请求报文段后,如果同意建立连接,则向客户端发送确认报文。在确认报文中把SYN位和ACK位都置为1,确认号是ack=x+1,同时也为自己选择一个初始序号seq=y。这时服务器进入SYN_RECV(同步收到)状态。

\3. 客户端接收到服务器发来的确认报文后,还要向服务端发送确认报文,确认报文段的ACK置为1,确认序号ack=y+1,而自己的序号置为seq=x+1,报文发送完毕后,客户端进入ETABLISHED(已连接)状态;当服务端收到客户端的确认报文后也进入ETABLISHED状态。

6.2 四次挥手

\1. 客户端先向服务端发出连接释放报文段,用来关闭客户端到服务端的数据传送,这时首部中的FIN置为1,其序号为u。这时客户端进入FIN_WAIT_1(终止等待1)状态,等待服务端的确认。

\2. 服务端收到客户端的连接释放报文段后即发出确认,确认号为ack=u+1,序号为v。这时服务端进入CLOSE_WAIT(关闭等待)状态。此时客户端到服务端这个方向的连接就释放了,这时客户端与服务器的连接处于半关闭状态。客户端收到服务端的确认报文后,就进入了FIN_WAIT_2(终止等待2)状态,等待服务端发出的连接释放报文段。

\3. 服务端向客户端发送连接释放报文段,用来关闭服务端到客户端的数据传送,这时首部中的FIN置为1,序号为w,此时服务端进入LAST_ACK(最后确认)状态,等待客户端的确认。

\4. 客户端收到服务端的连接释放报文段后,必须对此发出确认。在确认报文中把ACK置为1,确认号ack=w+1。此时客户端进入TIME_WAIT(时间等待)状态。此时TCP连接还没有释放,需经过等待计时器设置的2MSL(MSL:Maximum Segment Lifetime 最大报文生存时间,MSL是任何报文段被丢弃前在网络内的最长时间)后,才进入到CLOSE状态。到此才算完成了整个四次挥手的过程。

7. TCP协议段格式与UDP协议段格式

img

  • 源/目的端口号:表示数据是从哪个进程来,到那个进程去。
  • 32位序号:用于标识每个报文段,使目的主机可以确认已收到指定报文段中的数据。当源主机用于多个报文段发送一个报文时,即使这些报文段到达目的主机顺序不一样,序列号也可以师目的主机按顺序排列它们。
  • 32位确认序号:目的主机返回确认序号,是源主机知道某个或某几个报文段已被接收。确认序号等于顺序接收到的最后一个报文段的序号加 1,这也是目的主机希望下次接收的报文段的序号值。返回确认序号后,计算机认为已接收到小于该确认序号的所有数据。
  • 4位首部长度:首部长度指的是首部占32bit字的数目,包括任何选项。由于他是一个4比特字段(最大为全1,即十进制的15),因此首部长度最长为 4 * 15 = 60 个字节。
  • 保留6位:为将来定义新用途保留,现在一般置为0。
  • 控制位6位:
    • URG:紧急指针是否有效,置为 1 时表示有效,报文应当被优先处理。
    • ACK:确认号是否有效,置为 1 时表示有效,TCP 规定,在连接建立后所有传达的报文段都必须把 ACK 置 1。
    • PSH:push标志,置为 1 时表示带有push标志的数据,指示接收方在接收到该报文段后,应尽快将这个报文段交给应用程序,而不是在缓冲区排队。
    • RST:重置连接标志,用于重置由于主机崩溃或其他原因而出现错误的连接。或者用于拒绝非法的报文段和拒绝连接请求。我们把携带RST标识的称为复位报文段
    • SYN:仅在三次握手建立 TCP 连接时有效。在连接请求中,SYN=1和ACK=0表示该数据段没有使用捎带的确认域,而连接应答捎带一个确认,即SYN=1和ACK=1。我们把携带SYN标识的称为同步报文段
    • FIN:用于释放连接,为1时表示发送方已经没有数据发送了,即关闭本方数据流。我们把携带FIN标识的称为结束报文段
  • 16位窗口大小:表示滑动窗口大小,用来告知发送端接受端的缓存大小,以此控制发送端发送数据的速率,从而达到流量控制。窗口大小时一个16bit字段,因而窗口大小最大为65535。
  • 16位校验和:奇偶校验,此校验和是对整个的 TCP 报文段,包括 TCP 头部和 TCP 数据,以 16 位字进行计算所得。由发送端计算和存储,并由接收端进行验证。
  • 16位紧急指针:只有当 URG 标志置 1 时紧急指针才有效。标识哪部分数据时紧急数据。
  • 选项:可能包括“窗口扩大因子”、“时间戳”等选项。长度可变,最长可达 40 字节,当没有使用选项时,TCP 首部长度是 20 字节。
  • 数据:TCP 报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段。

UDP协议格式段

img

  • 16位源端口号/目的端口号(2字节): 表示数据是从哪个进程来,到那个进程去。
  • 16位UDP长度(2字节):表示整个数据报(UDP首部+UDP数据)的最大长度。
  • 16位UDP校验和(2字节):检测 UDP 用户数据报在传输中是否有错,有错就丢弃。

8. 在浏览器中输入一个www.baidu.com后执行的全部过程?

域名解析 -> 建立TCP连接(三次握手)-> 发起http请求 -> 服务器响应http请求,浏览器得到html代码 -> 浏览器解析html代码,并请求html代码中的资源(如 js、css、图片等)-> 浏览器对页面进行渲染呈献给用户

8.1 域名解析

  1. 浏览器会首先搜索浏览器的DNS缓存,看自身的缓存中是否有www.baidu.com对应的条目,而且没有过期,如果有且没有过期则解析到此结束。
  2. 如果浏览器自身的缓存中没有找到对应的条目,那么浏览器会搜索操作系统的DNS缓存,如果找到且没有过期则停止搜索解析到此结束。(在Windows系统的命令行下使用 ipconfig/displaydns 进行查看)
  3. 如果 Windows 系统的 DNS 缓存也没有找到,那么就尝试读取 hosts 文件(位于C:\Windows\System32\drivers\etc),查看这里面有没有该域名对应的 IP 地址,如果有则解析成功。
  4. 如果在 hosts 文件中也没有找到对应的条目,浏览器会先向本地DNS服务器发起域名解析请求(通过的是UDP协议向DNS的53端口发起请求,这个请求是递归的请求),本地的DNS服务器一般来说都是由网络接入商提供的,如中国电信等。当本地的DNS服务器收到请求后,服务器会先查询自己的缓存,找到对应的条目,且没有过期,则解析成功。如果没有找到,本地的DNS服务器就向根DNS服务器发起请求进行查询。根DNS服务器上是没有记录哪个域名和IP的对应关系的,他会告诉本地的DNS服务器可以到某个域服务器上进行查询,并且告诉它这个域服务器的地址,这个过程是迭代查询的。以www.baidu.com为例,根DNS服务器发现这是一个顶级域com域的一个域名,就会将这个顶级域com域的IP地址告诉本地DNS服务器。这时候本地的DNS服务器会向该域服务器发起请求,当com域服务器接收到请求后并不会直接返回这个域名对应的IP地址,而是告诉本地DNS服务器该域名对应的DNS地址(这个一般是由域名注册商提供的);于是本地DNS服务器就会向www.baidu.com这个域名的DNS地址发起请求,这时候本地的DNS服务器才能拿到这个域名对应的IP地址,并返回给操作系统内核,内核又把结果返回给浏览器,至此浏览器才拿到www.baidu.com这个域名对应的IP地址,就能进行下一步了。

8.2 建立TCP连接

拿到域名对应的IP地址之后,User-Agent(一般是指浏览器)会以一个随机端口(1024 < 端口 < 65535)向服务器的WEB程序(常见的有tomcat、nginx等)80端口发起TCP的连接请求。这个连接请求(原始的http请求经过TCP/IP4层模型的层层封包)到达服务器端后(这中间通过各种路由设备,局域网内除外),进入到网卡,然后是进入到内核的TCP/IP协议栈(用于识别该连接请求,解封包,一层一层的剥开),还有可能要经过Netfilter防火墙(属于内核的模块)的过滤,最终到达WEB程序,最终建立了TCP/IP的连接。

8.3 发起http请求

HTTP请求报文的方法是get方式,如果浏览器存储了该域名下的Cookies,那么会把Cookies放入HTTP请求头里发给服务器。

8.4 服务器响应http请求,浏览器得到html代码

服务器端WEB程序接收到http请求以后,就开始处理该请求,处理之后就返回给浏览器html文件。

8.5 浏览器解析html代码,并请求html代码中的资源

浏览器拿到index.html文件后,就开始解析其中的html代码,遇到js/css/image等静态资源时,就向服务器端去请求下载(会使用多线程下载,每个浏览器的线程数不一样),这个时候就用上keep-alive特性了,建立一次HTTP连接,可以请求多个资源,下载资源的顺序就是按照代码里的顺序,但是由于每个资源大小不一样,而浏览器又多线程请求请求资源,所以从下图看出,这里显示的顺序并不一定是代码里面的顺序。

浏览器在请求静态资源时(在未过期的情况下),向服务器端发起一个http请求(询问自从上一次修改时间到现在有没有对资源进行修改),如果服务器端返回304状态码(告诉浏览器服务器端没有修改),那么浏览器会直接读取本地的该资源的缓存文件。

8.6 浏览器对页面进行渲染呈献给用户

最后,浏览器利用自己内部的工作机制,把请求到的静态资源和html代码进行渲染,渲染之后呈现给用户。

9. HTTP协议

HTTP是基于TCP/IP协议的应用程序协议,不包括数据包的传输,主要规定了客户端和服务器的通信格式,默认使用80端口。

9.1 HTTP报文

HTTP有两类报文:

**(1)请求报文:**从客户端向服务器发送请求报文,格式如下:

img

  • 首行:[方法] + [url] + [版本]
  • Header:请求的属性,冒号分割的键值对;每组属性之间使用 \n 分隔;遇到空行表示Header部分结束
  • Body:空行后面的内容都是Body。Body允许为空字符串。如果Body存在,则在Header中会有一个Content-Length属性来标识Body的长度

**(2)响应报文:**从服务器到客户端的回答,格式如下:

img

  • 首行:[版本号] + [状态码] + [状态码解释]
  • Header:请求的属性,冒号分割的键值对;每组属性之间使用 \n 分隔;遇到空行表示Header部分结束
  • Body:空行后面的内容都是Body。Body允许为空字符串。如果Body存在,则在Header中会有一个Content-Length属性来标识Body的长度;如果服务器返回了一个 html 页面,那么 html 页面内容就在Body体中。

请求头和响应头的部分字段含义:

  • **Host:**指定服务器域名,可用来区分访问一个服务器上的不同服务。
  • **Connection:**keep-alive表示要求服务器不要关闭TCP连接,close表示明确要求关闭连接,默认值是keep-alive。
  • **Accept-Encoding:**说明自己可以接收的压缩方式。
  • **User-Agent:**用户代理,是服务器能识别客户端的操作系统(Android、IOS、WEB)及相关信息。作用是帮助服务器区分客户端,并且针对不同客户端让用户看到不同数据,做不同操作。
  • **Content-Type:**服务器告诉客户端数据的格式,常见值有text/plain、image/jpeg、image/png、video/mp4、application/json、application/zip。这些数据类型总称为MIME TYPE。
  • **Content-Encoding:**服务器数据压缩方式。
  • **Transfer-Encoding:**chunked表示采用分块传输编码,有该字段则无需使用Content-Length字段。
  • **Content-Length:**声明数据的长度,请求和回应头部都可以使用该字段。

9.2 HTTP方法

方法说明支持的HTTP协议版本
GET获取资源1.0、1.1
POST传输实体主类1.0、1.1
PUT传输文件1.0、1.1
HEAD获取报文首部1.0、1.1
DELETE删除文件1.0、1.1
OPTIONS询问支持的方法1.1
TRACE追踪路径1.1
CONNECT要求用隧道协议连接代理1.1
LINK建立和资源之间的联系1.0
UNLINE断开连接关系1.0

9.3 HTTP的状态码

状态码类别原因
1XXInformation(信息性状态码)接受的请求正在处理
2XXSuccess(成功状态码)请求正常处理完毕
3XXRedirection(重定向状态码)需要进行附加操作以完成请求
4XXClient Error(客户端错误状态码)服务器无法处理请求
5XXServer Error(服务器错误状态码)服务器处理请求出错

最常见的状态码,比如:200(OK)、404(Not Fount)、403(Forbidden,禁止访问错误)、302(Redirect,重定向)、504(Bad Gateway,无效网关)。

10. HTTP与HTTPS的区别

  • HTTPS协议需要到CA申请证书,一般免费证书很少,需要交费。
  • HTTP协议时超文本传输协议,信息明文传输;HTTPS则是具有安全性的SSL加密传输协议,即安全版的HTTP。
  • HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
  • HTTPS的连接很简单,是无状态的;HTTPS协议是有由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比HTTP协议安全。

参考链接:https://blog.csdn.net/yubujian_l/article/details/87893871

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值