侧边栏壁纸
博主头像
一定会去到彩虹海的麦当

说什么呢?约定好的事就一定要做到啊!

  • 累计撰写 63 篇文章
  • 累计创建 16 个标签
  • 累计收到 3 条评论

目 录CONTENT

文章目录

[面试题]-计算机网络

一定会去到彩虹海的麦当
2022-05-18 / 0 评论 / 2 点赞 / 63 阅读 / 16,039 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-05-18,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

计算机网络体系机构

七层模型与四层模型

TCP/IP 体系结构相当于将 OSI 体系结构的物理层数据链路层合并为了网络接口层,并去掉了会话层表示层

TCP/IP 在网络层使用的协议是 IP 协议,IP 协议的意思是网际协议,因此TCP/IP 体系结构的网络层称为网际

五层模型

教学时把 TCP/IP 体系结构的网络接口层分成了物理层数据链路层

各层作用

1、物理层

  • 采用怎样的传输媒体(介质)
  • 采用怎样的物理接口
  • 使用怎样的信号表示比特0和1

2、数据链路层

如果这些0,1组合的传送毫无规则的话,计算机是解读不了的。我们需要制定一套规则来进行0,1的传送。例如多少个电信号为一组啊,每一组信号应该如何标识才能让计算机读懂啊等等。以太网协议规定,一组电信号构成一个数据包,我们把这个数据包称之为。每一个桢由标头(Head)和数据(Data)两部分组成。

  • 如何标识网络中的各主机(主机编址问题,例如MAC地址)
  • 如何让计算机读懂我们传送的比特流
  • 如何协调各主机争用总线

3、网络层

我们如何区分哪些MAC地址是属于同一个子网的呢?假如是同一个子网,那我们就用广播的形式把数据传送给对方,如果不是同一个了网的,我们就会把数据发给网关,让网关进行转发。
为了解决这个问题,于是,有了IP协议。

  • 如何标识各网络以及网络中的各主机(网络和主机共同编址的问题,例如IP地址),实现主机与主机之间的通信,也叫点对点(end to end)通信
  • 路由器如何转发分组,如何进行路由选择

4、运输层

计算机里面有各种各样的应用程序,计算机该如何知道这些数据是给谁的呢?

在从计算机A传数据给计算表B的时候,还得指定一个端口,以供特定的应用程序来接受处理。

  • 如何解决进程之间基于网络的通信问题
  • 出现传输错误时,如何处理

5、应用层

应用层该用什么方法(应用层协议)去解析数据

有关于这个地方的内容,大家可以去读一下这篇文章:讲一下网络五层模型,每一层的职责?

各层设计的协议

请简单说一下你了解的端口及对应的服务?

Http相关面试题

Http基本知识

1、Http是什么?

HTTP 是超文本传输协议,也就是HyperText Transfer Protocol。

2、能否详细解释「超文本传输协议」?

协议:Http是一个用在计算机世界的协议,它使用计算机能够理解的语言确立了一种计算机之间交流通信的规范,以及相关的各种控制和错误处理方式(行为约定和规范)

传输:HTTP 是一个在计算机世界里专门用来在两点之间传输数据的约定和规范

超文本:超越了普通文本的文本,它是文字、图片、视频等的混合体,最关键有超链接,能从一个超文本跳转到另外一个超文本

HTTP 是一个在计算机世界里专门在「两点」之间「传输」文字、图片、音频、视频等「超文本」数据 的「约定和规范」

3、Http常见的状态码

分类

常见状态码:

101:切换请求协议,从HTTP 切换到WebSocket
200:请求成功,有响应体301永久重定向:会缓存
302:临时重定向:不会缓存
304:协商缓存命中
403:服务器禁止访问
404:资源未找到
400:请求错误
500:服务器端错误
503:服务器繁忙

4、Http常见字段

Host 字段:客户端发送请求时,用来指定服务器的域名。

Content-Length 字段:服务器在返回数据时,会有 Content-Length 字段,表明本次回应的数据长度。

Connection 字段:常用于客户端要求服务器使用 TCP 持久连接,以便其他请求复用。

HTTP/1.1 版本的默认连接都是持久连接,但为了兼容老版本的 HTTP,需要指定 Connection 首部字 段的值为 Keep-Alive 。

Content-Type 字段:用于服务器回应时,告诉客户端,本次数据是什么格式。

客户端请求的时候,可以使用 Accept 字段声明自己可以接受哪些数据格式。

Content-Encoding 字段:说明数据的压缩方法。表示服务器返回的数据使用了什么压缩格式

客户端在请求时,用 Accept-Encoding 字段说明自己可以接受哪些压缩方法。

GET与POST

1、GET与POST的区别

  • 使用场景
    GET用于获取资源,而POST用于传输实体主体。
  • 参数
    GET和POST的请求都能使用额外的参数,但是GET的参数是以查询字符串出现在URL中,而POST 的参数存储在实体主体中。

2、GET和POST方法都是安全和幂等的吗

在HTTP 协议里,所谓的「安全」是指请求方法不会「破坏」服务器上的资源。
所谓的「幕等」,意思是多次执行相同的操作,结果都是「相同」的。

GET方法是安全且幂等的,POST是不安全和不幂等的

Http特性

1、HTTP(1.1) 的优点有哪些,怎么体现的?

