计算机网络
2020年1月9日
23:23
client/server cs
peer/peer p2p
电路交换
童话的两端始终占用通信资源
分组交换
存储转发技术,拆分成报文,报文拆分成分组
分组暂存在内存中,查表,转发

带宽:
信号频率范围 频域
传输速率 时域







路由选择协议:
RIP
OSPF
BGP
信道类型:
广播
冲突控制
CSMA/CD 如Ethernet
信道复用:
点对点 PPP
以太网 802.3
虚拟局域网VLAN 802.1Q
数据链路层
不同协议均有一个MTU,表示真正的数据部分的大小限制范围
比如infinibond就是一个数据链路层的一个协议
以太网MAC帧

SLIP
在串行线路上对IP数据报进行封装的简单形式
用于点对点的连接
没有类型字段,所以不能同时使用其他协议
无校验和,需要上层协议
CSLIP
压缩不常变化的公共字段,压缩的SLIP
PPP
用于取代SLIP,点对点协议
大多数产品可以省略标志和地址字段,即压缩不常变化的公共字段

环回接口
当发送数据到127.0.0.1时,传输层、网络层正常包装,之后检测目的IP地址为环回接口时,将IP包直接放到
IP输入队列中,不会经过链路层封装和传输

IP协议
TPC/UDP/ICMP/IGMP都通过IP数据报的方式进行传输,虽然ICMP/IGMP是IP协议的附属协议
不可靠 不保证能能到达目的地
无连接 数据报之间是独立的
MTU指的是整个IP数据报的长度,由于2bytes,所以最大为65535
TTL由发送主机设置,通常为32/64,每经过一个主机减一,为0时丢弃
4位首部长度表示15(0b1111) 4bytes(32bits),首部包括选项部分,去除20字节固定header,剩余选项部分最大40字节。
ip地址
32bit
分为网络号,子网号和主机号
网络号分为ABCD四类
通过子网掩码,还可以划分子网,网络号/子网号所占bit都为1,而主机号部分为0
点十进制表示法永远是按照一个字节一个字节翻译的
通常以字节来作为子网号和主机号的分割点,这样通过十进制表示法可以肉眼进行区别不同网络,
否则需要在二进制格式下看
140.252.4.1 255.255.255.0 最后8bit表示主机号
是B类网络,网络号为140.252,子网号为4
结合在一起的网络为140.252.4.0
140.252.13.66 255.255.255.224 最后5bit表示主机号
是B类网络,网络号为140.252即前16bit,子网号为8 + 3位比特的二进制形式,其中前8位的十进制为13
结合在一起的网络为140.252.13.32
广播地址的主机号为最大值,为255/255.255/255.255.255
发送广播的主机也会通过环回接口收到一份该广播报文
路由查找的优先级为特定主机,特定网络,默认路由
以太网地址
即48位MAC地址,用于数据链路层的寻址,在链路层必须要通过硬件地址进行交流
ARP发送到广播地址获取某个ip的MAC地址
点对点链路不适用ARP,直接在内核中就记录了某个接口的两端IP地址,比如ifconfig就会显示两端ip地址
ARP高速缓存记录了ip地址和mac地址的映射关系以及相应的接口,一般每个map缓存20min
数据帧报头的目的地址为全1位广播地址,注意当ip为广播地址时(肯定不是全1),会转换为全1的mac广播地址
硬件类型为1表示为以太网
协议类型为0x0800表示协议类型为ip
op:1请求,2应答,3RARP请求,4RARP应答
发送端出了ARP报文的目的地址不填外,其他都填,ARP响应由于知道了原MAC,所以不再是广播
由于一共才28字节,不足以太网数据段要求的46字节,所以后面要填充
ARP代理
路由器不会转发广播包
代理ARP会返回路由器本身的MAC地址

上面可以看到netb 和sun的mac地址都是netb的mac地址
ARP代理需要手动打开
使用aro -s添加永久的map,加上pub参数,则可以起到arp代理的作用,如果接受到目的IP为主机名对应IP的ARP请求时,会返回指定的以太网地址
免费ARP
即查询自己的IP
目的:
查看有没有其他主机设置了同样的ip,如果接收到回复,则会产生错误信息警告重复ip
接收端每次接收到ARP请求的时候,会更新高速缓存中的map(前提是发送arp请求的ip映射已存在)
gethostbyname函数用于将一个主机名转换为32bit的ip地址
RARP
即将mac地址转换为IP地址
用于某些无盘系统引导,需要通过RARP服务器返回一个ip地址供使用
RAP服务器是设计在内核中,而RARP服务器是一个进程
一般一个网络中会有多个RARP服务器
ICMP
校验和和IP首部的校验方式一样
ICMP报文

例子
查询对方的子网掩码,时间戳
不可达报文
当接收方发现不存在绑定了UDP数据报中的目的端口的进程时,会返回一个ICMP不可达报文(注意由于返回的不是TCP/UDP所以不会将ICMP返回给用户数据)
差错报文会带上产生差错的ip报首部和其中的运输层报文的首部(8个字节)
当收到差错报告后,系统会给出不同的处理方式
PING
利用的是ICMP协议
发送回显请求,服务器内核的ping服务器返回回显应答
-R 可以在IP首部设置RR选项(路由选项),这样每个路由器(不包括自己)就会将其IP地址(出口地址)添加到该选项字段中,并且回来后会把自己的*入口ip地址也加入
但是由于IP首部长度最长60bytes,所以也存不了多少ip地址
IP首部选项部分
对路有选项而言,code为7
对于路有选项而言,len最大为39字节,共存储9个ipv4地址
时间戳选项,即在IP首部的选项中记录个路由器的时间戳和ip地址
FL标志
OF
当由于首部空间不足而不增添加新的时间戳 条目时,会增加溢出字段的值
Traceroute
为什么不直接使用RR记录路由选项:
并不是所有系统都支持该选项
存在记录数量数量限制(9 ipv4)
原理是使用IP首部的TTL字段和ICMP差错报告(20 + 8 + 20 + 8 字节的ip包)
- 发送的为UDP数据报,选择了一个不可能的值作为UDP端口号,ip数据报大小为40bytes(20ip首部,8UDP首部,12字节的UDP用户数据(包含序号和发出时间))
- 首先发送TTL为1的IP报文到目的主机,在第一个路由器减一,将其丢弃,由于报文目的ip不是该路由器,所以并返回一个ICMP超时差错报文,关键在于包含该ICMP报的ip数据报的首部是写了该路由器的ip地址的
- 注意的是,直接通过接受的网络接口(入口)返回IP报,而不会再去通过路由表查路由(否则可能经过另一个接口返回IP报文)
- 是如何做到的?
- 由于这一点,可以看到和RR选项的区别(记录的是出口的ip)
- 注意的是,直接通过接受的网络接口(入口)返回IP报,而不会再去通过路由表查路由(否则可能经过另一个接口返回IP报文)
- 之后不断增加TTL,获取所有中间路由的超时差错报文
- 如果确认目的主机接受到呢?由于UDP端口号是估计设计的,当目的主机接收到TTL为1(不断递减而来)的报文时,返回一个 端口不可达的ICMP差错报告,从而整个路由路线都被确认
traceroute对于每个TTL发送三次,如果5s内未接受任意一份的回复,打印星号并发送下一个TTL的数据
每次发送一次数据报,UDP端口号都会加1
ICMP超时报文类型为11,端口不可达类型为3
源站选路
LSRR/SSRR IP选项,code为0x83/0x89,分别为宽松的和严格的,严格的当目的地址(ip addr 9)不是自己的话会返回 源站路由失败的ICMP差错报告,而不是接着转发
可以指定中间经过的路由
与RR选项类似,区别是,这里发送的ip包就得填充IP地址,表示中间需要按顺序经过的路由,最多指定8个中间路由,最后一个地址表示目的地址
下例子S收到应用程序的路由清单,指定了中间路由为R1,R2,R3,目的地址为
#表示ptr的地址,dest即表示最后一个地址ip addr 9
-g ip 为宽松的路由选站选项
-G 严格的
可以使用traceroute来查看往返路径上各个路由的入口地址以及出口地址,同时也可以看到动态路由的效果
方法是将原本的目的地址设为宽松路由,而将自己设为真正的目的地址
IP 选路
即根据路与表决定IP包的发送网络接口
Destination,即用来决策的匹配项,使用ip包的目的ip地址与这些选项进行匹配,决定发送网络接口
网络,使用该网段的起始地址进行表示
host
default
查表的时候优先host,之后为网络,最后才为default
Gateway 表示真正要发送到的主机
Flags:
U 表示可以使用
G 表示该路由是一个路由器(间接路由),发送ip包的时候mac地址为该gateway的mac地址,否则一般为该接口的出口地址或者0.0.0.0,表示该路由为本地网络(直接路由),mac地址为目的ip的mac地址
H 表示该路由目的地址是一个主机,否则为一个网络
D 该路由是由重定向报文创建的
M 该路由已经被重定向报文修改
Refcnt 表示正在使用该路由的进程个数
Use表示通过该路由发送的分组数
ftp hostname/local_ip 和 ftp localhost/127.0.01会经过不同的路由,虽然最后都会被发到还回驱动程序中
- 对于ftp local_ip是,会进如本地网络的接口驱动程序中,检测到ip与接口ip相同,则直接将ip包放入还回驱动程序的ip输入队列中。见之前的图
如果没有default路由,有没有匹配到的路由,对于本机程序的ip包,会返回host unreacheable差错,对于从其他主机接受而来的ip包,会返回一个ICMP host unreacheable差错报告
修改ipforwarding来控制一个系统是否具有转发功能,即接受另一个主机的ip包,并通过路由转发出去
ICMP重定向差错
当路由器发现ip包到达的接口和将要转发出去的接口是同一个接口的时候(表明主机和R2位于同一个本地网络),会返回给主机一个ICMP重定向差错,告诉他创建一个新的路由,gateway为R2的ip地址,destination为主机原先发送数据包的目的ip地址,注意这两地址不一定相同
内核必须配置ip_sendredirects变量
重定向差错只能创建主机路由,以为和code必须为1或3

ICMP路由器发现报文
包括请求和通告报文

路由器会不间断随机的广播通告报文,且会监听来自主机的请求报文
主机在引导期间会发送请求报文
主机如果在一段时间内没有收到默认路由对应主机的通告报文,则默认路由会超时
动态路由
选路协议,用于相邻路由器之间进行通信,内核的选路系统会相应的动态更新路由表
自治系统内部个路由器使用的选路协议称为内部网关协议Interior Gateway Protocol IGP,最常用的选路协议为RIP, OSPF
外部网关协议EGP用于不同自治系统之间的路由器
UDP

长度为UDP报的整体长度
校验和覆盖UDP首部和数据, UDP的校验和是可选的,而TCP的是必须的
为了计算校验和,会添加伪首部和填充字节(只是计算的时候使用,传输的时候没有)
如果发送端计算了校验和,且接收端检测到校验和有差错,那么UDP数据报就会被无声的丢弃,不产生任何差错报文(ip包的校验和也是这么做的)
IP分片
在发送IP包的时候,回通过接口获得接口对应的最大MTU,必要时要对IP包的数据部分进行分片,每个ip分片包含部分原始IP包的数据,之后所有分片到达下一站的时候再组装起来,之后再查看该站的出口MTU,再决定是否分片,注意不是到达目的ip后再组装
这么做的好处是,对于TCP/UDP而言,IP分片是透明的,不存在的
因为有分片,对于每个数据帧而言都会有ip首部,但是不一定有TCP/UDP首部,因为首部在第一个分片中
对一个ip报文,若在一定时间内未接受完其所有分片,会被无声的丢弃,而不返回差错报告
分片时,出了最后一个分片,每一片的ip数据不分必须是8字节的整数倍
每个分片的ip包都会有相同的标识字段
ip首部标志字段中有一个bit用来表示更多的分片,除了最后一个分片外都要设为1
ip首部标志字段中还有一个bit表示不分片(DF标记),如果设置为1,但是主机检查出口mtu后发现必须分片,那么会把该ip包丢弃并返回一个ICMP不可达差错
分组指代的是一个ip包,但是一个ip包不一定是一个完整的ip报文,因为可能是期中一个分片
无法分片产生的ICMP不可达差错

