计算机网络
参考书籍 《图解HTTP》、《图解TCP/IP》、《计算机网络自顶向下》
OSI (网络模型)
五层模型 | 作用 | 主要协议 | 传输内容 |
---|---|---|---|
应用层(表示层,会话层) | HTTP ,FTP ,DNS Telnet,SSH | 报文 | |
传输层 | TCP,UDP | 报文段 | |
网络层 | ARP,IP,ICMP | ||
数据链路层 | PPP,PPTP | 帧 | |
物理层 | 比特流 |
应用层
- url 从点击到出现发生了什么
dns解析,寻找域名对应的ip地址
生成http请求(http请求的格式,GET方法,参数保存在url上)
tcp 会建立连接,然后进行传输
tcp 将http请求报文分割成多个报文段,把每个报文段可靠的传输给对方
ip 协议会搜索对方地址,进行中转和传输
tcp 接收到报文段,重组达为请求报文
服务器接收到 完整的http请求然后进行解析,找到对应文件(一般都是server服务器加载对应语言的cgi对动态代码进行解析,解析完成,生成完整页面后)
服务端生成http响应(响应的格式协议,版本,状态码,信息)
再通过网络的逐层封装和逐层解析到达浏览器,浏览器拿到页面进行渲染
-
利用 tcp/IP 协议族通信时会发生什么
从发送端到接收端HTTP逐层封装增加首部
应用层HTTP
数据,传输侧增加TCP首部,网络层增加IP首部,链路层增加以太网首部,然后在另一端逐层解析 -
ARP,地址解析协议:通过ip解析出MAC地址
在达到通信目标的过程中,会发生多次路由中转 -
DNS,通过域名查找ip地址,通过ip地址解析域名
-
uri(统一资源标识符) 和 url(统一资源定位符)
uri 用字符串标识某一互联网资源。url标识资源的地点,所以平时点击的网址指的是url
HTTP
- HTTP 有请求和响应组成
HTTP 报文
-
报文结构:
报文首部:包含 请求行(包含请求的方法,请求的URI 和 HTTP版本)/状态行(响应叫状态行,响应结果的状态码和HTTP 版本) 和 多个首部字段(包含属性和条件)),
空行,
报文主体(实体):包含实体头部()和实体主体(原始数据) -
http 请求报文
http 请求报文的组成 方法 URI 协议版本 请求首部字段 和内容实体
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fRFiNv0b-1591670613784)(en-resource://database/644:1)] -
http 响应报文
http 响应报文的组成 协议版本,状态码,状态码的原因短语,响应首部字段 和 主体2
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ludw5ZgD-1591670613788)(en-resource://database/646:1)] -
http 方法
- GET 方法:用于使用给定的URI从服务器中检索信息,从指定资源获取数据。格式:略
GET请求是不安全的,因为资源在URI中,可以被看到,而且URI有长度限制,GET请求可以被缓存 - POST 方法:将数据放到服务器以创建或更新资源,
- PUT: 传输文件。pyt 本身不具备验证机制,所以需要web网站来进行验证
- HEAD:获取报文首部,却URI的有效性
- DELETE:删除文件,删除指定资源
- OPTIONS:询问请求URI制定资源支持的方法
- TRACE: 追踪路径。
- CONNECT:使用隧道协议链接代理。此方法要求代理服务器建立隧道进行TCP通信,隧道传输主要是用SSL和TLS将通信内容加密传输
-
编码传输
在实际中,通过编码来提升传输的速率。有两种编码方式:压缩传输的内容和分块传输。 -
http的短连接和长连接
短连接:每进行一次http请求/响应,就要建立和断开 连接(tcp)
长连接:进行一次tcp连接,可以完成多个http请求/响应。同时,管线化可以同时发送多个请求,而不需要得到响应 -
http1.0 1.1 2.0 区别
HTTPS
http 缺点,使用明文,不验证通信方身份,无法证明报文完整性
SSL或 TLS 将整个通信线路加密 处理
https 的工作流程
HTTP 首部
- 首部分为四种类型 通用,请求,响应,实体首部字段
- 常见首部
- 通用首部字段:
Cache-Control 控制缓存的行为
Connection 逐跳首部、连接的管理
Date 创建报文的日期时间 - 实体首部字段:
Content-Type : 表示报文主体的对象类型。(text/html,application/json,application/octet-stream)后面还有编码 charset = “”
Content-Length:实体主体部分的大小
Keep-Alive: timeout=15, max=100 - 请求首部字段
User-Agent:请求首部字段,描述HTTP客户端程序的信息
From 用户的电子邮箱地址
Host 请求资源所在服务器
If-Match 比较实体标记(ETag) If-Modified-Since 比较资源的更新时间 - 响应首部字段
Server HTTP服务器的安装信息(web服务器信息,阿帕奇。。)
Location 令客户端重定向至指定URI
HTTP 状态码
php的header头操作,重定向代码
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wUh7oM9Y-1591670613792)(en-resource://database/650:1)]
- 2XX 200 OK 成功返回 204 Not Content 请求处理成功,但没有需要返回的资源
- 3XX 301 永久重定向 302 临时重定向 304 自愿找到,但请求条件不符合
重定向就是指访问A网站,但是跳转到B。可以从 Location首部中获取 新的地址。重定向的实现可以在业务层面拼接需要的地址,和想要的状态码(301或302)
当 301、302、303 响应状态码返回时,浏览器都会把 POST 改成 GET,并删除请求报文内的主体,之后请求会自动再次发送。 - 4XX 响应结果表明客户端发生生错误。
400 客户端请求报文中存在语法错误。 401 表示请求需要有HTTP认证信息。403 请求资源被拒绝。 404 请求资源未找到 - 5XX 表明服务器端发生错误
500 服务器执行错误 502 网关错误 503 服务器忙
cookie
因为http协议的设计时无状态的,即它本身不保存状态,所以引入了cookie技术。
cookie 保存在请求和响应报文段的 首部字段中 Set-Cookie
cookie生成原理,客户端发送请求;服务端响应时 响应头中 set-cookie字段含有 sid;客户端
HTTP 和WebSCOKET
- webscoket
浏览器和服务器只需要要做一个握手的动作(即简历啊连接,依然是TCP的握手阶段),在建立连接之后,双方可以在任意时刻,相互推送信息。同时,服务器与客户端之间交换的头信息很小
1,多路复用,全双工(服务端和客户端任意时刻互相推送消息),服务器可以主动向客户端推送消息
2,header头部较小,传输信息更快更多
3,没有同源限制 - 各使用场景
(当用户量很大时,长连接比较消耗资源;长连接可以维持用户在线状态)
Socket适用场景:网络游戏,银行交互,支付。
http适用场景:公司OA服务,互联网服务。
传输层
TCP
- tcp的结构
TCP 三次握手和状态机
TCP 如何实现可靠传输
超时重传和回复确认
TCP 四次挥手和状态机,为什么四次
-
为什么TIME_WAIT状态还需要等2MSL后才能返回到CLOSED状态?
这是因为虽然双方都同意关闭连接了,而且握手的4个报文也都协调和发送完毕,按理可以直接回到CLOSED状态(就好比从SYN_SEND状态到ESTABLISH状态那样);但是因为我们必须要假想网络是不可靠的,你无法保证你最后发送的ACK报文会一定被对方收到,因此对方处于LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT状态的作用就是用来重发可能丢失的ACK报文。 -
TCP
UDP
+udp 的结构
TCP 和 UDP的区别
有无状态
是否可靠(建立连接的)
- 使用场景
网络层
IP 协议
浏览器
浏览器
-
如何实现跨域请求
原因:浏览器存在同源策略(同源指,同一个域名,协议,端口),包括DOM同源和XMLHttpRequest同源策略。不同源的客户端脚本不能读写对方的资源。
不受同源限制的内容:页面的连接,重定向和表单的提交,跨域资源的引入(<script src="…>)
实现跨域请求:1,jsonp。主要就是通过jsonp callback 回调函数<script> $("#b1").click(function () { $.ajax({ url: "http://127.0.0.1:8002/abc/", dataType: "jsonp", jsonp: "callback", jsonpCallback: "rion2" }) }); </script>
<?php $data = array( 'name' => 'zdx', 'sex' => 'man', 'age' => 18 ); $callback = $_GET['callback'];//获取回调函数名 echo $callback . '(' . json_encode($data) . ')'; ?>//拼接函数名和后台传递的变量名作为参数
2,CORF。后端返回时,在响应头加上 response[‘Access-Control-Allow-Origin’] = ’ * ’
<?php header('Access-Control-Allow-Origin:http://127.0.0.1'); //设置header头 echo "我是CORS跨域过来的!"; ?>
-
浏览器强缓存
-
webscoket 重连失败怎么办,webscoket 和 http 区别,优劣
安全
加密
- 对称加密非对称加密
攻击
- xss(跨站脚本攻击)
嵌入uri中的js标签想目标网站发送此页面信息,窃取cookie或页面内容
表单中填入html或js标签 - sql注入
url 上禅悦权限的查询
表单提交中 损害数据库的sql
header头注入,伪造cookie - dos
开发
-
多服务器 session 共享
-
编码区别
ASC编码 使用 0- 127的二进制形式表示 英文字母、数字、特殊字符,长度都是一个字节(8 bit)
UTF-8 中字符是可变长度的,字符编码通常由 1-4 个字节来表示,英文字母为1个字节,汉字为3个字节(BOM全名是字节顺序标记(Byte-Order-Mark),它存储在文件的开头,用来表示文件的字节顺序是大端还是小端,BOM通常是一个 U+FEFF 字符)
GBK 中国编码,固定每个字符长度为 两个字节,英文字母与汉字以最高位区分。
引申的问题有,4kb可以传输(表示)多少个子母,多少个汉字。这当然和编码有关了,使用不同的编码决定了能传递多少信息
web服务器
代理 网关 隧道
- 代理 分为缓存代理(预先将资源副本保存在代理服务器)和透明代理,将用户请求的信息送至目标服务器
- 网关 可以将HTTP请求转换为其他协议通信
- 隧道 建立与服务器的远程安全通信
缓存
- 浏览器缓存(强制缓存和协商缓存)
强缓存 浏览器会对缓存进行查找,并根据一定的规则确定是否使用缓存
HTTP/1.1 的cache-Control 属性决定
协商缓存:
浏览器的强制缓存失效后(时间过期),浏览器携带缓存标识请求服务器,由服务器决定是否使用缓存
控制协商缓存的字段有Last-Modified / If-Modified-Since 和 Etag / If-None-Match。
①Last-Modified是服务器返回给浏览器的本资源的最后修改时间。
当下次再次请求的时候,浏览器会在请求头中带If-Modified-Since,即上次请求下来的Last-Modified的值,然后服务器会用这个值和该资源最后修改的时间比较,如果最后修改时间大于这个值,则会重新请求该资源,返回状态码200。如果这个值和最后修改时间相等,则会返回304,告诉浏览器继续使用缓存。
②Etag是服务器返回的一个hash值。当下次再次请求的时候,浏览器会在请求头中带If-None-Match,即上次请求下来的Etag值,然后服务器会用这个值和该资源在服务器的Etag值比较,如果一致则会返回304,继续使用缓存;如果不一致,则会重新请求,返回200
- 服务器缓存
所以,web服务器(n,a)可以设置是否缓存
通过配置
location ~.*\.(js|css|html|png|jpg)$ {
expires 3d; //设置缓存过期时间 (h 时 d 天 -1表示永久)
add_header Cache-Control no-store; // 为响应头添加header头,且参数设置为不缓存
add_header Pragma no-cache;
}
CGI
cgi 是指Web服务器在接收到客户端发过来的请求时转发给程序的机制