HTTP 最凸出的优点是「简单、灵活和易于扩展、应用广泛和跨平台」。

  • 简单
    HTTP 基本的报文格式就是 header + body ,头部信息也是 key-value 简单文本的形式,易于理解, 降低了学习和使用的门槛
  • 灵活和易于扩展
    Http协议里面的每个组成要求都没有被固定死,都允许开发人员自定义和扩充
  • 应用广泛和跨平台
    从台式机的浏览器到手机上的各种 APP,HTTP 的应用片地开花,同时天然具有跨平台的优越性

2、缺点

HTTP 协议里有优缺点一体的双刃剑,分别是「无状态、明文传输」,同时还有一大缺点「不安全」。

(1)无状态:

  • 好处
    不需要额外的资源来记录状态信息,这能减 轻服务器的负担
  • 坏处
    进行一系列有关联操作时,而这些操作都要知道用户的身份,但服务器没有记忆能力,就无法判断这些请求是有关联的,每次都要问一遍身份信息

(2)明文传输

  • 好处
    在传输过程中的信息,是可方便阅读的,为我们调试工作带来了极大的便利性
  • 坏处
    在传输的漫长的过程 中,信息的内容都毫无隐私可言,很容易就能被窃取

(3)不安全

  • 通信使用明文(不加密),内容可能会被窃听
  • 不验证通信方的身份,因此有可能遭遇伪装
  • 无法证明报文的完整性,所以有可能已遭篡改

HTTP与HTTPS

1、HTTP 与 HTTPS 有哪些区别?

  • HTTP 是超文本传输协议,信息是明文传输,存在安全风险的问题。HTTPS 则解决 HTTP 不安全 的缺陷,在 TCP 和 HTTP 网络层之间加入了 SSL/TLS 安全协议,使得报文能够加密传输。
  • HTTP 连接建立相对简单, TCP 三次握手之后便可进行 HTTP 的报文传输。而 HTTPS 在 TCP 三次握手之后,还需进行 SSL/TLS 的握手过程,才可进入加密报文传输。
  • HTTP 的端口号是 80,HTTPS 的端口号是 443。
  • HTTPS 协议需要向 CA(证书权威机构)申请数字证书,来保证服务器的身份是可信的。

2、HTTPS解决了HTTP的哪些问题

HTTP 由于是明文传输,存在这窃听、篡改、冒充这三个风险

而HTTPS解决了上述风险:

  • 混合加密的方式实现信息的机密性,解决了窃听的风险。
  • 摘要算法的方式来实现完整性,它能够为数据生成独一无二的「指纹」,指纹用于校验数据的完 整性,解决了篡改的风险。
  • 将服务器公钥放入到数字证书中,解决了冒充的风险。

混合加密

HTTPS 采用的是对称加密和非对称加密结合的「混合加密」方式:

  • 在通信建立前采用非对称加密的方式交换「会话秘钥」,后续就不再使用非对称加密。
  • 在通信过程中全部使用对称加密的「会话秘钥」的方式加密明文数据。

非对称加密可以安全地交换密钥,但速度慢,对称加密运算速度快,但无法做到安全的密钥交换

数字证书

客户端先向服务器端索要公钥,然后用公钥加密信息,服务器收到密文后,用自己的私钥解密。

这就存在些问题,如何保证公钥不被篡改和信任度?

所以这里就需要借助第三方权威机构 CA (数字证书认证机构),将服务器公钥放在数字证书(由数 字证书认证机构颁发)中,只要证书是可信的,公钥就是可信的。

3、HTTPS是如何建立连接的?


Https工作流程

  1. 客户端发起Https请求,连接到服务器的443端口。
  2. 服务器必须要有一套数字证书(证书内容有公钥、证书颁发机构、失效日期等)。
  3. 服务器将自己的数字证书发送给客户端(公钥在证书里面,私钥由服务器持有)。
  4. 客户端收到数字证书之后,会验证证书的合法性。如果证书验证通过,就会生成一个随机的对称密钥,用证书的公钥加密。
  5. 客户端将公钥加密后的密钥发送到服务器。
  6. 服务器接收到客户端发来的密文密钥之后,用自己之前保留的私钥对其进行非对称解密,解密之后就得到客户端的密钥,然后用客户端密钥对返回数据进行对称加密,酱紫传输的数据都是密文啦。
  7. 服务器将加密后的密文返回到客户端。
  8. 客户端收到后,用自己的密钥对其进行对称解密,得到服务器返回的数据。

说说什么是数字签名?什么是数字证书?

思路: 这道题考查的知识点,不仅仅是数字签名,数字证书,很可能面试官也会问你https的原理的,因为https原理跟数字证书有关的哈,大家需要掌握https原理哦。
数字证书是指在互联网通讯中标志通讯各方身份信息的一个数字认证,人们可以在网上用它来识别对方的身份。它的出现,是为了避免身份被篡改冒充的。比如Https的数字证书,就是为了避免公钥被中间人冒充篡改:
数字证书构成

  • 公钥和个人等信息,经过Hash摘要算法加密,形成消息摘要;将消息摘要拿到拥有公信力的认证中心(CA),用它的私钥对消息摘要加密,形成数字签名
  • 公钥和个人信息、数字签名共同构成数字证书