对于设置了DF的ICMP请求,ICMP回复也会设置DF
路径MTU发现机制
自动的打开或者关闭DF标志,自动分片,调整分片的大小,以满足路径中的最小MTU的要求
ICMP源站抑制(source quench)差错
当一个主机接受数据报的速度比起处理速度快的时候,可能产生这个差错报告
广播,多播
广播地址中主机号bits都是1
可以分为指向网络的广播,指向子网的广播
多播
IP为224...*
可以接受目的IP为该多播组IP的所有主机称为主机组,可以跨越多个网络,主机组中多个成员可以随时加入或者离开该组(修改IP)
有些默认的组
224.0.0.1表示该子网内所有主机的组
224.0.0.2表示该子网内所有路由器的组
224.0.1.1用作网络时间协议NTP
多播IP对应的以太网地址(mac地址)
由于有5bit未用,所以多个不同的多播地址可能对对应于同一个mac地址
IGMP
用于处理多个网络中多播数据的转发
IGMP数据位于IP包中
类型为1,表示由多播路由器发出的查询报文,地址为0
类型为2,是主机返回的响应报文,需要把该主机想加入的多播组地址填进来
DNS
udp 进行传输
TFTP
udp
BOOTP
TCP


UDP:






可靠传输:
最小报文长度和最大报文长度MSS
go back n/ selective repeat arq
滑动窗口
糊涂窗口综合症
发送方:应用程序往写缓存区太慢,导致发送太多的小包,解决办法:
Nagle算法:第一个数据直接发送(即使是1bytes), 收到确认后,以后的包至少要缓存到一个MSS的时候才发送
接收方:应用程序读取缓存太慢,导致返回的窗口越来越小,最终收缩到不能容纳一个segment的大小, 解决办法:
控制回复ack的时间,起码缓存区的内容能够容纳一个MSS,或者有一半空闲后才回复ack(带上相应的窗口大小)
超时重传 超时重传时间RTO
持续计时器/零探测报文
虽然sliding window的单位是bytes,但是发送还是要以segment的单位发送,ack的序号也是根据segment返回的,比如segement大小为200,window size为1000, 那么返回的ack序号只能为201 401 601 801 1001, 接受端即使接受到了200 600 800, 返回的也只能是 401, 表明期待下一次接受的是第二段
拥塞控制:
慢开始 指数增长
拥塞避免 线性增长
快重传/快恢复 转拥塞避免 3个重复ack(不算第一个) 后发生
超时 转慢开始
cwnd:拥塞窗口
ssthresh: 慢开始门限
以上是建立在接收方窗口无限的情况基础上的,
不管怎样,发送窗口不能超过接收方窗口 rwnd
路由器的主动队列管理:
寄哪里连接

最后一次A->B的作用:
1: 如果A发送的请求滞留在网络中,等B收到后建立连接,这时A已经丢弃该连接了,不会理会B返回的同意连接消息,但是B仍然认为A还在连接,在等待A发送消息,这样就会造成资源浪费
2:这一次还可以附带发送的消息,这样的话seq就不是x + 1了,而是表明数据的开始
结束连接
TIME WAIT的原因:
1: 防止之前提到的情况,收到了上一次连接发送的连接确认请求。即:两次连接用的同一个端口
2:当客户端返回的ACK没有被服务端收到时,服务端会超时重传FIN + ACK报文
保时计时器keepalive timer
FTP: TCP
控制进程和数据传送进程
控制连接(21)和数据传送连接(20)
主动模式/被动模式
TFTP: UDP
WWW:
Uniform Resource Locator
Hypertext Transfer Protocol
Hypertext Markup language
HTTP 无连接的/无状态
HTTP 1.0 支持持续连接
非流水线连接/流水线连接(不比等回复就可以发送其他请求)
DHCP: UDP
P2P
EMAIL
网络安全:
DOS (Denial of Service)
DDOS(distributed Denial of Service)
对称加密:
加解密密钥是用使用相同的密码体质
DES: 保密性取决于对密钥的保密,64位(实际56位,含8位用于奇偶校验)
三重DES:
公钥密码体质:
公钥加密,私钥解密
数字签名:
只有私钥才能产生出PK解密后为明文的加密内容
上述的方法只能起到签名的作用,但未对内容进行加密,中间人可以很容易的获得A的公钥从而新解密,通过下面的方法可以同时起到签名和保密的作用
鉴别:
散列函数:
MD5 SHA-1
报文鉴别
期中加解密的方式并未受限
实体鉴别:
重放攻击
不重数
中间人攻击
安全:
网络层安全协议 IPsec
运输层安全协议
SSL/TLS SSL secure socket layer TLS transport layer security
这两个属于传输层协议,虽然在TCP之上,不仅仅针对HTTP
防火墙:
分组过滤路由器
应用网关/代理服务器
入侵系统检测 IDS
基于特征,基于异常
多媒体数据:
由于互联网是分组转发,传输得到的多媒体数据具有时延抖动
使用缓存队列边传输边播放
使用UDP减少时延,因为这些数据有丢失容忍的特点
流式存储多媒体 在线电影
流式实况多媒体 实时体育直播
流式交互多媒体 实时会议
实时流式协议RTSP:
一种带状态的带外协议(out of band protocol)
能实施控制播放/暂停
真正的流媒体传输方式不限(UDP, TCP, RTP)
IP电话:
可能需要电话网与IP网之间的转换
需要使用到的协议:
信令协议,用于找到被叫用户
传输协议,用于加解密,压缩解压缩数据

