计算机网络

166 阅读14分钟

tcp 三次握手过程以及为什么要三次握手 第三次握手 ACK 丢失会发生什么 tcp 四次挥手过程第四次握手完是直接关闭连接吗为什么进入 time-wait 14.如果客户端在三次握手中发送第三次请求的时出现故障了,服务端会断开连接吗? tcp 拥塞控制的方法 TCP的可靠性是怎么保证的? ~~知道哪些 http 状态码 ~~ http的过程 计算机网络的7层,4层架构 浏览器输入域名之后发生了些什么? 12.说一下DNS具体是怎么解析的? 13.客户端和服务器是如何建立连接的?

15.HTTP传输使用的是TCP协议还是UDP协议? 3.说一说你知道的负载均衡算法(我只答出了两种) 5.客户端怎么找到的服务端的ip地址? 6.服务端如何实现鉴权的? HTTP和HTTPS区别 HTTP2.0有哪些更新

一. OSI 从上到下分为 7 层:

  • 应用层:应用层协议定义的是应用进程间的通信和交互的规则,不同的网络应用需要不同的应用层协议
  • 表示层:把数据转换为能与接收者的系统格式兼容并适合传输的格式
  • 会话层:在数据传输中设置和维护电脑网络中两台电脑之间的通信连接
  • 传输层:向两台主机进程之间的通信提供通用的数据传输服务
  • 网络层:基于网络层地址(IP地址)进行不同网络系统间的路径选择,选择合适的网间路由和交换结点, 确保数据及时传送。
  • 数据链路层:在不可靠的物理介质上提供可靠的传输
  • 物理层:在局域网上透明地传送比特,尽可能屏蔽掉具体传输介质和物理设备的差异

二. TCP/IP四层

  • 应用层:对应于 OSI 参考模型的应用层,为用户提供所需要的各种服务。定义的是应用进程间的通信和交互的规则,协议包括 SMTP、HTTP、DNS等
  • 传输层:对应于 OSI 参考模型的传输层,为应用层实体提供端到端的、通用的通信功能,保证了数据包的顺序传送及数据的完整性。“通用的”是指不同的应用可以使用同一个运输层服务。协议包括 TCP、UDP 等
  • 网络层(或网际互联层):对应于 OSI 参考模型的网络层,主要解决主机到主机的路由问题。协议包括 IP、ICMP 等
  • 网络接入层:对应于 OSI 参考模型的物理层和数据链路层,负责相邻的物理节点间的可靠数据传输。协议包括 ARP、IEEE 802.2 等

图片.png

三. TCP握手、挥手

  1. TCP 标志位:代表了当前请求的目的
  • SYN(synchronous): 发送/同步标志,用来建立连接,和 ACK 标志位搭配使用。A 请求与 B 建立连接时,SYN=1,ACK=0;B 确认与 A 建立连接时,SYN=1,ACK=1
  • ACK(acknowledgement):确认标志,表示确认收到请求
  • FIN(finish):结束标志,表示关闭一个 TCP 连接
  1. 序列号seq、确认号ack:是 TCP 实现可靠传输的依赖。TCP 使用序列号来记录发送数据包的顺序
  2. 三次握手
  • 第一次握手:客户端请求建立连接,向服务端发送一个同步报文(SYN=1),同时选择一个随机数 seq = x 作为初始序列号
  • 第二次握手:服务端收到连接请求报文后,如果同意建立连接,则向客户端发送同步确认报文(SYN=1,ACK=1),确认号为 ack = x + 1,同时选择一个随机数 seq = y 作为初始序列号
  • 第三次握手:客户端收到服务端的确认后,向服务端发送一个确认报文(ACK=1),确认号为 ack = y + 1,序列号为 seq = x + 1
  • 这时就完成了三次握手,连接建立成功。随后,客户端和服务端的序列号将分别从 x+1 和 y+1 开始进行传输。
  1. 第三次握手 ACK 丢失会发生什么/三次握手阶段、四次挥手阶段的包丢失了怎么办
  • 服务器发送 [SYN/ACK] 包(第二个包)之后、收到客户端的 [ACK] 包(第三个包)之前的 TCP 连接称为半连接(half-open connect),此时服务器处于 SYN_RECV(等待客户端响应)状态。如果接收到客户端的 [ACK],则 TCP 连接成功,如果未接受到,则会不断重发请求直至成功。简而言之,通过定时器 + 超时重试机制,尝试获取确认,直到最后会自动断开连接。
  1. 不是3次握手可以吗?三次握手的作用分别是
  • 第一次握手:服务端确认“自己收、客户端发”报文功能正常
  • 第二次握手:客户端确认“自己发、自己收、服务端收、客户端发”报文功能正常,客户端认为连接已建立
  • 第三次握手:服务端确认“自己发、客户端收”报文功能正常,此时双方均建立连接,可以正常通信
  1. 四次挥手
  • 第一次挥手:客户端向服务端发送连接释放报文(FIN=1,ACK=1),主动关闭连接,同时等待服务端的确认 。序列号 seq = u,确认号 ack = k
  • 第二次挥手:服务端收到连接释放报文后,立即发出确认报文(ACK=1),序列号 seq = k,确认号 ack = u + 1。这时 TCP 连接处于半关闭状态,即客户端到服务端的连接已经释放了,但是服务端到客户端的连接还未释放。
  • 第三次挥手:服务端向客户端发送连接释放报文(FIN=1,ACK=1),主动关闭连接,同时等待 A 的确认
  • 第四次挥手:客户端收到服务端的连接释放报文后,立即发出确认报文(ACK=1)。此时,客户端就进入了 TIME-WAIT 状态。注意此时客户端到 TCP 连接还没有释放,必须经过 2*MSL(最长报文段寿命)的时间后,才进入 CLOSED 状态。而服务端只要收到客户端发出的确认,就立即进入 CLOSED 状态。可以看到,服务端结束 TCP 连接的时间要比客户端早一些。
    • MSL是Maximum Segment Lifetime英文的缩写,中文可以译为“报文最大生存时间”,他是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃
  1. 为什么需要四次挥手
  • 因为 TCP 是全双工的,一方关闭连接后,另一方还可以继续发送数据。所以四次挥手,将断开连接分成两个独立的过程。
  1. 第四次挥手之后,为什么客户端要进入TIME-WAIT阶段
  • 确保 ACK 报文能够到达服务端,从而使服务端正常关闭连接。
  • 防止已失效的连接请求报文段出现在之后的连接中。