对称加密与非对称加密有什么区别

思路: 这道题考察的知识点是对称加密与非对称加密算法,什么是对称加密,什么是非对称加密呢?
对称加密:指加密和解密使用同一密钥,优点是运算速度较快,缺点是如何安全将密钥传输给另一方。常见的对称加密算法有:DES、AES等。

对称加密
非对称加密:指的是加密和解密使用不同的密钥(即公钥和私钥)。公钥与私钥是成对存在的,如果用公钥对数据进行加密,只有对应的私钥才能解密。常见的非对称加密算法有RSA。

HTTP/1.1、HTTP/2、HTTP/3 演变

1、 HTTP/1.1 相比 HTTP/1.0 提高了什么性能?

HTTP/1.1 相比 HTTP/1.0 性能上的改进:

  • 使用 TCP 长连接的方式改善了 HTTP/1.0 短连接造成的性能开销。 支
  • 持管道(pipeline)网络传输,只要第一个请求发出去了,不必等其回来,就可以发第二个请求 出去,可以减少整体的响应时间。

但 HTTP/1.1 还是有性能瓶颈:

  • 请求 / 响应头部(Header)未经压缩就发送,首部信息越多延迟越大。只能压缩 Body 的部分; 发
  • 冗长的首部。每次互相发送相同的首部造成的浪费较多;
  • 服务器是按请求的顺序响应的,如果服务器响应慢,会招致客户端一直请求不到数据,也就是队 头阻塞;
  • 没有请求优先级控制; 请求只能从客户端开始,服务器只能被动响应。

2、针对 HTTP/1.1 的性能瓶颈,HTTP/2 做了什么优化?

HTTP/2 协议是基于 HTTPS 的,所以 HTTP/2 的安全性也是有保障的。 那 HTTP/2 相比 HTTP/1.1 性能上的改进:

(1)头部压缩

HTTP/2 会压缩头(Header)如果你同时发出多个请求,他们的头是一样的或是相似的,那么,协议会 帮你消除重复的部分。

这就是所谓的 HPACK 算法:在客户端和服务器同时维护一张头信息表,所有字段都会存入这个表, 生成一个索引号,以后就不发送同样字段了,只发送索引号,这样就提高速度了。

(2)二进制格式

HTTP/2 不再像 HTTP/1.1 里的纯文本形式的报文,而是全面采用了二进制格式,头信息和数据体都是 二进制,并且统称为帧(frame):头信息帧和数据帧

(3)数据流

HTTP/2 的数据包不是按顺序发送的,同一个连接里面连续的数据包,可能属于不同的回应。因此,必 须要对数据包做标记,指出它属于哪个回应。

每个请求或回应的所有数据包,称为一个数据流( Stream )。

每个数据流都标记着一个独一无二的编 号,其中规定客户端发出的数据流编号为奇数, 服务器发出的数据流编号为偶数 客户端还可以指定数据流的优先级。

优先级高的请求,服务器就先响应该请求。

(4) 多路复用

HTTP/2 是可以在一个连接中并发多个请求或回应,而不用按照顺序一一对应

移除了 HTTP/1.1 中的串行请求,不需要排队等待,也就不会再出现「队头阻塞」问题,降低了延迟, 大幅度提高了连接的利用率。

(5)服务器推送

HTTP/2 还在一定程度上改善了传统的「请求 - 应答」工作模式,服务不再是被动地响应,也可以主动 向客户端发送消息。

3、HTTP/2 有哪些缺陷?HTTP/3 做了哪些优化?

HTTP/2 多个请求复用一个TCP连接,一旦发生丢包,就会阻塞住所有的 HTTP 请求。

这都是基于 TCP 传输层的问题,所以 HTTP/3 把 HTTP 下层的 TCP 协议改成了 UDP

IP相关知识

IP地址基本认识

IP 地址(IPv4 地址)由 32 位正整数来表示,IP 地址在计算机是以二进制的方式处理的。

IP地址分类

IP 地址分类成了 5 种类型,分别是 A 类、B 类、C 类、D 类、E 类

上图中黄色部分为分类号,用以区分 IP 地址类别。

IP分类的情况,同一网络下没有地址层次,且不能很好的与现实网络匹配

无分类地址CIDR

这种方式不再有分类地址的概念,32 比特的 IP 地址被划分为两部分,前面是网络号,后面是主机号。

如何划分

(1)表示形式 a.b.c.d/x ,其中 /x 表示前 x 位属于网络号, x 的范围是 0 ~ 32 ,这就使得 IP 地址更加 具有灵活性。

比如 10.100.122.2/24,这种地址表示形式就是 CIDR,/24 表示前 24 位是网络号,剩余的 8 位是主机 号

(2)子网掩码

将子网掩码和 IP 地址按位计算 AND,就可得到网络号。

IPV4 地址不够如何解决

1、NAT

其实我们平时上网,电脑的IP地址都是属于私有地址,无法出网关,我们的数据都是通过网关来中转的,这个其实NAT 协议,可以用来暂缓IPV4 地址不够

2、IPV6

IPv6:作为接替IPv4的下一代互联网协议,其可以实现2的128次方个地址,而这个数量级,即使是给地球上每一颗沙子都分配一个IP地址,该协议能够从根本上解决IPv4地址不够用的问题。

