网络层:
协议:IP、ICMP(互联网控制消息协议,用来返回错误信息)、ARP
网络层首部固定部分20字节,可变部分最多40字节
首部数据:
1,版本:占4位,0b0100:IPv4, 0b0110: IPv6
2,首部长度:占4位,二进制乘以4是最终长度,最小值0b0101,最大值0b1111
3,区分服务:占8位,用于提高网络服务质量
4,总长度:占16位,首部+数据长度之和,最大值65535,由于帧的数据不能超过1500字节,所以过大的ip数据包需要分片传输给数据链路层,每一片都有自己的网络层首部
5,标识:占16位,数据包的id,当数据包过大进行分片时,同一个数据包所有片的标识都是一样的,有一个计数器专门管理数据包的id,每发出一个数据包,id就加1
6,标志:占3位,第1位保留;第2位:1代表允许分片,0代表不允许分片;第3位:1代表不是最后一片,0代表是最后1片
7,片偏移:占13位,片偏移乘以8是字节偏移,所以每一片的长度一定是8的倍数
8,生存时间:TTL,占8位,每个路由器在转发之前会将TTL减1,一旦发现TTL减为0,路由器会返回错误报告(ICMP协议)。
9,协议:占8位,表明所封装的数据使用了什么协议。TCP6, UDP17, ICMP1,IP4
10,首部检验和:占16位,用于检查首部是否有错误
11,源IP地址:32位
12,目标IP地址:32位
传输层:
协议:TCP(传输控制协议)、UDP(用户数据报协议)
区别:
1,TCP是面向连接的,TCP协议传输数据时需要进行三次握手建立连接,一旦不想继续发送数据需要四次挥手释放连接,UDP是无连接的
2,TCP是可靠传输的,不丢包,如果发送的数据某些字节不小心丢了,TCP会重新发,保证传输的数据没问题,UDP不可靠传输,尽最大努力交付,可能丢包
3,由于TCP是面向连接的,而且为了保证可靠传输首部占用空间大,UDP首部占用空间小
4,TCP传输速率慢,UDP传输速率快
5,TCP资源消耗大,UDP资源消耗小
6,应用场景:TCP:浏览器、文件传输、邮件发送 UDP:音视频通话,直播
7,应用层协议:TCP:HTTP、HTTPS、FTP、SMTP、DNS, UDP:DNS
UDP:
首部:8个字节
1,源端口号:16位
2,目标端口号:16位
3,UDP长度,16位,首部的长度+数据的长度
4,检验和:16位,计算的内容:伪首部(源IP,目标IP,0,协议类型(17),UDP长度(16位)) + 首部 + 数据
TCP:
首部:至少20个字节的固定首都,可变部分最多40字节,建立连接时,前两次握手通常32字节
头部:
1,源端口号:16位
2,目标端口号:16位
3,序号:占32位,TCP在传输过程中的每个字节都有一个编号,在建立连接前,表示初始序号,在建立连接后,表示这一次传给对方的TCP数据部分的第一个字节的编号
4,确认号:占32位,在建立连接后,确认号代表期望对方下一次传过来的TCP数据部分的第一个字节的编号
5,数据偏移:占4位,二进制乘以4是最终长度,最小值0b0101,最大值0b1111
6,保留位,占6位,全是0
7,标志位:占6位
URG:当URG为1时,紧急指针字段才有效,表明当前报文段中有紧急数据,应当优先尽快传送
ACK:当ACK为1时,确认号字段才有效
PSH:交互式网络中
RST:让RST为1时,表明连接中出现严重差错,必须释放连接
SYN:建立连接时使用,当SYN=1,ACK=0时,表明是一个建立连接的请求
如果对方同意建立连接,则回复SYN=1,ACK=1
FIN:释放连接时使用,当FIN=1,表明数据已经发送完毕,要求释放连接
8,窗口:占16位
9,检验和:占16位,计算的内容:伪首部12个字节(源IP4个字节,目标IP4个字节,0,协议类型1个字节,TCP长度2个字节) + 首部 + 数据
10,紧急指针:占16位,一般存放数字,表明数据部分前面有多少个字节是紧急的
选项部分:
1,MSS,每个段最大的数据部分大小,在建立连接时确定
2,是否允许SACK
3,window scale(窗口缩放系数),window * window scale得到真正的窗口值
TCP的要点:
一:可靠传输
当服务器返回数据较大时,TCP会将数据分成多个段发送,如果中途某个段丢失,TCP会将丢失的段重新发送,保证客户端收到的数据是完整的
停止等待ARQ协议:自动重传请求
发送一个分组就停止发送等待确认
假设A和B进行通信,A要发三个包给B
无差错情况:A发送M1,B确认收到M1,A发送M2,B确认收到M2,A发送M3,B确认收到M3
超时重传:A发送M1,但是等到一定时间没有收到B的确认,A重新发送M1
B未收到或者收到发现包有问题没有给回确认:确认收到M1
B收到后返回的确认收到M1丢失:B丢弃重复的M1,重传确认M1
A超时收到上次重复的确认M1,什么也不做
超过了一定重传次数或时间还没收到对端的确认报文,就会发送rst报文,断开TCP连接
连续ARQ协议+滑动窗口协议:
发送窗口中的分组连续发送,发送完成后停止,等待确认
1,建立TCP连接时,接收方告诉发送方接收窗口大小,此时,发送方就设置发送窗口大小为接收窗口大小(接收窗口大小和拥塞窗口大小的最小值)
2,发送方将发送窗口数据分成多个包连续发送,B收到后发送确认号,ACK=1,确认号=期望收到下一次数据第一个字节编号,
3,发送方收到接收方的确认标识,将已经收到的分组从缓存中删除,滑动窗口向前移,继续将下一个窗口数据分成多个包发送
4,如果接收方收到的数据发生丢失,接收方给回连续收到的数据的下一个字节的确认号,并且已经读取的报文从缓存中删除
5,发送方收到接收方的确认报文后,滑动窗口向前移,根据确认标识重新发送数据,如果使用了选择性确认,则只重发丢失的数据
接收方给回确认时,会告诉发送方接收窗口大小
如果接收窗口最多能接收4个包,但发送发只发送了2个包,接收方等待一段时间还没有第3个包,接收方就会返回确认收到两个包给发送方
SACK:选择性确认
在TCP通信过程中,如果发送序列中间某个数据包丢失(比如1、2、3、4、5中的3丢失了)
使用SACK之前:
TCP会重传最后确认的分组后续的分组(最后确认的是2,会重传3,4,5),这样原先已经正确传输的分组也会重新发送,降低了TCP性能
使用SACK之后:
接收方会告诉发送方,哪些数据丢失,哪些数据已经提前收到,使TCP只重新发送丢失的包,不用发送后续所有的分组
实现方式:
SACK信息会放在首部的选项部分,
Kind:1个字节,5代表这是SACK选项
Length:1个字节,表明SACK选项一共占用多少个字节
LeftEdge:占4个字节,左边界
RightEdge:占4个字节,右边界
最多携带4组边界信息,SACK选项最大占用字节 = 4 * 8 + 2 = 34
为什么选择在传输层就分成多个段,而不是等到网络层再分片传递给数据链路层?
为了提高重传的性能,如果在传输层不分段,一旦数据丢失,整个传输层的数据都得重传,如果在传输层分了段,一旦出现数据丢失,只需要重传丢失的那些段即可
二:流量控制
在发送方给接收方发送数据的过程中,接收方会告诉发送方接收方的接收窗口大小,从而控制发送方的发送速率,让发送方的发送速率不要太快,让接收方来得及接收处理。发送方的发送窗口大小不能超过接收方给出的接收窗口大小,当发送方收到接收窗口大小为0时,发送方就会停止发送数据。
为什么要进行流量控制:
如果接收方的缓存区满了,发送方还在疯狂的发送数据,接收方只能把收到的数据包丢掉,大量的丢包会极大的浪费网络资源,所以要进行流量控制。
特殊情况:
如果接收方给发送方发送了0窗口的报文段,后面接收方又有了一些存储空间,给发送方发送的非0窗口的报文丢失了,发送方的发送窗口一直为0,双方陷入僵局。
当发送方接收到0窗口通知时,这时发送方停止发送报文,并且同时开启一个定时器,隔一段时间就发个测试报文去询问接收方最新窗口大小,如果接收的窗口大小还是0,则发送方再次刷新启动定时器。
三:拥塞控制
拥塞控制是为了防止过多的数据注入到网络中
避免网络中的路由器或链路过载
拥塞控制是一个全局性的过程,涉及到所有主机、路由器,以及与降低网络传输性能有关的所有因素,是大家共同努力的结果。相比而言,流量控制是点对点通信的控制。
方法:
慢开始:
拥塞窗口的初始值比较小,然后随着数据包被接收方确认(收到一个ACK),拥塞窗口就成指数级增长
拥塞避免:
当拥塞窗口达到慢开始阈值后,以线性方式增加(加法增大),拥塞窗口缓慢增大,以防止网络过早出现拥塞。只要网络出现拥塞,把慢开始阈值减半(乘法减小),于此同时,执行慢开始算法(旧版本)。当网络出现频繁拥塞时,慢开始阈值就下降的很快
快重传:
接收方每收到一个失序的分组后就立即发出重复确认,使发送方及时知道有分组没有到达,而不要等待自己发送数据时才进行确认
发送方只要连续收到三个重复确认(总共4个确认),就应当立即重传对方尚未收到的报文段,而不必继续等待重传计时器到期后再重传
快恢复:
当发送方连续收到三个重复确认,为了预防网络发生拥塞,就执行乘法减小算法,把慢开始阈值减为拥塞峰值的一半,由于发送方现在认为网络很可能没有发生拥塞,因此不执行慢开始算法,拥塞窗口不恢复到初始值,而是设置为慢开始阈值减半后的数值,然后开始执行拥塞避免算法(加法增大),使拥塞窗口缓慢线性增大
MSS:每个段最大的数据部分大小,在建立连接时确定(选项部分)
cwnd:拥塞窗口(发送方根据网络状况自己调整)
rwnd:接收窗口
swnd:发送窗口,= min(cwnd,rwnd)
四:连接管理
建立连接,三次握手:
1、客户端处于CLOSE关闭状态,服务器处于LISTEN监听状态,等待客户端连接
客户端发送连接请求,SYN=1,ACK=0要求建立连接,ack=0,seq=s1
此时客户端进入同步已发送状态,表示客户端已发送SYN报文,等待服务器的第二次握手
2、服务器收到客户端要求建立连接的请求,
回复连接请求确认,同意建立连接,SYN=1,ACK=1,ack=s1+1,seq=s2
服务器进入同步已接收状态,表示收到了SYN报文
3、客户端收到服务器的连接请求确认,
发送最后确认,SYN=0,ACK=1,ack=s2+1,seq=s1+1
客户端进入ESTABLISHED连接已建立状态,服务器收到客户端的ACK报文,服务器进入ESTABLISHED连接已建立状态
前两次握手的特点:
SYN都是1,数据部分长度是0,TCP头部的长度是32字节
为什么建立连接要进行三次握手:
主要目的:防止服务器端一直等待,浪费资源
如果建立连接只需要2次握手,可能出现的情况:
假如客户端发出的第一个连接请求报文段因为网络延迟,在连接释放以后的某个时间才到达服务器,本来这是一个已经失效的连接请求,但服务器收到这个请求后,误以为是客户端再次发出的一个新的连接请求,于是服务器就向客户端发出确认报文段,同意建立连接,如果不采用3次握手,那么只要服务器发出确认,新的连接就建立了,由于现在客户端并没有真正想连接服务器的意愿,因此不会理睬服务器的确认,也不会向服务器发送数据,但服务器却以为新的连接已经建立,并一直等待客户端发来数据,这样,服务器的很多资源就白白浪费了
采用三次握手,当客户端没有向服务器的确认发出确认,服务器由于收不到确认,就知道客户端并没有要求建立连接
第3次握手失败了,服务器会怎么处理?
此时,服务器处于同步已接收状态,若等不到客户端的ACK,服务器就会重新发送SYN+ACK包,如果服务器多次重发SYN+ACK都等不到客户端的ACK,就会发送RST包,强制关闭连接
释放连接,四次挥手:
1,客户端和服务器处于连接已建立状态
客户端向对方发送FIN报文,FIN=1,ACK=1,seq=u,ack=v
客户端进入终止等待1状态,表示想主动关闭连接
2,服务器收到客户端的FIN报文,
服务器回应ACK报文给对方,ACK=1,seq=v,ack=u+1
服务器处于关闭等待状态,在此状态下服务器需要考虑自己是否还有数据发送给对方,如果没有,发送FIN报文给对方
客户端收到服务器的ACK确认后,就会处于终止等待2状态,等待对方发送FIN报文
3,服务器发送FIN报文,FIN=1,ACK=1,seq=w,ack=u+1
服务器进入最后确认状态,等待对方的ACK报文
4,客户端收到服务器的FIN报文,
客户端回应ACK报文,ACK=1,seq=u+1,ack=w+1
客户端进入时间等待状态,等2MSL后即进入关闭状态
服务器收到客户端的ACK报文,进入关闭状态
如果终止等待1状态下,收到了对方同时带FIN标志和ACK标志的报文时,可以直接进入时间等待状态,而无须进入终止等待2状态
如果一方发送FIN报文后,没有收到对方的ACK报文,却收到了对方的FIN报文,就会进入CLOSING状态,表示双方都正在关闭连接。
MSL:TCP报文在因特网上的最长生存时间,每个具体的TCP实现都必须选择一个确定的MSL值,RFC建议是2分钟,
为什么客户端发送ACK确认后,需要有个时间等待阶段,等待一段时间(一般是2倍的MSL)后再真正关闭连接?
可以防止本次连接中产生的数据包误传到下一次的连接中,
如果客户端发送ACK后马上释放了,然后又因为网络原因,服务器没有收到客户端的ACK,服务器就会重发FIN,这时客户端没有任何响应,服务器那边会干等,甚至多次重发FIN,浪费资源。这时如果有一个新的应用程序刚好分配了同一个端口号,新的应用程序收到FIN后马上开始执行断开连接的操作,本来它可能是想跟服务器建立连接的。
为什么释放连接的时候,要进行4次挥手?
TCP是全双工模式,
第1次挥手,表示主机1告诉主机2,主机1已经没有数据要发送了,但是此时主机1还是可以接受来自主机2的数据
第2次挥手,表示主机2已经知道主机1没有数据发送了,但主机2还是可以发送数据到主机1的
第3次挥手,表示主机2告诉主机1,主机2没有数据要发送了
第4次挥手,表示主机1已经知道主机2没有数据发送了,随后正式断开整个TCP连接
应用层:
协议:
超文本传输协议:http、https
文件传输:FTP
电子邮件:SMTP、POP3、IMAP
动态主机配置:DHCP
域名系统:DNS
webSocket
DNS:
利用DNS协议,可以将域名解析成对应的IP地址,可以基于UDP也可以基于TCP,服务器占53端口
域名的分类:
通用顶级域名:.com .net .org .edu .gov .int
国家及地区顶级域名:.cn .jp .uk
新通用顶级域名:.vip .top .club .shop
二级域名:在通用顶级域名下,一般指域名注册人的名称 google baidu
在国家及地区顶级域名下,指注册的类别,com edu gov net
DNS域名解析过程:
所有DNS服务器都记录了根域名服务器的地址 .,上级DNS服务器记录了下一级DNS服务器的地址,全球一共13台ipv4的DNS根域名服务器,25台ipv6的DNS根域名服务器
1,客户端发请求访问最近的DNS服务器(可以是路由器),如果有缓存直接返回,没有缓存,访问根DNS服务器
2,根DNS服务器返回顶级域名服务器地址
3,顶级域名服务器返回二级域名服务器
4,直到拿到ip地址,缓存到本地DNS服务器,返回给客户端
DHCP:动态主机配置协议,基于UDP,客户端端口68、服务器端口67
ip地址按分配方式分为:静态IP地址、动态IP地址(从DHCP服务器自动获取)
DHCP服务器会从IP地址池中,挑选一个IP地址,出租给客户端一段时间,时间到期就回收它们
路由器可以充当DHCP服务器
分配地址过程:
1,发广播包(源IP0.0.0.0, 目标IP 255.255.255.255,目标MAC FF:FF:FF:FF:FF)
2,提供租约,服务器返回可以租用的IP地址,以及租用期限、子网掩码、网关、DNS等信息
3,选择IP地址,客户端选择一个OFFER,发送广播包进行回应
4,确认,被选中的服务器发送ACK数据包给客户端
5,自动续约客户端自动在租期不足的时候发送消息申请续约
HTTP:
超文本传输协议,是互联网中应用最广泛的应用层协议之一,设计的初衷是为了提供一种发布和接收HTML页面的方法,由URI来标识具体的资源
版本:
1991,0.9,只支持GET请求
1996,1.0,支持POST、HEAD,支持请求头,响应头,支持更多数据类型
每次请求都需要建立一个TCP连接,请求后立即断开连接
1997,1.1,支持PUT、DELETE,支持持久连接,多个请求可以共用一个TCP连接
2015,2.0
2018,3.0(草稿阶段)
报文格式:ABNF标准
header-field,0个或者多个
请求报文:
请求方法 空格 URI 空格 版本 回车换行
首部字段名 冒号 (空格/TAB 0个或多个) 值 (空格/TAB 0个或多个) 回车换行
首部字段名 冒号 (空格/TAB 0个或多个) 值 (空格/TAB 0个或多个) 回车换行
回车换行
实体主体
响应报文:
版本 空格 状态码 (空格 状态码的描述 0个或多个) 回车换行
首部字段名 冒号 (空格/TAB 0个或多个) 值 (空格/TAB 0个或多个) 回车换行
首部字段名 冒号 (空格/TAB 0个或多个) 值 (空格/TAB 0个或多个) 回车换行
回车换行
实体主体
请求方法:
GET:用于读取操作,获取某个资源,请求参数直接拼接在URL后面
POST:用于添加、修改、删除,请求参数放在请求体
HEAD:得到和GET请求相同的响应(状态行、响应头),但是没有响应体,使用场景:在下载大文件前,先获取其大小,再决定是否要下载,以此可以节约带宽资源
OPTIONS:用于获取目的资源所支持的通信选项,比如服务器支持的请求方法
TRACE:请求服务器回显其收到的请求信息,主要用于HTTP请求的测试或诊断
PUT:用于对已存在的资源进行整体覆盖
DELETE:用于删除指定资源
PATCH:用于对资源进行部分修改(资源不存在,会创建新的资源)
CONNECT:可以开启一个客户端与所请求资源之间的双向沟通的通道,可以用来创建隧道,可以用来访问采用了SSL(HTTPS)协议的站点 ???
状态码:
信息响应 100~199 :
100: Continue,请求的初始部分(URL、请求头)已经被服务器收到,并且没有被服务器拒绝,客户端应该继续发送剩余的请求,如果请求已经完成,就忽略这个响应
成功响应 200~299 :
200: 请求成功
重定向 300~399 :
302: 重定向,请求的资源被重定向到Location指定的地址
304: Not Modified, 说明无需再次传输请求的内容,也就是说可以使用缓存的内容
客户端错误 400~499 :
400: Bad Request,请求报文语法无效
401:缺少身份验证凭证
403:服务器有能力处理该请求,但是拒绝授权访问
404:资源找不到
405:请求方法不允许
406:服务器无法提供客户端想要的编码格式
408:服务器想要将没有在使用的连接关闭
服务器错误 500~599 :
500: 服务器报错
501: 请求的方法不被服务器支持(GET、HEAD必须支持)
502:
503:服务器尚未处于可以接受请求的状态
请求头:
User-Agent:浏览器(客户端)的身份标识字符串
Host:服务器的域名、端口号
Date:发送消息的日期和时间
Content-Type:请求体的类型
Content-Length:请求体的长度
Referer:浏览器访问的前一个页面
Accept:能够接受的响应体类型
Accept-Charset:能够接受的字符集
Accept-Encoding:能够接受的编码方式
Accept-Language:能够接受的响应内容的语言
Range:仅请求某个实体的一部分数据,字节偏移以0开始,常用于多线程断点下载
Connection:想要优先使用的连接类型,keep-alive持久连接
Origin:发起一个针对跨域资源共享的请求,告诉服务器跨域的源
Cookie:用于会话跟踪,自动保存之前由服务器通过Set-Cookie发送的Cookie
If-None-Match:如果上一次响应头里有Etag,就会将Etag的值作为请求头的值
If-Modified-Since:如果上一次的响应头里没有Etag,有Last-Modified,就会将Last-Modified的值作为请求头的值
响应头:
Date:发送消息的日期和时间
Last-Modified:所请求对象的最后修改时间
Server:服务器的名字
Expires:指定一个时间,超过该时间则认为此响应已经过期
Content-Type:响应体的类型
Content-Encoding:响应体的编码类型
Content-Length:响应体的长度
Accept-Range:服务器支持哪些种类的部分内容范围
Content-Range:这条部分消息是数据完整消息的哪部分
Content-Dispositon:可以让客户端下载文件并建议文件名的头部
Location:用来进行重定向
Access-Control-Allow-Origin:告诉浏览器这时一个允许跨域访问的请求,允许哪些源跨域
Set-Cookie:用于会话跟踪,区分请求来自哪个浏览器,服务器返回一个Cookie让客户端去保存
Cache-Control:缓存策略
no-storage,不缓存数据到本地
public,允许用户、代理服务器缓存数据到本地
private,只允许用户缓存数据到本地
max-age,缓存的有效时间,单位秒
no-cache,每次需要发请求给服务器询问缓存是否有变化,再来决定如何使用缓存
Last-Modified:资源的最后修改时间
Etag:资源的唯一标识(根据文件内容计算出来的摘要值)
Pragma:类似于Cache-Control,1.0版本
缓存机制:
通常将GET请求 + 静态资源进行缓存
Last-Modified的缺陷:只能精确到秒级别,如果资源在1秒内被修改了,客户端无法获取最新的额资源数据,如果某些数据最后一次修改时间发生了变化但是内容并没有任何变化,会导致相同数据重复传输
1,客户端发送GET请求
2,判断本地是否有缓存,如果本地没有缓存,请求服务器,如果返回响应头Cache-Control不为为no-storage则将响应体数据缓存到本地。
3,如果本地有缓存,判断响应头Cache-Control是否为no-cache,如果不是,判断缓存过期时间,如果没有过期,直接使用本地缓存
4,如果缓存过期或者Cache-Control为no-cache,请求服务器,此时可能带上请求头If-None-Match(如果响应头有Etag)或者If-Modified-Since(响应头没有Etag并且有Last-Modified),如果服务器返回304,则直接使用缓存
5,如果服务器返回不是304,则使用最新数据,同时判断是否需要缓存
代理服务器:
本身不生产内容,处于中间位置转发上下游的请求和响应,面向下游的客户端,他是服务器,面向上游的服务器他是客户端
正向代理:代理客户端
作用:
隐藏客户端身份
绕过防火墙
Internet访问控制
数据过滤
反向代理:代理服务器
隐藏服务器身份
安全防护
负载均衡
CDN:内容分发网络
CDN分发过程:
1,用户发起请求
2,DNS进行域名解析,DNS会根据用户IP地理位置、接入网络类型、返回离用户路由最短、负载最轻的缓存服务器
3,获得缓存服务器IP
4,如果缓存中有目标资源,将目标资源返回给用户
5,如果缓存中没有目标资源,则向源站发起请求,把获取的内容保存在缓存服务器,并返回给用户
网络安全:
网络通信过程中面临的4种安全威胁:
截获:窃听通信内容
中断:中断网络通信
篡改:篡改通信内容
伪造:伪造通信内容
1,ARP欺骗 - 网络层
可以让攻击者获取局域网上的数据包甚至可篡改数据包,可以让网络上特定电脑之间无法正常通信,可以让送至特定IP地址的流量被错误送到攻击者所取代的地方
通过在主机发送ARP广播时,向主机返回错误的MAC地址
防护:静态ARP,通过DHCP,一些防护软件
2,Dos、DDos
带宽消耗型:UDP洪水攻击、ICMP洪水攻击
资源消耗型:SYN洪水攻击、LAND攻击
防护方式:防火墙、交换机、路由器
2.1 SYN洪水攻击 - 传输层
攻击者发送一系列的SYN请求到目标,然后让目标因收不到ACK(第三次握手)而进行等待、消耗资源
方法:修改源IP地址,让目标送SYN、ACK到伪造的IP地址,因此目标永远不可能收到ACK
2.2 LIND攻击 - 传输层
持续发送相同源地址和目标地址的欺骗数据包,使目标试图与自己建立连接,消耗系统资源直至崩溃
防护:防火墙、路由器
3 DNS劫持
攻击者篡改了某个域名的解析结果,使得指向该域名的IP变成了另一个IP,导致对响应网址的访问被劫持到另一个不可达的或者假冒的网址,从而实现非法窃取用户信息或者破坏正常网络服务的目的
4 HTTP劫持
对HTTP数据包进行拦截处理,比如插入JS代码
HTTPS:
超文本传输安全协议(使用了TLS、SLL的HTTP),默认端口443
SSL/TLS(传输层安全性协议)工作在应用层和传输层中间
成本:
证书的费用
加解密计算
降低了访问速度
通信过程:
一、TCP三次握手
二、TLS连接(TLS1.2)
协商TLS版本,加密套件
1,Client Hello:客户端发送TLS版本号、支持的加密套件列表、一个随机数
2,Server Hello: 服务器发送TLS版本,选择的加密套件,一个随机数
3,Certificate:服务器发送服务器的公钥证书(被CA签名过的)
4,Server Key Exchange:服务器发送用以实现密钥交换算法的一个参数,为了防止伪造,参数是经过服务器私钥签名的(客户端用第三部服务器发送的公钥进行验证)
5,Sever Hello Done:告知客户端,协商部分结束
6,Client Key Exchange:客户端发送用以实现密钥交换算法的另一个参数
到目前为止,客户端和服务器都拥有了迷药交换算法的两个参数,客户端和服务器都可以使用密钥交换算法根据这两个参数计算出一个新的随机密钥串,然后结合客户端和服务器分别生成的随机数和随机密钥串生成一个主密钥,最后利用主密钥衍生出其他密钥,客户端发送用的会话密钥、服务器发送用户会话密钥
7、Change Cipher Spec:客户端告知服务器,之后的通信会采用计算出的会话密钥进行加密
8、Finished:客户端发送 加密包含连接至今全部报文的整体摘要值,加密之后发送给服务器
9、Change Cipher:服务器告知客户端,之后的通信会采用计算出的会话密钥进行加密
10、Finished:服务器发送 加密包含连接至今全部报文的整体摘要值,加密之后发送给客户端
到此为止,客户端服务器都验证加密解密没问题,握手正式结束
三、HTTP请求和响应
HTTP(HTTP/1.1)协议的不足:
1、同一时间、一个连接只能对应一个请求
针对同一个域名,大多数浏览器允许同时最多6个并发连接
2,只允许客户端主动发起请求
一个请求只能对应一个响应
3,同一个请求会话的多次请求中,头信息会被重复传输
通常会给每个传输增加500~800字节的开销,如果使用Cookie,增加的开销有时会达到上千字节
SPDY(speedy),Google开发的基于TCP的应用层协议,强制要求使用SSL/TLS,以提高网络速度,它修改了HTTP请求和响应的传输方式
SPDY是HTTP/2的前身
HTTP/2:
于2015年正式发表,
http/2在底层传输做了很多改进和优化,但在语义上完全与HTTP/1.1兼容,因此想要升级到HTTP/2,开发者不需要修改任何代码,只需要升级服务器配置、升级浏览器
特性:
1,二进制格式,http/2采用二进制格式传输数据,而非1.1的文本格式,二进制格式在协议的解析和优化扩展上带来更多的优势。
2,多路复用,客户端和服务器可以将http消息分解为互不依赖的帧,然后交错发送,最后再再另一端把它们重新组装起来,可以使用一个连接并行发送多个请求和响应
3,优先级,允许每个数据流都有一个关联的权重和依赖关系,可以向每个数据流分配一个介于1至256之间的整数,每个数据流与其他数据流之间可以存在显式依赖关系,客户端可以构建和传递优先级树,表明它倾向于如何接收响应,服务器可以使用此信息通过控制CPU、内存和其他资源的分配设定数据流处理的优先级,在资源数据可用之后,确保将高优先级响应以最优先方式传输至客户端
4,头部压缩,http/2使用HPACK压缩请求头和响应头,极大减小头部开销,进而提高性能
维护头部信息哈希表,只发送对应头信息的索引
5,服务器推送,服务器可以对一个客户端请求发送多个响应,除了对最初请求的响应外,服务器还可以向客户端推送额外资源,而无需客户端额外明确要求
问题:
1,队头阻塞:
2,握手延迟:
HTTP/3
由Google开发,弃用TCP,改为基于UDP协议的QUIC协议实现
TLS -> QUIC + TLS
TCP -> UDP
由QUIC保证可靠传输
HTTP3特性:
1,连接迁移
TCP基于4要素(源IP、目标IP、源端口、目标端口),切换网络时导致连接发生变化
QUIC连接不受4要素影响,当4要素发生变化时,原连接依然维持,QUIC连接以一组Connection ID来标识一个连接,即使IP或者端口发生变化,只要ConnectionID没有变化,那么连接依然可以维持
2, 向前纠错
HTTP3问题:操作系统内核、CPU负载
与基于TLS的HTTP/2相比,大规模部署QUIC需要近2倍的CPU使用量,Linux内核的UDP部分没有得到像TCP那样的优化,因为传统上没有使用UDP进行如此高速的信息传输,TCP和TLS有硬件加速,而对于UDP很罕见,对于QUIC基本不存在
webSocket协议:
基于TCP支持全双工通信的应用层协议,客户端服务器都可以主动发消息给对方,
使用场景:社交订阅、体育实况更新、多媒体聊天、股票基金报价
使用80、443端口
需要先建立连接
webService:web服务,是一种跨编程语言和操作系统平台的远程调用技术,现在很多企业开发平台都是采用web api
SOAP:简单对象访问协议,很多时候 SOAP = HTTP + XML
webService使用SOAP来封装传递数据
HTTPDNS:基于HTTP协议向DNS服务器发送域名解析请求,移动端集成相关的SDK就可以使用HTTPDNS服务
FTP:文件传输协议,基于TCP
邮件相关协议:
SMTP:简单邮件传输协议 基于TCP
POP、POP3:邮局协议
IMAP:因特网信息访问协议
IPV6,128位,每16位为一组,共8组,每组前面连续的0可以省略,可以采用双冒号表示1组或者多组连续的0,但只能出现一次
即时通信常用协议:
XMPP,基于TCP,特点:使用XML格式进行传输、体积较大,比较成熟的IM协议,接入方便
MQTT,基于TCP,特点:开销很小,以减低网络流量,信息冗余远小于XMPP,很多人认为MQTT最适合物联网
流媒体协议
RTP(UDP)、
RTCP(UDP)、
RTSP(TCP、UDP)、
RTMP(TCP)、
HLS(HTTP)
网络互联模型
物理层、数据链路层、网络层、运输层、会话层、表示层、应用层
网络接口层、网际层、运输层、应用层
物理层(比特流)、数据链路层(帧)、网络层(包)、运输层(段)、应用层(报文)
计算机之间的通信方式:
网线直连、同轴电缆、集线器、网桥、交换机、(连接的设备在同一网段、处在同一广播域)
路由器(可以在不同网段之间转发数据、隔绝广播域)
MAC地址:
6字节(48位),前三个字节组织唯一标识符,由注册管理机构分配给厂商,后三个字节网络接口标识符,由厂商自行分配
当48位全是1时,代表广播地址
ARP协议:地址解析协议,通过IP地址获取MAC地址
当不知道对方主机的MAC地址时,可以通过发送ARP广播获取对方的MAC地址,获取成功后,会缓存IP地址、MAC地址的映射信息,俗称ARP缓存,通过ARP广播获取的MAC地址,属于动态缓存,存储时间比较短(默认2分钟),过期了自动删除
IPV4:
IP地址由两个部分组成,网络ID和主机ID,通过子网掩码可以得知网络ID、主机ID
主机所在网段 = 子网掩码 & IP地址
IP地址的分类
A类: 0开头,默认子网掩码 255.0.0.0
第一部分取值 1 ~ 126
B类:10开头,默认子网掩码 255.255.0.0
第一部分取值 128 ~ 191
C类:110开头,默认子网掩码 255.255.255.0.0
第一部分取值 192 ~ 223
D类:1110开头
第一部分取值 240 ~ 255
E类:1111开头
主机ID全是0,代表主机所在的网段
主机ID全是1,代码主机所在网段的广播
子网:子网掩码向右移
超网:子网掩码向左移
数据链路层:
广播信道:CSMA/CD协议,
首部:源MAC、目标MAC、网络类型
以太网帧:首部 + 数据 + FCS
数据部分至少是:64 - 6 - 6 - 2 - 4 = 46字节
以太网帧的长度:64 ~ 1518
点对点信道:PPP协议
3个特点:
封装成帧
透明传输:
使用SOH作为帧开始符,使用EOT作为帧结束符,数据部分一旦出现了SOH、EOT就进行转义
差错检验
根据数据部分和首部计算出 FCS
数据链路层的帧长:以太网最大传输单元MTU1500字节
网友评论