RTP协议与RTCP协议:UDP 传输与控制
默认5004和5005
有效载荷类型表明媒体类型
序号为递增的RTP分组序号
时间戳为发送时分组中数据的第一个字节的采样时间
同步源标识符:标识来源,多个RTP流可以同时复用到一个UDP中
RTCP:用于传送数据输送质量的信息报告,与RTP配合使用
信令协议:
1: H.323协议簇
2: SIP协议:
电话交谈使用RTP协议
路由分组发送的调度和管制:
调度:
默认是FIFO,缺点是不能区分时间敏感性分组和一般数据分组
优先级排队:优先发生优先级高的分组
公平排队(Fair Queuing): 每种类型设置一个队列,轮流发送所有队列的首元素,缺点是没有优先级只分
加权公平排队(Weighted Fair Queuing): 为不同类别的队列分配不同的服务时间
保证不同队列的数据率
管制:
平均速率
峰值速率
突发速率
漏桶管制器:
与加权公平调度相结合
无线局域网:
802.11 无限以太网的标准 星形拓扑
中心点叫AP(Access point) 在MAC层使用CSMA/CA协议,接入的设备称移动站
最小构件为基本服务集BSS, 类似于局域网
AP需要有一个不超过32字节的服务集标识符SSID 和一个通信信道
移动站和AP需要建立关联,关联后发送DHCP发现报文获取IP地址
建立关联是需要认证,加密反感有WEP, WPA, WPA2
移动自组网络
MAC层协议:
CSMA/CA 协议,保留了波载监听,去掉了碰撞检测
停止等待协议:链路层确认,发送一帧后需要等待收到对方的确认帧才能继续发送下一帧,和有线以太网不一样,其是可靠的

帧间间隔IFS


AB 间通讯要通过AP中继
ap和路由器间的通讯是以太网帧,必要的时候这两种帧需要转换:
R->AP2->C 分别使用以太网帧,802.11帧
无限个人网:
WPAN 802.15
蜂窝无线通信网:
2G: GSM GRPS EDGE
3G: CDMA
4G: LTE
WIRESHARK:
LG 0 为设备自带的 MAC(可以认为修改)
IG 0 为这是一个单播地址
抓出来的帧 不会带有CRC,已经被硬件检测后丢弃了