IP(网络层) 和 MAC (数据链路层)之间的区别和关系

IP 的作用是主机之间通信用的,而 MAC 的作用则是实现「直连」 的两个设备之间通信,而 IP 则负责在「没有直连」的两个网络之间进行通信传输

在网络中数据包传输中,源IP地址和目标IP地址在传输过程中是不会变化的,只有 源 MAC 地址和目标 MAC 一直在变化

有了IP地址,为什么还要用MAC地址?

  • 简而言之,标识网络中的一台计算机,比较常用的就是IP地址和MAC地址,但计算机的IP地址可由用户自行更改,管理起来就相对困难,而MAC地址不可更改,所以一般会把IP地址和MAC地址组合起来使用。
  • 那只使用MAC地址不用IP地址行不行呢?不行的!因为最早就是MAC地址先出现的,并且当时并不用IP地址,只用MAC地址,后来随着网络中的设备越来越多,整个路由过程越来越复杂,便出现了子网的概念。对于目的地址在其他子网的数据包,路由只需要将数据包送到那个子网即可。
  • 那为什么要用IP地址呢?是因为IP地址是和地域相关的,对于同一个子网上的设备,IP地址的前缀都是一样的,这样路由器通过IP地址的前缀就知道设备在在哪个子网上了,而只用MAC地址的话,路由器则需要记住每个MAC地址在哪个子网,这需要路由器有极大的存储空间,是无法实现的。
  • IP地址可以比作为地址,MAC地址为收件人,在一次通信过程中,两者是缺一不可的。

DNS

通常使用的方式是域名,而不是 IP 地址,因为域名方便人类记忆。