四. TCP与UDP的区别

TCP:面向连接的、可靠的、基于字节流的传输层通信协议
UDP:无连接的、不可靠的、基于报文的传输层通信协议
面向字节流:TCP 将要发送的数据视为无结构的字节流,如果发送的数据太长,就拆分发送,如果发送的数据太短,则积累较多的字节后再发送
面向报文:UDP 一次发送一个报文,不管多大,都以报文为发送单位

图片.png

四. TCP如何保证可靠传输

  1. 应用数据被分割成 TCP 认为最适合发送的数据块。
  2. TCP 给发送的每一个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层。
  3. 校验和: TCP 将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段。
  4. TCP 的接收端会丢弃重复的数据。
  5. 流量控制: TCP 连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP 使用的流量控制协议是可变大小的滑动窗口协议。 (TCP 利用滑动窗口实现流量控制)
  6. 拥塞控制: 当网络拥塞时,减少数据的发送。
  7. ARQ协议: 也是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组。
  8. 超时重传: 当 TCP 发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
  • 补充:tcp是百分百可靠的吗?
    • 不是的,如:在三次握手的第三步,如果服务器一直没有收到客户端的ACK报文,服务器一般会进行重试,也就是再次发送SYN+ACK报文给客户端,并且一直处于SYN-RECV状态,将客户端加入等待列表(半连接队列)。重发一般会进行3~5次,大概每隔30秒会轮询一次半连接队列,重试所有的客户端。此外,服务器在发送SYN+ACK报文后,会预留一部分资源给即将建立的TCP连接,这个资源在等待重试期间会一直保留。
    • 攻击者可以伪造大量的IP地址给服务器发送SYN报文,由于伪造的IP地址几乎不可能存在,服务器也就收不到从伪造的IP地址发来的任何回应,因此服务器将会维护一个很大的等待列表,并不断地尝试向等待列表中的IP地址发送SYN+ACK,这样不仅会占用很大的系统资源,而且由于服务器等待队列已满,服务器拒绝建立新的TCP连接,这样正常的客户端想要建立连接时,反而不能成功。

4.1 流量控制

  1. 滑动窗口
    1. TCP 报文首部的字段,一共多少字节? 答:至少20字节

图片.png

    1. 滑动窗口:窗口大小就是一次传输多少数据。对所有数据帧按顺序赋予编号,发送方在发送过程中始终保持着一个发送窗口,只有落在发送窗口内的帧才允许被发送;同时接收方也维持着一个接收窗口,只有落在接收窗口内的帧才允许接收。这样通过调整发送方窗口和接收方窗口的大小可以实现流量控制。每个TCP/IP主机支持全双工数据传输,因此TCP有两个滑动窗口:一个用于接收数据,另一个用于发送数据。TCP使用肯定确认技术,其确认号指的是下一个所期待的字节。