ARP:
广播:
发送的IP如果是广播地址,封装帧的时候目的mac写入的是FF:FF:FF:FF:FF:FF
如果MAC地址是广播地址,那么同一网络内的主机接收到后不会被过滤掉
在有交换机的情况下, 交换机看到mac地址为FF:FF:FF:FF:FF:FF 会发到所有接口上
ARP模式下,主机接受到广播的arp请求后,查看请求中的目的ip是否是自己,不是自己丢掉。
是的话:由于arp中包含了源的ip和mac,所以发送一个单播报文(正常情况下就是单播)
ARP:
arp 欺骗
icmp
ping
traceroute
tftp
HTTP1.1 缓存
Cache-control:
Cache-Control: no-store 客户端不得存储缓存
Cache-Control: no-cache 强制确认,客户端的缓存即使没过期也要发服务器验证(带上缓存的一些字段)
Cache-Control: private
Cache-Control: public
Cache-Control: must-revalidate 强制验证
客户端计算缓存寿命优先级:
Cache-contol: max-age=N
Expires与Date进行比较,看缓存是否有效
Date - Last-Modified 0.1 作为缓存时间
当缓存过期,或者强制确认时,会发服务器验证:
验证的时候请求头会使用If-None-Match或者if-Modified-Since判断是否过期,收到304(Not Modified) 后才使用缓存,否则服务器的返回body会带上最新内容
Etags:
一种强校验器,是资源的位移标识符,比如有的网页虽然url一样,但是语言不同,就有不同的etag
将缓存的etag放到If-None-Match中发送到服务器上,服务器检测是否一致,一致返回304
Last-Modified:
作为etag的备用方案,是弱校验器,只能精确到一秒,客户端可以将缓存的Last-Modified带上发送给服务器,资源更新才才返回200OK以及内容,否则返回304
Vary字段:
1: 客户端发送了包含accept-Language首部字段的请求后,如果源服务器返回的相应中带有vary: accept-language, 下一次用户再次请求,只有缓存中的accpet-language和请求中的acept-languae一致时才会使用缓存,否则像源服务器重新请求
2:用户发送了accept-encoidng并且服务器选择了一种算法压缩,在首部添加了content-encoding的话,在vary中还需要包含content-encoding
范围请求:
Range:
连接中断,客户端可以使用范围请求,指定部分范围:需要带有Range字段: Range: bytes=2-1024
服务器允许的话,返回的响应中要包含206 Partial Content状态码,以及Content-Range: bytes 0-1023/146515 类似的字段
Accept-Ranges:
服务器的响应用于告知是否支持范围请求,可以使用bytes,否则为none
状态响应码:
成功: 206 Partial Content
越界: 416 Requested Range Not Satisfied
不支持: 200 OK
多chunk报文: 使用boundary指定分界Content-Type: multipart/form-data; boundary=AaB03x`<br />—AaB03x<br />Content-Disposition: form-data; name=”submit-name”<br /> <br />Larry<br />—AaB03x<br />Content-Disposition: form-data; name=”files”; filename=”file1.txt”<br />Content-Type: text/plain<br /> <br />… contents of file1.txt …<br />—AaB03x—<br />Host: 字段<br />HTTP/1.1 必须要求该字段,否则返回400, 还可以指定端口,默认为80<br />指定的是虚拟主机,一个主机上可以有多个虚拟主机<br /> <br />Cookie:<br />会话状态管理<br />个性化设置<br /> <br />服务器:<br />Set-Cookie: cookie_name=cookie_value<br />客户端收到后,每次向服务器发送请求都会带上cookies<br />回话期cookie: 不需要指定expires/max-age, 浏览器关闭后就删除<br />持久性cookie: 需要设置 Expires: 如:<br />Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT;<br />Secure: 带上后该cookie只有被https加密后的请求才能发送给服务器<br />HttpOnly: 带上后,该cookie不能被js调用<br />Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly`
作用域: 表示该cookie可以在请求哪些url的时候被带上
默认只有该主机,不包括子域名
设置Domain字段后可以在设定的domain或者其子域名下
设置Path后可以在设定的path或者其子路径下
SameSite字段:
Set-Cookie: key=value; SameSite=Strict
None: 同站、跨站下继续发送cookie
strict: 只有同站(当前url和请求url一致)
Lax: 默认 导航到目标网站的get/a/link 点击后,会把目标网站的cookie带上。
所谓带不带cookie,都是值带上要发送请求的网站之前设置的cookie。
比如本来我在github上有cookie,如果github对该cookie设置了strict,我从其他网站上点击github的连接后,访问的时候,之前的github cookie就不会被带上了,我就处于未登录状态
http://www.ruanyifeng.com/blog/2019/09/cookie-samesite.html
csrf攻击:
在恶意攻击网站上设置了一个链接,是一个在要攻击网站上提交post的连接,用户点击后,发送请求,把cookie带上,恶意攻击就达到目的了。
一般要在form中加csrf-token,用来杜绝这种由第三方引导来的带cookie的请求
CORS:
不同域/协议/端口 发送的ajax请求就是跨域请求
对于可能产生副作用的请求(GET除外)的请求,浏览器必须先发起一个预检请求OPTIONS,获知服务端是否允许该跨域请求,运行后才发起实际的相关请求
对于:
get/post/head 且只含CORS安全首部字段,content-type只含text/plain, multipart/form-data application/x-www-form-urlencoded的简单请求
可以通过origin的方式发起正常请求,只要response中包含了access-control-allow-origin: /origin中设置的域名 ,浏览器就正常显示,但是如果不允许的话,浏览器会拦截该response
否则浏览器会首先发生预检请求OPTIONS(浏览器完成)
期中requested-method和headers字段是非安全的,所以需要预检Origin:http://foo.exampleAccess-Control-Request-Method: POSTAccess-Control-Request-Headers: X-PINGOTHER, Content-Type
成功后 服务器返回:Access-Control-Allow-Origin:http://foo.exampleAccess-Control-Allow-Methods: POST, GET, OPTIONSAccess-Control-Allow-Headers: X-PINGOTHER, Content-TypeAccess-Control-Max-Age: 86400
maxage超时后浏览器需要在发起一次预检
跨域请求还可以附带身份凭证: cookie (js的ajax选项开启)
对于附带了凭证的跨域请求,返回的allow_origin不能是
虽然跨域的request不需要前端做,但是返回的各种cors字段需要在后端完成
CSP:
用于防止XSS cross-site scripting attacks
headers:
General headers
Request headers
Reponse headers
Entity header: 包括body中的内容信息,比如 content-type content-length等
HTTP1.1
连接可复用
增加流水线操作,无需一个请求一个响应。
引入缓存
引入内容协商机制: 语言,编码,类型
Host字段,支持虚拟主机GET /en-US/docs/Glossary/Simple_header HTTP/1.1Host: developer.mozilla.orgUser-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
`Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/*;q=0.8<br />Accept-Language: en-US,en;q=0.5<br />Accept-Encoding: gzip, deflate, br<br />Referer: [https://developer.mozilla.org/en-US/docs/Glossary/Simple_header](https://developer.mozilla.org/en-US/docs/Glossary/Simple_header)<br /> <br />200 OK<br />Connection: Keep-Alive<br />Content-Encoding: gzip<br />Content-Type: text/html; charset=utf-8<br />Date: Wed, 20 Jul 2016 10:55:30 GMT<br />Etag: “547fa7e369ef56031dd3bff2ace9fc0832eb251a”<br />Keep-Alive: timeout=5, max=1000<br />Last-Modified: Tue, 19 Jul 2016 00:59:33 GMT<br />Server: Apache<br />Transfer-Encoding: chunked<br />Vary: Cookie, Accept-Encoding<br /> <br />(content)`
三种连接:
短连接,长连接,流水线
HTTP/1.X默认是长连接,复用一个tcp,一个请求,一个返回 即: Connection: keep-alive
HTTP/1.0默认是关闭
原因:
握手需要耗时,且多次新建TCP耗费资源
TCP需要预热,比如窗口大小,RTO等
流水线默认不被启用:
不能保证内容按顺序返回
HTTP/2中的multiplexing 取代了该方法
HTTP2
传输的内容不再是可读文本格式,而是二进制格式
链接复用,多个请求使用一个socket
压缩了header,http1中多个请求很多重复header
只是在HTTP/1.1和传输层中加了一层
数据流,消息,帧
帧是最小单位,不同数据流的帧可以交错,分为header帧,data帧(body)
消息是与request/ responce对应的一系列帧
数据流,一般拥有几条消息,比如request, responce. 具有唯一的标识符,并且流之间可以设置依赖,优先级关系。
不同数据流消息的header不会被重复发送,客户端服务端同时建立header的表,用于记录之前header中的字段,只有必要时(差异的部分)才会发送header字段。
使用huffman对首部字段进行压缩(HPACK算法)
客户端发起的流ID式奇数,服务端发回来的是偶数
多个消息/流交错传递
服务器可以对同一请求推送多个响应
GET和POST比较:
get用于获取资源,post用于传输实体
get的参数位于url中,有长度限制且只能包含ascii字符, post反之
get/head/options对服务器而言是安全的,不会改变服务器转态
http/head/put/delete是幂等的,多次与一次操作,客户端收到的response一样(相对而言),服务器的状态也一样
get/head是可缓存的 post/push/delete一般不能缓存
session和cookie的区别:
cookie 是浏览器所实际支持的,而session是服务器支持的,只要使用某种机制能够让一个用户的session id通过请求的方式发给服务器,服务器可以识别出来就行,比如可以通过在cookie设置session id,或者在url中。是一种抽象的概念。
HTTPS
WEB SOCKET
HSTS策略: 让浏览器下次自动请求https
Strict-Transport-Security: max-age=31536000
prefetch/prerender:
让浏览器预请求,或者请求后预渲染
使用localstorage手动管理缓存
长连接:必须使用content-length, 共浏览器判断该response有没有接受完毕,或者使用chunked 方式