域名的层级关系类似一个树状结构:

  • 根 DNS 服务器
  • 顶级域 DNS 服务器(com)
  • 权威 DNS 服务器(server.com

域名解析的工作流程

浏览器首先看一下自己的缓存里有没有,如果没有就向操作系统的缓存要,还没有就检查本机域名解析 文件 hosts ,如果还是没有,就会 DNS 服务器进行查询,查询的过程如下:

  • 客户端首先会发出一个DNS请求,问www.server.com的IP是啥,并发给本地DNS服务器(也就是客户端的TCP/IP设置中填写的DNS服务器地址)
  • 本地域名服务器收到客户端的请求后,如果缓存里的表格能找到www.server.com,则它直接返回IP地址。如果没有,本地DNS会去问它的根域名服务器:“老大,能告诉我www.server.com的IP地址吗?”根域名服务器是最高层次的,它不直接用于域名解析,但能指明一条道路。
  • 根DNS 收到来自本地DNS 的请求后,发现后置是.com,说:"www.server.com这个域名归com区域管理”,我给你.com顶级域名服务器地址给你,你去问问它吧。
  • 本地DNS收到顶级域名服务器的地址后,发起请求问“老二,你能告诉我www.server.com的IP地址吗?
  • 顶级域名服务器说:“我给你负责www.server.com区域的权威DNS服务器的地址,你去问它应该能问到”。
  • 本地DNS于是转向问权威DNS服务器:“老三,www.server.com对应的IP是啥呀?”server.com的权威DNS服务器,它是域名解析结果的原出处。为啥叫权威呢?就是我的域名我做主
  • 权威DNS服务器查询后将对应的IP地址X.X.X.X告诉本地DNS。
  • 本地DNS 再将IP 地址返回客户端,客户端和目标建立连接,

ARP

在传输一个 IP 数据报的时候,确定了源 IP 地址和目标 IP 地址后,就会通过主机「路由表」确定 IP 数 据包下一跳。然而,网络层的下一层是数据链路层,所以我们还要知道「下一跳」的 MAC 地址。

由于主机的路由表中可以找到下一跳的 IP 地址,所以可以通过 ARP 协议,求得下一跳的 MAC 地址。

ARP 是借助 ARP 请求与 ARP 响应两种类型的包确定 MAC 地址的

  • 主机会通过广播发送 ARP 请求,这个包中包含了想要知道的 MAC 地址的主机 IP 地址。
  • 当同个链路中的所有设备收到 ARP 请求时,会去拆开 ARP 请求包里的内容,如果 ARP 请求包中 的目标 IP 地址与自己的 IP 地址一致,那么这个设备就将自己的 MAC 地址塞入 ARP 响应包返回 给主机

DHCP

电脑通常都是通过 DHCP 动态获取 IP 地址,大大省去了配 IP 信息繁琐的过程。

ICMP协议的功能

ICMP,Internet Control Message Protocol ,Internet控制消息协议。

  • ICMP协议是一种面向无连接的协议,用于传输出错报告控制信息。
  • 它是一个非常重要的协议,它对于网络安全具有极其重要的意义。它属于网络层协议,主要用于在主机与路由器之间传递控制信息,包括报告错误、交换受限控制和状态信息等。
  • 当遇到IP数据无法访问目标、IP路由器无法按当前的传输速率转发数据包等情况时,会自动发送ICMP消息。

比如我们日常使用得比较多的ping,就是基于ICMP的

说下ping的原理

一般来说,ping可以用来检测网络通不通。它是基于ICMP协议工作的。假设机器A ping机器B,工作过程如下:

  1. ping通知系统,新建一个固定格式的ICMP请求数据包
  2. ICMP协议,将该数据包和目标机器B的IP地址打包,一起转交给IP协议层
  3. IP层协议将本机IP地址为源地址,机器B的IP地址为目标地址,加上一些其他的控制信息,构建一个IP数据包
  4. 先获取目标机器B的MAC地址。
  5. 数据链路层构建一个数据帧,目的地址是IP层传过来的MAC地址,源地址是本机的MAC地址
  6. 机器B收到后,对比目标地址,和自己本机的MAC地址是否一致,符合就处理返回,不符合就丢弃。
  7. 根据目的主机返回的ICMP回送回答报文中的时间戳,从而计算出往返时间
  8. 最终显示结果有这几项:发送到目的主机的IP地址、发送 & 收到 & 丢失的分组数、往返时间的最小、最大& 平均值

TCP相关知识

什么是TCP

TCP 是面向连接的、可靠的、基于字节流的传输层通信协议。

  • 面向连接:一定是「一对一」才能连接,不能像 UDP 协议可以一个主机同时向多个主机发送消 息,也就是一对多是无法做到的;
  • 可靠的:无论的网络链路中出现了怎样的链路变化,TCP 都可以保证一个报文一定能够到达接收 端;
  • 字节流:消息是「没有边界」的,所以无论我们消息有多大都可以进行传输。并且消息是「有序 的」,当「前一个」消息没有收到的时候,即使它先收到了后面的字节,那么也不能扔给应用层 去处理,同时对「重复」的报文会自动丢

TCP的粘包和拆包

TCP是面向流,没有界限的一串数据。TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可能会被TCP拆分成多个包进行发送也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的TCP粘包和拆包问题。

为什么会产生粘包和拆包呢?

  • 要发送的数据小于TCP发送缓冲区的大小,TCP将多次写入缓冲区的数据一次发送出去,将会发生粘包;
  • 接收数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包;
  • 要发送的数据大于TCP发送缓冲区剩余空间大小,将会发生拆包;
  • 待发送数据大于MSS(最大报文长度),TCP在传输前将进行拆包。即TCP报文长度-TCP头部长度>MSS。

解决方案:

  • 发送端将每个数据包封装为固定长度
  • 在数据尾部增加特殊字符进行分割
  • 将数据分为两部分,一部分是头部,一部分是内容体;其中头部结构大小固定,且有一个字段声明内容体的大小。

保活计时器的作用

除时间等待计时器外,TCP 还有一个保活计时器(keepalive timer)。设想这样的场景:客户已主动与服务器建立了TCP连接。但后来客户端的主机突然发生故障。显然,服务器以后就不能再收到客户端发来的数据。因此,应当有措施使服务器不要再白白等待下去。这就需要使用保活计时器了。
服务器每收到一次客户的数据,就重新设置保活计时器,时间的设置通常是两个小时。若两个小时都没有收到客户端的数据,服务端就发送一个探测报文段,以后则每隔 75秒钟发送一次。若连续发送10个探测报文段后仍然无客户端的响应,服务端就认为客户端出了故障,接着就关闭这个连接。

如何唯一确定一个TCP连接

TCP 四元组可以唯一的确定一个连接,四元组包括如下:

  • 源地址
  • 源端口
  • 目的地址
  • 目的端口

源地址和目的地址的字段(32位)是在 IP 头部中,作用是通过 IP 协议发送报文给对方主机。

源端口和目的端口的字段(16位)是在 TCP 头部中,作用是告诉 TCP 协议应该把报文发给哪个进程。

有一个 IP 的服务器监听了一个端口,它的 TCP 的最大连接数是多少?

服务器通常固定在某个本地端口上监听,等待客户端的连接请求。 因此,客户端 IP 和 端口是可变的,其理论值计算公式如下:

对 IPv4,客户端的 IP 数最多为 2 的 32 次方,客户端的端口数最多为 2 的 16 次方,也就是 服务端单机最大 TCP 连接数,约为 2 的 48 次方。

当然,服务端最大并发 TCP 连接数远不能达到理论上限。

  • 首先主要是文件描述符限制,Socket 都是文件,所以首先要通过 ulimit 配置文件描述符的数 目;
  • 另一个是内存限制,每个 TCP 连接都要占用一定内存,操作系统的内存是有限的。

UDP 和 TCP 有什么区别呢?分别的应用场景是?

区别

  1. 连接
    TCP 是面向连接的传输层协议,传输数据前先要建立连接。
    UDP 是不需要连接,即刻传输数据。
  2. 服务对象
    TCP 是一对一的两点服务,即一条连接只有两个端点。
    UDP 支持一对一、一对多、多对多的交互通信
  3. 可靠性
    TCP 是可靠交付数据的,数据可以无差错、不丢失、不重复、按需到达。
    UDP 是尽最大努力交付,不保证可靠交付数据。
  4. 拥塞控制、流量控制
    TCP 有拥塞控制和流量控制机制,保证数据传输的安全性。
    UDP 则没有,即使网络非常拥堵了,也不会影响 UDP 的发送速率。
  5. 首部开销
    TCP 首部长度较长,会有一定的开销,首部在没有使用「选项」字段时是 20 个字节,如果使 用了「选项」字段则会变长的。
    UDP 首部只有 8 个字节,并且是固定不变的,开销较小。
  6. 传输方式

TCP 是流式传输,没有边界,但保证顺序和可靠。

UDP 是一个包一个包的发送,是有边界的,但可能会丢包和乱序。
  1. 分片不同
    TCP 的数据大小如果大于 MSS 大小,则会在传输层进行分片,目标主机收到后,也同样在传输 层组装 TCP 数据包,如果中途丢失了一个分片,只需要传输丢失的这个分片。
    UDP 的数据大小如果大于 MTU 大小,则会在 IP 层进行分片,目标主机收到后,在 IP 层组装完 数据,接着再传给传输层,但是如果中途丢了一个分片,则就需要重传所有的数据包,这样传输 效率非常差,所以通常 UDP 的报文应该小于 MTU。

应用场景

由于 TCP 是面向连接,能保证数据的可靠性交付,因此经常用于:

  • FTP 文件传输
  • HTTP / HTTPS

由于 UDP 面向无连接,它可以随时发送数据,再加上UDP本身的处理既简单又高效,因此经常用于:

  • 包总量较少的通信,如 DNS 、 SNMP 等
  • 视频、音频等多媒体通信
  • 广播通信

三次握手

**刚开始客户端处于closed的状态,服务端处于listen状态。**然后

1、第一次握手:客户端给服务端发一个SYN报文,并指明客户端的初始化序列号ISN(c)。此时客户端处于SYN Send 状态。

2、第二次握手:服务器收到客户端的SYN报文之后,会以自己的SYN报文作为应答,并且也是指定了自己的初始化序列号 ISN(s),同时会把客户端的ISN +1作为ACK的值,表示自己已经收到了客户端的SYN,此时服务器处于SYN_RCVD的状态。

3、第三次握手:客户端收到SYN报文之后,会发送一个ACK报文,当然,也是一样把服务器的ISN+1作为ACK的值,表示已经收到了服务端的SYN 报文,此时客户端处于established状态。

4、服务器收到ACK报文之后,也处于established状态,此时,双方以建立起了链接

第三次握手是可以携带数据的,前两次握手是不可以携带数据的

第三次的话,此时客户端已经处于 established 状态,也就是说,对于客户端来说,他已经建立起连接了,并且也已经知道服务器的接收、发送能力是正常的了,所以第三次是可以携带数据的。

如何在 Linux 系统中查看 TCP 状态?

TCP 的连接状态查看,在 Linux 可以通过 netstat -napt 命令查看

为什么是三次握手?不是两次、四次?

  • 三次握手才可以阻止重复历史连接的初始化(主要原因)
    如果是两次握手连接,就不能判断当前连接是否是历史连接,三次握手则可以在客户端(发送方)准备 发送第三次报文时,客户端因有足够的上下文来判断当前连接是否是历史连接
  • 三次握手才可以同步双方的初始序列号
    当服务端发送「初始序列号」给客户端的时候,依然也要得到客户端的应答回应,这样一来一回,才能确保双方的初始序列号能被可靠的同步。
  • 三次握手才可以避免资源浪费
    如果客户端的 SYN 阻塞了,重复发送多次 SYN 报文,那么服务器在收到请求后就会建立多个冗余 的无效链接,造成不必要的资源浪
  • 「四次握手」:三次握手就已经理论上最少可靠连接建立,所以不需要使用更多的通信次数

为什么客户端和服务端的初始序列号 ISN 是不相同的?

说明:如果要求客户端和服务端相同的话,则客户端的每次连接所产生的ISN也必须都是一样的

如果一个已经失效的连接被重用了,但是该旧连接的历史报文还残留在网络中,如果序列号相同,那么 就无法分辨出该报文是不是历史报文,如果历史报文被新的连接接收了,则会产生数据错乱。

所以,每次建立连接前重新初始化一个序列号主要是为了通信双方能够根据序号将不属于本连接的报文 段丢弃。

另一方面是为了安全性,防止黑客伪造的相同序列号的 TCP 报文被对方接收

四次挥手

刚开始双方都处于establised状态,假如是客户端先发起关闭请求,则:

1、第一次挥手:客户端发送一个FIN报文,报文中会指定一个序列号。此时客户端处于FIN WAIT1状态。

2、第二次挥手:服务端收到FIN之后,会发送ACK报文,且把客户端的序列号值+ 1作为ACK报文的序列号值,表明已经收到客户端的报文了,此时服务端处于CLOSE_WAIT状态。

3、第三次挥手:如果服务端也想断开连接了,和客户端的第一次挥手一样,发给FIN报文,且指定一个序列号。此时服务端处于LAST ACK的状态。

4、第四次挥手:客户端收到FIN之后,一样发送一个ACK报文作为应答,且把服务端的序列号值+1作为自己ACK报文的序列号值,此时客户端处于TIME WAIT状态。需要过一阵子以确保服务端收到自己的ACK报文之后才会进入CLOSED状态

5、服务端收到ACK报文之后,就处于关闭连接了,处于CLOSED状态。

为什么挥手需要四次?

  • 关闭连接时,客户端向服务端发送 FIN 时,仅仅表示客户端不再发送数据了但是还能接收数 据
  • 服务器收到客户端的 FIN 报文时,先回一个 ACK 应答报文,而服务端可能还有数据需要处理 和发送,等服务端不再发送数据时,才发送 FIN 报文给客户端来表示同意现在关闭连接。

从上面过程可知,服务端通常需要等待完成数据的发送和处理,所以服务端的 ACK 和 FIN 一般都 会分开发送,从而比三次握手导致多了一次。

为什么 TIME_WAIT 等待的时间是 2MSL?

MSL 是 Maximum Segment Lifetime,报文最大生存时间,它是任何报文在网络上存在的最长时间, 超过这个时间报文将被丢弃。

网络中可能存在来自发送方的数据包,当这些发 送方的数据包被接收方处理后又会向对方发送响应,所以一来一回需要等待 2 倍的时间。

为什么需要 TIME_WAIT 状态?

主动发起关闭连接的一方,才会有 TIME-WAIT 状态。 需要 TIME-WAIT 状态,主要是两个原因:

  • 防止具有相同「四元组」的「旧」数据包被收到;
    经过 2MSL 这个时间,足以让两个方向上的数据包都被丢弃, 使得原来连接的数据包在网络中都自然消失,再出现的数据包一定都是新建立连接所产生的。
  • 保证「被动关闭连接」的一方能被正确的关闭,即保证最后的 ACK 能让被动关闭方接收,从而帮 助其正常关闭;

TCP协议如何保证可靠传输

主要有校验和、序列号、超时重传、流量控制及拥塞控制等几种方法。

校验和

在发送算和接收端分别计算数据的校验和,如果两者不一致,则说明数据在传输过程中出现了差错,TCP将丢弃和不确认此报文段。

序列号:

TCP会对每一个发送的字节进行编号,接收方接到数据后,会对发送方发送确认应答(ACK报文),并且这个ACK报文中带有相应的确认编号,告诉发送方,下一次发送的数据从编号多少开始发。如果发送方发送相同的数据,接收端也可以通过序列号判断出,直接将数据丢弃。

超时重传

就是在发送数据时,设定一个定时器,当超过指定的时间后,没有收到对方 的 ACK 确认应答报文,就会重发该数据,也就是我们常说的超时重传

TCP 会在以下两种情况发生超时重传:

  • 数据包丢失
  • 确认应答丢失

快速重传

TCP 还有另外一种快速重传(Fast Retransmit)机制,它不以时间为驱动,而是以数据驱动重传。

快速重传的工作方式是当收到三个相同的 ACK 报文时,会在定时器过期之前,重传丢失的报文 段。

滑动窗口

TCP利用滑动窗口实现流量控制的机制。滑动窗口(Sliding window)是一种流量控制技术。早期的网络通信中,通信双方不会考虑网络的拥挤情况直接发送数据。由于大家不知道网络拥塞状况,同时发送数据,导致中间节点阻塞掉包,谁也发不了数据,所以就有了滑动窗口机制来解决此问题。

TCP中采用滑动窗口来进行传输控制,滑动窗口的大小意味着接收方还有多大的缓冲区可以用于接收数据。发送方可以通过滑动窗口的大小来确定应该发送多少字节的数据。

当滑动窗口为0时,发送方一般不能再发送数据报,但有两种情况除外,一种情况是可以发送紧急数据,例如,允许用户终止在远端机上的运行进程。另一种情况是发送方可以发送一个1字节的数据报来通知接收方重新声明它希望接收的下一字节及发送方的滑动窗口大

流量控制

发送方不能无脑的发数据给接收方,要考虑接收方处理能力。 如果一直无脑的发数据给对方,但对方处理不过来,那么就会导致触发重发机制,从而导致网络流量的 无端的浪费。

为了解决这种现象发生,TCP 提供一种机制可以让「发送方」根据「接收方」的实际接收能力控制发送 的数据量,这就是所谓的流量控制。

TCP中采用滑动窗口来进行传输控制,滑动窗口的大小意味着接收方还有多大的缓冲区可以用于接收数据。发送方可以通过滑动窗口的大小来确定应该发送多少字节的数据。当滑动窗口为0时,发送方一般不能再发送数据报,但有两种情况除外,一种情况是可以发送紧急数据,例如,允许用户终止在远端机上的运行进程。另一种情况是发送方可以发送一个1字节的数据报来通知接收方重新声明它希望接收的下一字节及发送方的滑动窗口大小。

TCP 拥塞控制

如果网络出现拥塞,则会产生丢包等问题,这时发送方会将丢失的数据包继续重传,网络拥塞会更加严重,所以在网络出现拥塞时应注意控制发送方的发送数据,降低整个网络的拥塞程度。

为了进行拥塞控制,TCP发送方要维持一个拥塞窗口(cwnd)的状态变量。它和流量控制的滑动窗口是不一样的,滑动窗口是根据接收方数据缓冲区大小确定的,而拥塞窗口是根据网络的拥塞情况动态确定的,一般来说发送方真实的发送窗口为滑动窗口和拥塞窗口中的最小值。

TCP 的拥塞控制采用了四种算法,即 慢开始拥塞避免快重传快恢复。在网络层也可以使路由器采用适当的分组丢弃策略(如主动队列管理 AQM),以减少网络拥塞的发生。

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

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

什么是DoS、DDoS、DRDoS攻击?

  • OS: (Denial of Service),翻译过来就是拒绝服务,一切能引起DOS行为的攻击都被称为DOS攻击。最常见的DoS攻击就有计算机网络宽带攻击连通性攻击
  • DDoS: (Distributed Denial of Service),翻译过来是分布式拒绝服务。是指处于不同位置的多个攻击者同时向一个或几个目标发动攻击,或者一个攻击者控制了位于不同位置的多台机器并利用这些机器对受害者同时实施攻击。常见的DDos有SYN Flood、Ping of Death、ACK Flood、UDP Flood等。
  • DRDoS: (Distributed Reflection Denial of Service),中文是分布式反射拒绝服务,该方式靠的是发送大量带有被害者IP地址的数据包给攻击主机,然后攻击主机对IP地址源做出大量回应,从而形成拒绝服务攻击。

什么是XSS攻击,如何避免?

思路: XSS攻击也是比较常见,XSS,叫跨站脚本攻击(Cross-Site Scripting),因为会与层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,因此有人将跨站脚本攻击缩写为XSS。它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意攻击用户的特殊目的。XSS攻击一般分三种类型:存储型 、反射型 、DOM型XSS

21.1 XSS是如何攻击的呢?

拿反射型举个例子吧,流程图如下:

21.2 如何解决XSS攻击问题?

  • 对输入进行过滤,过滤标签等,只允许合法值。
  • HTML转义
  • 对于链接跳转,如<a href=“xxx” 等,要校验内容,禁止以script开头的非法链接。
  • 限制输入长度

键入网址后,期间发生了什么

  1. DNS解析,查找域名对应的IP地址。
  2. 与服务器通过三次握手,建立TCP连接
  3. 向服务器发送HTTP请求
  4. 服务器处理请求,返回网页内容
  5. 浏览器解析并渲染页面
  6. TCP四次挥手,连接结束
  1. 解析URL,从而生成发送给 Web 服务器的请求信息
  2. 生产 HTTP 请求信息
    对 URL 进行解析之后,浏览器确定了 Web 服务器和文件名,接下来就是根据这些信息来生成 HTTP 请求消息了。
  3. DNS解析:浏览器查询DNS,获取域名对应的IP地址
    具体过程包括浏览器搜索自身的DNS缓存、搜索操作系统的DNS缓存、读取本地的Host文件和向本地DNS服务器进行查询等。
    对于向本地DNS服务器进行查询,如果要查询的域名包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析(此解析具有权威性);
    如果要查询的域名不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析(此解析不具有权威性)。
    如果本地域名服务器并未缓存该网址映射关系,那么将根据其设置发起递归查询或者选代查询;
  4. TCP 连接:浏览器获得域名对应的IP地址以后,浏览器向服务器请求建立链接,发起三次握手;在双方建立了连接后,给数据加上TCP头部,TCP 报文中的数据部分就是存放 HTTP 头部 + 数据,组装好 TCP 报文之后,就 需交给下面的网络层处理。
  5. 远程定位IP
    在 IP 协议里面需要有源地址 IP 和 目标地址 IP。根据路由表规则,来判断哪一个网卡作为源地址 IP。这个判断相当于在多块 网卡中判断应该使用哪个一块网卡来发送包。目标地址,我们已经通过DNS域名解析得到的Web服务器IP
    到此,生产IP报文
  6. 两点传输——MAC
    在网络中数据包传输中,源IP地址和目标IP地址在传输过程中是不会变化的,通过 源 MAC 地址和目标 MAC 不断的变化来不断前进到达目标IP地址。
    在 MAC 包头里需要发送方 MAC 地址和接收方目标 MAC 地址,用于两点之间的传输。
    发送方的 MAC 地址获取就比较简单了,MAC 地址是在网卡生产时写入到 ROM 里的,只要将这个值读 取出来写入到 MAC 头部就可以了。
    接收方的MAC地址就需要ARP来获取
    这里我们的第一个接收方是路由器,所以获取的是路由器的MAC地址

    至此,我们便可以生产MAC报文
  7. 出口 —— 网卡

IP 生成的网络包只是存放在内存中的一串二进制数字信息,没有办法直接发送给对方。因此,我们需要 将数字信息转换为电信号,才能在网线上传输,也就是说,这才是真正的数据发送过程。负责执行这一操作的是网卡

  1. 送别者 —— 交换机
    交换机根据 MAC 地址表查找 MAC 地址,然后将信号发送到相应的端口。
  2. 出境大门 —— 路由器
    我们需要根据路由表的网关列判断对方的地址。
    • 如果网关是一个 IP 地址,则这个IP 地址就是我们要转发到的目标地址,还未抵达终点,还需继续 需要路由器转发。
    • 如果网关为空,则 IP 头部中的接收方 IP 地址就是要转发到的目标地址,也是就终于找到 IP 包头 里的目标地址了,说明已抵达终点。
  3. 服务器处理请求并返回HTTP报文:服务器接收到这个请求,并根据路径参数映射到特定的请求处理器进行处理,并将处理结果及相应的视图返回给浏览器;
  4. 浏览器解析渲染页面:浏览器解析并渲染视图,若遇到对js文件、css文件及图片等静态资源的引用,则重复上述步骤并向服务器请求这些资源;浏览器根据其请求到的资源、数据宣染页面,最终向用户呈现一个完整的页面。
  5. 连接结束。
2

评论区