| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> 计算机面试重难点 之 计算机网络 -> 正文阅读 |
|
[网络协议]计算机面试重难点 之 计算机网络 |
TCP(传输层)TCP报文段头部每个 TCP 段都包含源端和目的端的端口号,用于寻找发送方和接收方应用进程。这两个值加 上 IP 首部中的源端 IP 地址和目的端 IP 地址唯一确定一个 TCP 连接。 首部固定部分各字段意义如下:
6 个控制位非常重要:
三次握手过程三次握手(Three-way Handshake)指客户端和服务器建立一个TCP连接时,双方总共需要发送3个报文段。目的: 刚开始服务端处于监听状态,进行三次握手由客户端主动发起:
三次握手为什么不能是两次?
什么是半连接队列服务器第一次收到客户端的 当然还有一个全连接队列,就是已经完成三次握手,建立起连接的就会放在全连接队列中。如果队列满了就有可能会出现丢包现象。
|
类型 | 传输可靠性 | 是否面向连接 | 是否支持多播,广播 | 传输形式 | 资源占用 | 首部长度(字节) | 应用场景 |
---|---|---|---|---|---|---|---|
TCP | 可靠 | 是 | 否 | 面向字节流 | 多 | 20 - 60 | 文件,邮件传输 |
UDP | 不可靠 | 否 | 是 | 面向报文段 | 少 | 8 | 即时通讯,直播等 |
TCP
提供可靠服务,在传送数据之前必须先建立连接,数据传送结束后要释放连接;UDP
与之相反,只尽最大努力交付。
TCP
不提供广播或多播服务;UDP
则提供。
TCP
是面向字节流的;而UDP
是面向报文段的。
TCP
要提供可靠的服务,建立连接,释放连接,加之确认、窗口、重传、流量控制、拥塞控制、定时器等机制都会占用更多的系统资源,同时导致协议头部增大(20 - 60 字节);UDP
则占用较少系统资源,协议头部也更小(仅 8 字节)。
TCP
提供可靠服务,故使用在文件传输、邮件传输等场景;虽然 UDP
不提供可靠交付,但在某些情况下 UDP
确是一种最有效的工作方式,如即时通讯,直播等场景。
TCP
粘包就是指发送方应用层交给TCP
发送的若干数据包经过TCP
传输到达接收方时合并粘成了一个数据包,出现粘包的原因是多方面的,可能是来自发送方,也可能是来自接收方。
发送方原因
TCP
默认使用 Nagle
算法,当应用层交付给TCP
发送的数据包过于小时,发送方会收集了多个较小的数据包进行合并发送,这将会发生粘包。
接收方原因
TCP
发送方发送数据很快,接收方TCP
缓冲区收到大量数据,但应用层取出数据的速度又太慢,造成多个数据包被缓存,应用层就有可能读取到多个首尾相接粘到一起的数据包。
在应用层进行处理。如:
TCP
的每个数据包头部都添加长度字段,接收方应用层读取数据时根据数据包头部长度字段循环读取相应长度的内容;TCP
的每个数据包的首、尾分别添加开始符、结束符。HTTP
协议是Hyper Text Transfer Protocol(超文本传输协议)
的缩写,是用于从万维网(WWW:World Wide Web )
服务器传输超文本
到本地浏览器
的传送协议。HTTP
是一个基于TCP/IP
通信协议来传递数据(HTML,图片等文件,以及查询结果等)。
主要特点如下:
简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST
。每种方法规定了客户与服务器联系的类型不同。由于HTTP
协议简单,使得HTTP
服务器的程序规模小,因而通信速度很快。
灵活:HTTP
允许传输多种类型的数据对象。正在传输的类型由Content-Type
加以标记。
无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并应答后,即断开连接。采用这种方式可以节省传输时间。
无状态:HTTP
协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
支持B/S
及C/S
模式
请求协议信息由 4 部分组成:请求行、请求头、空行、请求体
响应协议信息也由 4 部分组成:状态行、响应头、空行、响应体
使用curl
命令查看协议详情:
HTTP
状态码由三个十进制数字组成,第一个数字定义了状态码的类型。HTTP 状态码共有 5 种类型:1xx, 2xx, 3xx, 4xx, 5xx。类型解释以及部分常见状态码如下:
1XX (Informational)
: 接收的请求正在处理
100 Continue
:表明请求到目前为止都处理的很正常,客户端可以继续发送请求或者忽略这个响应。
2XX (Success)
: 请求正常处理完毕
200 OK
: 表示成功处理了请求。
3XX (Redirection)
: 需要进行附加操作以完成请求301 Moved Permanently
:永久性重定向。
302 Found
:临时性重定向。
4XX (Client Error)
: 服务器无法处理请求403 Forbidden
:请求被服务器拒绝。
404 Not Found
: 服务器找不到请求的网页。
5XX (Server Error)
: 服务器处理请求出错500 Internal Server Error
:服务器正在执行请求时发生错误。
301
和302
状态码都表示重定向,就是说浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的URL
地址,这个地址可以从响应头部字段Location
中获取(用户看到的效果就是他输入的地址A
瞬间变成了另一个地址B
)
**301: 表示永久重定向。**该状态码表示请求的资源已被分配了新的 URI
,以后应使用资源现在所指的 URI
。也就是说,如果已经把资源对应的 URI保存为书签了,这时浏览器会按 Location
字段提示的 URI
重新保存。
**302: 表示临时重定向。**该状态码表示请求的资源已被分配了新的 URI
,希望用户(本次)能使用新的 URI
访问。和 301
状态码相似,但 302
状态码代表的资源不是被永久移动,只是临时性质的。换句话说,已移动的资源对应的URI 将来还有可能发生改变。比如,用户把 URI 保存成书签,但不会像 301
状态码出现时那样去更新书签,而是仍旧保留返回 302
状态码的页面对应的 URI
。
Forward:客户端发出的请求被服务器内部进行转发,浏览器地址栏依然是之前的URL
。就如 SpringMVC
中,所有的请求都由 DispatcherServlet
处理后再在服务器内部进行派发。
Redirect:实际是两次HTTP
请求,服务器端在响应第一次请求的时候,让浏览器再向另外一个URL
发出请求,从而达到转发的目的。
HTTP/1.0
定义了三种请求方法:GET
, POST
和 HEAD
方法。
方法 | 描述 |
---|---|
GET | 最常用的方法之一,用于请求服务器响应某个资源,不应当对系统资源进行改变。 |
POST | 最常用的方法之一,用于将数据(表单等)提交至服务器以创建新的资源。 |
HEAD | HEAD 方法与 GET 方法的行为很类似,但服务器在响应中只返回首部,这就允许客户端在未获取实际资源的情况下,根据首部信息对资源进行检查。 |
HTTP/1.1
新增了:PUT
、PATCH
、DELETE
、CONNECT
、OPTIONS
、TRACE
共5种HTTP
请求方法。
方法 | 描述 |
---|---|
PUT | 用于将数据提交至服务器以更新之前存在的资源。 |
PATCH | 是对 PUT 方法的补充,用来对已知资源进行局部更新;当资源不存在时,PATCH会创建一个新的资源。 |
DELETE | 请求服务器删除指定的资源。 |
CONNECT | HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。 |
OPTIONS | 请求服务器告知其支持的各种功能。 |
TRACE | 请求服务器回显其收到的请求,主要用于测试或诊断。 |
备注:HTTP
规范定义了以上方法的行为,但实际开发中可以不遵守。例如:在GET
请求对应的接口中去更新资源,将会给自己带来麻烦。
在编程领域,对于同一个系统,在同样条件下,一次请求和重复多次请求对服端资源的影响是一致的,就称该操作为幂等的。
HTTP常见幂等方法:GET
、PUT
、DELETE
、
HTTP常见非幂等方法:POST
、PATCH
解释:
PUT:第一次和第N次请求对服务端资源的影响是相同的,所以是幂等的。例如将id
为1234
的账户金额改为1000
,多次调用对系统资源产生的影响是一致的。
DELETE:第一次和第N次请求对服务端资源的影响是相同的,所以是幂等的。假如存在一个删除 id
为 1234
的账户的接口,第一次请求时会删除,而后面所有请求的时候由于系统中已经没有该资源了,所以第一次和后面的请求对服务端资源的影响( id
为 1234
的资源不再存在)是相同的。
PATCH: URI
对应的资源不存在时服务端可以创建一个新资源,因此两次请求对服务端资源的影响可能会不同。并且服务端可以根据请求参数,动态的计算出某个值,例如每次请求后资源的某个参数减1,所以多次调用,资源会有不同的变化。综上,PATCH
方法是非幂等的。
更多:聊聊开发中幂等性问题
REST
是一种架构风格,即Representational State Transfer
的缩写,译为"表现层状态转化"。REST
的原则不仅仅适用于HTTP
协议,但由于REST
的应用场景绝大部分是WEB
应用,故以下讨论都基于HTTP
。
资源是网络上的一个实体,或者说是网络上的一个具体信息,一个资源可以被URI唯一标识。因此,表现层可以理解为资源的一种具体表现,如:文本文件、html文件等等。状态转化指客户端和服务端的交互过程中通过HTTP
协议提供的4个动作(GET用来获取资源,POST用来新建资源,PUT用来更新资源,DELETE用来删除资源。)对服务器资源进行操作,从而实现"表现层状态转化"。
备注:而RESTful API
就是符合REST
风格的API
GET
一般用来从服务器上获取资源,POST
一般用来在服务器上新增资源;REST
服务角度上说,GET
是幂等的,而 POST
不是幂等的;GET
请求的数据会附在 URL
之后,POST
请求会把提交的数据放置在是 HTTP
请求报文的请求体中;POST
的安全性要比 GET
的安全性高,因为 GET 请求提交的数据将明文出现在 URL
上,而且 POST
请求参数则被包装到请求体中,相对更安全;GET
请求的长度受限于浏览器或服务器对 URL
长度的限制,允许发送的数据量比较小,而 POST
请求理论上是没有大小限制。当传输的是静态文件时,服务端能够很清楚的知道将要响应内容的大小,可以通过响应头中的Content-Length
域来告诉客户端报文的长度。如果服务端预先不知道将要响应内容的大小(动态生成的页面)就需要在响应头中指明 Transfer-Encoding: chunked
。表示响应体是使用chunked
分块方式拼接成的,不需要Content-Length
指明长度。每一个分块包含十六进制的长度值和数据,最后一个分块长度值为0,表示实体结束,客户端可以以此为标志确认数据已经接收完毕。(这些是HTTP1.1
的内容,Content-Length
字段不是必需的,因为浏览器发现服务器关闭了TCP
连接,就表明收到的数据包已经全了)。
可以通过请求头或响应头中的Connection
域查看是否是Keep-Alive
。
短连接:在HTTP/1.0
中默认使用短连接(也支持长连接,得手动设置Connection: keep-alive
)。客户端每个HTTP
请求和响应都会开启和关闭一个单独的TCP
连接。
长连接: 而从HTTP/1.1
起,默认使用长连接。同一个客户端和服务端之间的连续的多个HTTP
请求和响应可以通过一个TCP
连接来完成。但是一个长连接也不是一直保持,客户端在最后一个请求时,发送Connection: close
,明确要求服务器关闭TCP连接,也可以通过 keep-alive timeout
参数来设置。
HTTP1.1变化:
长连接:HTTP1.0
默认是短连接,HTTP1.1
默认支持长连接,且引入了流水线技术(pipelining
)。不仅多个请求可以复用同一个TCP
连接,并且同一个TCP
连接里面,客户端可以同时发送多个请求。这样就进一步改进了HTTP协议的效率。(流水线方式会存在"队头阻塞":如果第一个请求被阻塞,即使后到的请求已经处理完毕,响应时依然要按请求的顺序依次响应)。
宽带和网络连接优化:HTTP1.0
会存在一些性能浪费,每次请求都返回整个对象,即使只需要对象的一部分。HTTP1.1
则可以通过设置range
头域,仅请求返回资源的某一部分,也就是返回码为206(Partial Content)
的时候,这对于性能优化很有必要。
引入Host头域:HTTP1.1
添加了Host
头域,请求头如果没指定Host
,则返回404
。在HTTP1.0
中认为每个IP
地址都只属于一台服务器,因此,请求消息中的URL
并没有传递主机名。但随着虚拟主机技术的发展,在一台物理主机上可以存在多个虚拟主机,并且它们共享一个IP
地址,仅靠IP
地址无法区分请求的是哪个虚拟主机,故HTTP1.1
加上了Host
头域来区分。
更多:HTTP中的Host字段
HTTP2 的变化:
二进制:HTTP1.X
(头信息肯定是文本(ASCII
编码),数据体可以是文本,也可以是二进制)的协议解析是基于文本格式,而HTTP2
(头信息和数据体都是二进制,并且统称为"帧"(frame
):头信息帧和数据帧)的协议解析是二进制格式,解析更加高效。
多路复用(Mutiplexing) : 可以复用TCP
连接,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,而且不用按照顺序一一对应,这样就避免了"队头堵塞"
header压缩: HTTP1.X
协议不带有状态,每次请求都必须附上所有信息。所以,请求的很多字段都是重复的,比如Cookie
和User Agent
,一模一样的内容,每次请求都必须附带,这会浪费很多带宽,也影响速度。HTTP2
对这一点做了优化,引入了头信息压缩机制(header compression
)。一方面,头信息使用gzip
或compress
压缩后再发送;另一方面,客户端和服务器同时维护一张“首部表”来跟踪和存储之前发送的头域(键-值对),对于不变的域,不再通过每次请求和响应发送;通信期间几乎不会改变的通用域键(User Agent、Accept
等等) 只需发送一次。
服务端推送(server push): 允许服务器未经请求,主动向客户端发送资源,这叫做服务器推送。常见场景是客户端请求一个网页,这个网页里面包含很多静态资源。正常情况下,客户端必须收到网页后,解析HTML源码,发现有静态资源,再发出静态资源请求。其实,服务器可以预测到客户端请求网页后,很可能会再请求静态资源,所以就主动把这些静态资源随着网页一起发给客户端了。
更多:一篇文章读懂 HTTP1.0 HTTP1.1 HTTP2.0 HTTPS
端口:HTTP协议端口为80
,HTTPS协议端口为443
;
安全性:HTTP
信息是明文传输;而HTTPS
协议的信息是经过SSL/TLS
协议加密后传输的。( TLS
(Transport Layer Security
,传输层安全协议) 是 SSL
(Secure Socket Layer
,安全套接字层)的升级版)。
数字证书:HTTPS
协议需要到CA (Certificate Authority)
机构申请数字证书,绝大多数需要花钱申请。
响应速度和资源消耗:HTTPS
相比 HTTP
在 TCP
之上多了SSL/TLS
协议,因此响应速度会更慢,资源消耗会更多。
前置:SSL/TLS中使用了非对称加密,对称加密以及HASH算法。
对称加密:加解密秘钥一样,优点是加解密速度快,适合对大量数据加密;缺点是使用前需要传输给另一个使用方,容易泄露。
非对称加密:分为私钥和公钥,私钥自己保存无需发送,公钥则是公开的,公钥加密的信息只有私钥能解密(反之亦然)。非对称加密加解密速度慢,只适合少量数据加密。
完整性校验算法(hash算法):同一数据计算结果相同,一旦数据被修改结果就会改变。通常用来检查数据是否被篡改。
个HTTPS
请求实际上包含了两次HTTP
传输,可以细分为 4 步:
HTTPS
请求,连接到服务器的443
端口。CA
申请的数字证书发送给客户端。数字证书包含了公钥、签名等信息。KEY
,并使用公钥将其加密。随后客户端把加密后的随机码 KEY
发送给服务器,作为后面对称加密的密钥。KEY
,到此客户端和服务器就已经成功建立了安全连接。接下来就可以用对称加密进行通信了。HTTP Cookie
(也叫 Web Cookie
或浏览器 Cookie
)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。通常可以用于个性化设置,浏览器行为跟踪。
由于HTTP
协议是无状态的协议,所以服务器需要记录用户状态时就需要借助Session
机制。目前Session
常见实现要借助Cookie
,即服务器端创建一个Session
对象,同时会创建一个特殊的Cookie
对象(name
为"JSESSIONID
",value
为Session
对象的ID
),然后将该Cookie
对象发送至浏览器。当浏览器端发送第N(N>1)
次请求到同一服务器时就会携带该name
为JSESSIONID
的Cookie
对象。服务器根据Cookie
的value(sessionId)
去查询对应Session
对象,从而区分不同用户。(Session
对象默认存活30
分钟)
Cookie
保存在客户端(浏览器),Session
保存在服务器端。Cookie
只能保存 ASCII
编码的字符,Session
可以存任意数据类型,一般情况下我们可以在 Session
中保持一些常用变量信息,比如说 商品ID
,商品数量
(购物车场景)等。Cookie
可设置为长时间保持,比如我们经常使用的默认登录功能,Session
一般失效时间较短,客户端关闭或者 Session
超时都会失效(Session
对象默认存活30
分钟)。Cookie
存储在客户端,比较容易遭到不法获取,早期有人将用户的登录名和密码 存储在 Cookie
中导致信息被窃取;Session
存储在服务端,安全性相对 Cookie
要好一些。Cookie
保存的数据量 <= 4KB
;对于Session
来说并没有上限,但出于对服务器端的性能考虑,Session
内不要存放过多的东西,并且应设置Session
删除机制。URL
地址到显示主页的过程?URL
进行域名解析,得到对应IP
地址。解析时,首先查看浏览器DNS缓存
是否命中,没有的话再查看操作系统DNS缓存
(hosts
文件)是否命中,如果再没有命中就会借助域名服务器进行解析。HTTP
请求报文后交给传输层的TCP
协议。TCP
协议根据IP地址向服务器的80
端口发起三次握手以建立TCP
连接,随后将HTTP
报文作为自己的数据部分封装到TCP
报文段中发送出去。TCP
协议收到TCP
报文段后进行拆包得到HTTP
请求报文,HTTP
请求报文随后被应用层的服务器程序读取、解析和处理后,按照之前类似步骤响应数据给浏览器。HTTP
响应报文后进行解析,渲染并显示给用户。TCP/IP
只有最上面三层,最下面一 层没有什么具体内容,TCP/IP
参考模型没有真正描述这一层的实现。三种模型以及对应层次关系如下:
OSI
七层网络体系结构各层的主要功能:
应用层:为应用程序提供交互服务。在互联网中的应用层协议很多,如域名系统DNS
,支持万维网 应用的HTTP
协议,支持电子邮件的SMTP
协议等。
表示层:主要负责数据格式的转换,如加密解密、转换翻译、压缩解压缩等。
会话层:负责在网络中的两节点之间建立、维持和终止通信,如服务器验证用户登录便是由会话层 完成的。
运输层:有时也译为传输层,向主机进程提供通用的数据传输服务。该层主要有以下两种协议:
TCP
:提供面向连接的、可靠的数据传输服务;
UDP
:提供无连接的、尽最大努力的数据传输服务,但不保证数据传输的可靠性。
网络层:选择合适的路由和交换结点,确保数据及时传送。主要包括IP
协议。
数据链路层:数据链路层通常简称为链路层。将网络层传下来的IP
数据包组装成帧,并再相邻节点 的链路上传送帧。
物理层 :实现相邻节点间比特流的透明传输,尽可能屏蔽传输介质和通信手段的差异。
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/28 20:15:19- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |