网络模型
七层网络模型
- 物理层:利用传输介质为数据链路层提供物理连接,实现比特流的透明传输。
- 数据链路层
- 网络层 IP
- 传输层 TCP、UDP
- 会话层
- 表示层 对底层命令和数据进行解释
- 应用层 应用层协议:DNS、HTTP、SMTP等,用户在这一层与网络进行交互
TCP/IP四层
- 网络接口层
- 网际层 IP
- 运输层 TCP、UDP
- 应用层 HTTP、SMTP、FTP等
五层协议
- 物理层 实现相邻计算机之间比特流的透明传递
- 数据链路层 将IP数据报组装成帧,控制信息在相邻两节点的链路上进行传输
- 网络层 IP,为不同主机分组交换信息服务
- 运输层 TCP、UDP,为两台主机之间的通信提供通用的数据传输服务
- 应用层 HTTP、SMTP、FTP等
HTTP
HTTP和HTTPS的区别
- https需要到ca申请证书,因而需要一定费用
- http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议,成本较高
- http的连接很简单,是无状态的,https协议是由ssl+http协议构建的可进行加密串苏,身份验证的网络协议
- http用的端口是80,https用的端口是443
HTTP请求报文的内容
- 请求行包括请求方法(GET、POST…),URL,HTTP协议版本
- 请求头。格式为,头部字段:值。
- 请求正文
HTTP头部有哪些主要字段
-
Host:接受请求的服务器地址,可以是IP或者是域名
-
User-Agent:发送请求的应用名称
-
Connection:指定与连接相关的属性,例如(Keep_Alive,长连接)
-
Accept-Charset:通知服务器端可以发送的编码格式
-
Accept-Encoding:通知服务器端可以发送的数据压缩格式
-
Accept-Language:通知服务器端可以发送的语言
HTTP响应报文
- 状态行:协议版本,状态码,状态码描述
- 响应头
- 响应正文
HTTP响应头主要字段
- Server:服务器应用软件的名称和版本
- Content-Type:响应正文的类型
- Content-Length:响应正文的长度
- Content-Charset:响应正文所使用的编码
- Content-Encoding:响应正文使用的数据压缩格式
- Content-Language:响应正文使用的语言
HTTP状态码
1xx 服务器收到请求,需要请求者继续执行操作
2xx ok,请求成功
3xx 重定向,资源已经重新分配
4xx 客户端请求错误,403 forbidden请求资源被拒绝,404 not found找不到请求资源
5xx 服务器错误,500 服务器故障,503 服务器超载或停机维护
200,请求成功
「301 Moved Permanently」表示永久重定向,说明请求的资源已经不存在了,需改用新的 URL 再次访问。
「302 Found」表示临时重定向,说明请求的资源还在,但暂时需要用另一个 URL 来访问。
301 和 302 都会在响应头里使用字段 Location,指明后续要跳转的 URL,浏览器会自动重定向新的 URL。
「304 Not Modified」不具有跳转的含义,表示资源未修改,重定向已存在的缓冲文件,也称缓存重定向,也就是告诉客户端可以继续使用缓存资源,用于缓存控制。
「400 Bad Request」表示客户端请求的报文有错误,但只是个笼统的错误。
「403 Forbidden」表示服务器禁止访问资源,并不是客户端的请求出错。
「404 Not Found」表示请求的资源在服务器上不存在或未找到,所以无法提供给客户端。
「500 Internal Server Error」与 400 类型,是个笼统通用的错误码,服务器发生了什么错误,我们并不知道。
「501 Not Implemented」表示客户端请求的功能还不支持,类似“即将开业,敬请期待”的意思。
「502 Bad Gateway」通常是服务器作为网关或代理时返回的错误码,表示服务器自身工作正常,访问后端服务器发生了错误。
「503 Service Unavailable」表示服务器当前很忙,暂时无法响应客户端,类似“网络服务正忙,请稍后重试”的意思。
HTTP劫持
在正常的数据流中插入特定的网络数据报文,让客户端解释错误的数据,并以弹出新窗口的形式向使用者展示小广告或网页内容
步骤:
在TCP连接中标识HTTP协议链接;
改HTTP响应体;
将篡改后的数据包抢先回发到用户,这样后面的数据包在到达后会被直接丢弃。而客户端显示改后的网页
防范:
事前加密:HTTPS,防止明文传输被挟持,(但防不了DNS挟持)
事中加密:拆分HTTP请求数据包,运营商的旁路设备没有完整的TCP/IP协议栈,不能标记,web服务器有完整的TCP/IP协议栈,能把接收到的数据包拼成完整的HTTP请求,不影响服务
事后屏蔽:前端显示HTTP时对内容进行检测,在DOM结构发生变化时触发回调
DNS劫持:通过劫持DNS服务器,获得某域名的解析记录控制权,修改此域名的解析结果。把原来对A域名的访问转入B域名,返回错误的查询结果。可能是一些产品的持续的推广
区别:DNS劫持倾向于持续性,访问一个界面时强行推送广告,HTTP劫持频率多变,劫持过程也非常快,一般多出现于网站小尾巴
HTTPS挟持:伪造证书来进行挟持….
跨域
跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器施加的安全限制。
同源:域名,协议,端口均相同
即浏览器只能执行相同协议、相同域名、相同端口下的网站脚本,执行的时候如果网站的脚本不属于现在这个界面,就不会执行
HTTP请求响应中断原因
网断了,网络阻塞,请求超时,浏览器出问题,服务器出问题
如何检查
检查网络,检查本地…
HTTP有几种请求方式
HTTP1.0 定义了三种请求方法: GET, POST 和HEAD方法。
HTTP1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和CONNECT 方法。
GET和POST的区别
GET的参数放在url中,返回服务器拿数据;POST在request body里自带一个参数去服务器拿指定的数据;
因为GET的参数暴露在url上,所以安全性不能保证,也有长度的限制
应用场景
GET用来查询数据,POST用来修改数据,以及其他更需要安全性的场景如密码
cookie和session
什么是Cookie?
Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端会把Cookie保存起来。
当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。
什么是Session?
Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。
Session和Cookie的区别?
1、数据存储位置:cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、安全性:cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。
3、服务器性能:session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。
4、数据大小:单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
5、信息重要程度:可以考虑将登陆信息等重要信息存放为session,其他信息如果需要保留,可以放在cookie中。
DNS的查找过程(应用层)
用于将用户提供的主机名解析为ip地址
- 浏览器从接收到的url中抽取出域名地址,将域名传给DNS应用的客户端
- 检查浏览器缓存、本地hosts文件是否有这个网址的映射,如果有,就调用这个IP地址映射
- 如果没有,则查找本地DNS解析器缓存是否有这个网址的映射,如果有,返回映射
- 如果没有,则向DNS服务器提出查询请求
- 服务器接收到查询时,查询本地配置区域资源,查到就返回结果
- 如果查不到,但服务器缓存了此网址映射关系,返回查找结果
- 如果没有缓存,就继续间请求转发至上一级DNS服务器进行查询。最终将解析结果依次返回本地DNS服务器,本地DNS服务器在返回给客户端,并把这个映射存到服务器的缓存中
长链接&短链接
- 在HTTP/1.0中,默认使用的是短连接。也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。如果客户端浏览器访问的某个HTML或其他类型的
Web页中包含有其他的Web资源,如JavaScript文件、图像文件、CSS文件等;当浏览器每遇到这样一个Web资源,就会建立一个HTTP会话。 - 但从HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头有加入这行代码:Connection:keep-alive
- 在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的
TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接要客户端和服务端都支持长连接。
搜索敏感词汇时,页面被重置的原理
根据TCP协议的规定,用户和服务器建立连接需要三次握手:第一次握手用户向服务器发送SYN数据包发出请求(SYN, x:0),第二次握手服务器向用户发送SYN/ACK数据包发出回应(SYN/ACK, y:x+1),第三次握手用户向服务器发送ACK数据包发出确认(ACK, x+1:y+1),至此一个TCP连接建立成功。其中x为用户向服务器发送的序列号,y为服务器向用户发送的序列号。
关键字检测,针对明文或者base64等弱加密通讯内容,与准备好的敏感词库进行匹配,当发现敏感词时,将服务器发回的SYN/ACK包改成SYN/ACK, Y:0,这代表TCP连接被重置,用户便主动放弃了连接,提示连接失败。让用户误认为服务器拒绝连接,而主动放弃继续与服务器连接,自动阻断记录含有敏感词的网页
IP
IP地址分类
A类:1字节(8位)网络号,3字节(24位)主机号。网络号第一位固定为0,剩下7位随便用。保留地址0(00000000)表示“本文网络”,127(01111111)表示本地环回软件测试
B类:2字节(16位)网络号,2字节(16位)主机号。网络号前两位固定为10,剩下16位随便用。保留地址
C类:3字节(24位)网络号,1字节(8位)主机号。前三位固定为110,剩下21位可用。
D类:
E类:
主机号全是0的IP地址表示是“本主机”所连接到的单个网络。
主机号全是1的IP地址表示是该网络上的所有主机。
A类地址的表示范围是:0.0.0.0-126.255.255.255,默认网络掩码为:255.0.0.0,A类地址分配给规模特别大的网络使用,
B类地址表示范围是:128.0.0.0-191.255.255.255,默认网络掩码为:255.255.0.0,B类地址分配给一般的中型网络
C类地址的表示范围是192.0.0.0-223.255.255.255,默认网络掩码是:255.255.255.0,C类地址分配给小型网络,如局域网
D类地址称为广播地址,共特殊协议向选定的节点发送信息使用。
ipv4和ipv6的转换。ipv4到ipv6的过渡手段
ipv4和ipv6的过渡是一个循序渐进的过程,在用户体验IPv6带来的好处的同时仍能与网络中其余的IPv4用户通信。
主流技术:
- 双栈策略:(最直接方式)在IPv6结点中加入IPv4协议栈。这种具有双协议栈的结点称作“IPv6/v4结点”,这些结点可以使用IPv4与IPv4结点互通,也可以直接使用IPv6与IPv6结点互通。
- 隧道技术:(为解决局部纯IPv6网络与IPv4骨干隔离形成的孤岛问题,用隧道技术的方式解决)利用穿越现存IPv4互联网的隧道技术将孤岛连接起来,逐步扩大IPv6的实现范围。在隧道的入口处,路由器将IPv6的数组分组封装进入IPv4中,IPV4分组的源地址和目的地址分别是隧道入口和出口的IPV4地址。在隧道的出口处再将IPV6分组取出转发给目的节点。
隧道技术在实践中有四种具体形式:构造隧道、自动配置隧道、组播隧道以及6to4。 - 隧道代理TB,Tunnel Broker。(目的是简化隧道的配置,提供自动的配置手段),TB可以看作是一个虚拟的IPv6 ISP,它为已经连接到IPv4网络上的用户提供连接到IPv6网络的手段,而连接到IPv4网络上的用户就是TB的客户。
- 协议转换技术。其主要思想是在V6节点与V4节点的通信时需借助于中间的协议转换服务器,此协议转换服务器的主要功能是把网络层协议头进行V6/V4间的转换,以适应对端的协议类型。
- SOCKS64。
在客户端里引入SOCKS库,它处于应用层和socket之间,对应用层的socket API和DNS域名解析API进行替换。
另一种是SOCKS网关。
- 传输层中继
与SOCKS64的工作机理相似,只不过是在传输层中继器进行传输层的“协议翻译”
- 应用层代理网关(ALG)
类似。在应用层进行协议翻译。
ARP协议
Address Resolution Protocol,即地址解析协议, 用于实现从 IP 地址到 MAC 地址的映射,即询问目标IP对应的MAC地址
-
查主机缓存里(的ARP列表里)有没有记录这个IP和MAC地址的对应
-
有就直接发送,没有就向本网段所有主机发送广播,发送自己的IP地址和MAC地址,询问谁是这个IP地址,这个地址的MAC地址是什么
-
网络中的其他主机收到之后对照被询问的地址和自己能不能对上,是的话就从数据包中提取源主机的IP和mac地址写入自己的ARP列表,并将自己的MAC地址写入响应包,回复源主机
-
源主机收到ARP响应包之后,就可以用这些信息发送数据
为什么要用ARP协议:OSI把网络分成7层,每层之间不直接交流,只有特定接口有交流。IP在第三层网络层,MAC地址工作在第二层数据链路层。协议发包时需要封装IP地址和MAC地址,但只知道IP,又不能跨层直接找,所以得用ARP协议的服务帮助获取目的节点的MAC地址
浏览器中输入一个URL后,按下回车后发生了什么
URL,统一资源定位符,l简单点就是网址=ip或域名 + 端口号 + 资源位置 + 参数 + 锚点
1.输入一个网址之后,首先浏览器通过查询DNS,查找这个URL的IP地址,(通过层层向上级DNS服务器查找直到找到对应URL的IP地址)
2.得到目标服务器的IP地址及端口号(http 80端口,https 443端口),会调用系统库函数socket,请求一个TCP流套接字。客户端向服务器发送HTTP请求报文
(1)应用层:客户端发送HTTP请求报文。
(2)传输层:(加入源端口、目的端口)建立连接。实际发送数据之前,三次握手客户端和服务器建立起一个TCP连接。
(3)网络层:(加入IP头)路由寻址。
(4)数据链路层:(加入frame头)传输数据。
(5)物理层:物理传输bit。
3.服务器端经过物理层→数据链路层→网络层→传输层→应用层,解析请求报文,发送HTTP响应报文。
4.关闭连接,TCP四次挥手。
5.客户端解析HTTP响应报文,浏览器开始显示HTML
网页卡顿原因
网速慢、带宽不足、硬件配置低、内存被占满。
JS脚本过大,阻塞了页面的加载。
网页资源过多、接受数据时间长、加载某个资源慢。
DNS解析速度。
一般怎么检查
硬件问题:检查网线或者无限网卡有没有插好,有没有连上路由器,就是底层是不是联通状态;
软件问题:查看是否有对应的驱动,服务器好不好,DNS对不对,或者可能是代理没关
当网页加载很慢的时候,应如何分析其原因并解决问题?
http请求次数太多
资源过大,资源过多
JS脚本过大
网速慢
…
给一个网址先解析什么后解析什么(域名解析顺序)?
域名分层:从右到左分别为顶级域名、二级域名…最左为主机名(服务器名)。比如www.baidu.com的com为顶级域名,email.tsinghua.edu.cn中cn为顶级域名,为中国国家域名,edu为教育科研部门域名,email为服务器名。
域名解析时,优先查找匹配的子域名,如果子域名存在,则从子域名的配置文件查询解析结果,如果子域名不存在,就从上一级的配置文件查询结果
TCP、UDP
TCP连接三次握手的过程
初始状态客户端CLOSED,服务器LISTEN
- 客户端A向服务器B发送SYN数据包(SYN, x:0)请求连接。此时状态为SYN_SENT,表示客户端已发送SYN报文。
- 服务器B收到,发送SYN/ACK数据包(SYN/ACK,
y:x+1)回应。此时服务器状态由LISTEN(服务器socket处于监听状态,可以接受连接)变为SYN_RECV,表示收到SYN报文 - 客户端A收到并发出确认ACK(ACK, x+1:y+1),连接成功。双方状态ESTABLISHED
TCP四次挥手的过程
初始状态双方ESTABLISHED
-
客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。客户端FIN_WAIT_1。表示主动关闭连接,向对方发送了FIN,进入FIN_WAIT_1,等待对方的确认
-
服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。客户端FIN_WAIT_2,表示半连接,而服务器可能还有数据要发,这边稍后关闭。服务器CLOSE_WAIT。
-
服务器B关闭与客户端A的连接,发送一个FIN给客户端A。服务器LAST_ACK,等待对面的ACK报文
-
客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。客户端进入TIME_WAIT,表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态了。
为何TIME_WAIT:
防止服务器在处于LAST_ACK状态下未收到ACK报文而重发FIN报文,这个TIME_WAIT 状态的作用就是用来重发可能丢失的ACK报文。
TCP和UDP的特点
TCP面向连接,UDP无连接
TCP可靠,保证安全,UDP尽最大努力交付,不保证安全
TCP是点对点的,UDP可以一对一 一对多 多对多 多对一
TCP面向字节流,UDP无拥塞控制
TCP开销较大,UDP开销小
TCP、UDP的应用场景
UDP使用场景 DNS协议(因为用UDP快),看视频、发语音、QQ聊天、多媒体教室屏幕广播
TCP使用场景 HTTP协议,QQ传文件,邮件,登陆
TCP怎么实现可靠传输
确认和重传机制:建立连接、发送包时的确认,运输过程中校验失败、丢包或延时发送端重传
数据排序:把数据分成很多包,按顺序进行传输
流量控制:滑动窗口和计时器
拥塞控制:慢启动、拥塞避免、快速重传、快速恢复
流量控制
作用于接收方,控制发送者的发送速度从而使接收者来得及接收,防止分组丢失的。
由滑动窗口实现
滑动窗口
TCP进行流量控制的方式,接收方通过告诉对方自己的窗口大小,从而控制发送方的发送速度,以防止由于发送方发送速度过快而导致自己被淹没的现象
计时器
发送端收到为0的窗口后开启一个计时器,时间到了之后发包询问现在的滑动窗口,防止死锁(接收端发回的不为0的窗口的包丢失,双方相互等待)
拥塞控制
作用于网络,防止过多的数据注入到网络中,避免出现网络负载过大的情况。
拥塞:对网络中某一资源的需求超过了该资源所能提供的可用部分,影响到网络性能
拥塞控制:防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。
拥塞窗口
发送方使用的流量控制,另外考虑到接受方的接收能力,发送窗口可能小于拥塞窗口。
慢启动和拥塞避免
慢启动:不要一开始就发送大量的数据,先探测一下网络的拥塞程度,也就是说由小到大逐渐增加拥塞窗口的大小。
拥塞窗口一开始设为1 ,每收到一次确认,就让拥塞窗口变为原来的两倍,当窗口值为16时(慢启动门限),改为加法增大,每次+1,直到网络拥塞。拥塞时让新的慢启动门限设为拥塞时的一半,并把拥塞窗口置为1,再让他重复,这时一瞬间会将网络数据量大量降低。
拥塞避免:拥塞避免算法让拥塞窗口缓慢增长,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍。
快重传和快恢复
快重传:接收方每收到一个失序的报文段(收完2后就收到了4说明3丢了)就立即发出包2的重复确认,这样可以让发送方尽早知道丢包了。
发送端连续收到三个重复确认就立即重传3
快恢复:发送方收到3个连续确认时,把慢开始门限减半,把拥塞窗口的值置为慢开始门限的一半,实行拥塞避免算法,每次确认收到后+1