五. 从输入URL到页面加载发生了什么

1. 用户在某个标签页输入 URL 并回车后,浏览器主进程会新开一个网络线程,发起 HTTP 请求
2. 浏览器会进行 DNS 查询,将域名解析为 IP 地址
3. 浏览器获得 IP 地址后,向服务器请求建立 TCP 连接
4. 浏览器向服务器发起 HTTP 请求
5. 服务器处理请求,返回 HTTP 响应
6. 浏览器的渲染进程解析并绘制页面
7. 如果遇到 JS/CSS/图片 等静态资源的引用链接,重复上述过程,向服务器请求这些资源

六. 客户端与服务端建立连接的过程(待修正)

1、服务器创建监听socket
2、绑定对外服务的端口号
3、开始监听
4、客户端连接到服务对应的端口
5、服务器接受并为客户端产生新的socket
6、服务端基于新socket与客户端交换数据

图片.png

七. HTTP

  1. 长连接,短链接
  • 短连接:客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。
  • 长连接:当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。
  1. HTTP,HTTPS的区别
  • 端口:HTTP默认使用端口80,而HTTPS默认使用端口443。
  • 安全性和资源消耗: ①HTTP协议运行在TCP之上,所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份。②TTPS是运行在SSL/TLS之上的HTTP协议,SSL/TLS 运行在TCP之上。所有传输的内容都经过加密,加密采用对称加密,但对称加密的密钥用服务器方的证书进行了非对称加密。所以说,HTTP 安全性没有 HTTPS高,但是 HTTPS 比HTTP耗费更多服务器资源。
  1. HTTP状态码

图片.png

- 403:没有没有权限访问此服务器
- 404:请求的网页不存在 
- 302:临时性重定向

4. HTTP1.0,1.1,2.0 5. Cookie,Session

图片.png 6. get和post的区别: - GET: 1. 请求参数在请求行中,在url后。 (请求参数值表单提交的内容等) 2. 请求的url长度有限制的 3. 不太安全 - POST: 1. 请求参数在请求体中 2. 请求的url长度没有限制的 3. 相对安全 - 补充:HTTP协议的其他请求方式:GET、HEAD、POST、PUT、PATCH、DELETE、OPTIONS

八. 负载均衡

  1. 定义:负载均衡是高可用网络基础架构的关键组件,通常用于将工作负载分布到多个服务器来提高网站、应用、数据库或其他服务的性能和可靠性。
    • 四层负载均衡工作在OSI模型的传输层,主要工作是转发,它在接收到客户端的流量以后通过修改数据包的地址信息将流量转发到应用服务器。
    • 七层负载均衡工作在OSI模型的应用层,因为它需要解析应用层流量,所以七层负载均衡在接到客户端的流量以后,还需要一个完整的TCP/IP协议栈。
  2. 软件:LVS(4层),Nginx(7层),HAProxy,

九 DNS及其解析过程

  1. DNS(DOMAIN NAME SYSTEM)是一个域名系统,通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析
  2. 解析过程
    • 第一步:客户机提出域名解析请求,并将该请求发送给本地域名服务器。
    • 第二步:当本地域名服务器收到请求后,就先查询本地缓存,如果该纪录项,则本地域名服务器就直接把查询 结果返回。
    • 第三步:如果本地缓存中没该纪录,则本地域名服务器就直接把请求发给根域名服务器,然后根域名服务器再返回给本地域名服务器一个所查询域(根子域)主域名服务器地址。
    • 第四步:本地服务器再向上一步返回的域名服务器发送请求,然后接受请求服务器查询自己的缓存,如果没该纪录,则返回相关 下级 域名服务器 地址。
    • 第五步:重复第四步,直到找到正确纪录。
    • 第六步:本地域名服务器把返回 结果保存到缓存,以备下一次使用,同时还将结果返回给客户机。
  3. 对上一问题的补充
    • 整体流程:浏览器搜索自身的 DNS 缓存、搜索操作系统的 DNS 缓存、读取本地的 Host 文件和向本地 DNS 服务器进行查询等。

    • DNS 查询共有两类:

      • 递归查询是指,当 A 向 B 查询某个域名的 IP 地址时,如果 B 不知道被查询的域名的 IP 地址,那么 B 会替 A 向更上层的服务器发起查询,将查询结果返回 A。
      • 迭代查询是指,当 A 向 B 查询某个域名的 IP 地址时,如果 B 不知道被查询的域名的 IP 地址,B 会告诉 A 下一步应该向哪个服务器查询,由 A 自己去查。
    • 一般来说,主机(也就是我们的电脑)向本地域名服务器的查询是递归查询,而本地域名服务器向根域名服务器的查询是迭代查询。