计算机网络
路由协议
NAT
静态NAT 每个私有IP对应一个公有
动态NAT 地址池 多个私有IP地址共享少量的公有IP
NAPT(PAT) 多个私有IP地址共享少量的公有IP的不同端口号
easy IP 没有地址池 使用接口地址 不固定公网IP
NAT server 静态的PAT 端口一一对应
OSPF和RIP的区别
RIP(适合小型网络)
距离向量路由协议 16为不可达
基于跳数选择最优路径
每隔30s向邻居广播自己的整个RIP路由表
OSPF(IP层)
链路状态路由协议
基于链路开销选择最优路径
触发更新或每隔30分钟向邻接路由器发送链路状态信息的摘要,增量更新机制
IGRP-内部网关路由协议
IGRP(Interior Gateway Routing Protocol,内部网关路由协议)是一种动态距离向量路由协议,它是Cisco公司在20世纪80年代中期设计的,是Cisco专用路由协议。目前在Cisco高版本的IOS已经对IGRP不提供支持,完全支持EIGEP路由协议。
它的特征如下:
(1)它是距离向量路由协议。
(2)IGRP的度量值可以基于五个要素:带宽、延迟、负载、可靠性、MTU,默认只使用带宽和延时。
(3)采用广播方式(255.255.255.255)进行路由更新。
(4)默认情况下,IGRP每90秒发送一次路由更新广播,在3个更新周期内(即270秒),没有接收到路由条目的更新,则宣布路由不可访问。在7个更新周期后(即630秒),路由器从路由表中清除路由。
(5)IGRP路由协议的管理距离为100。
(6) 它是有类别的路由协议。
(7)为了避免路由环路,IGRP也受跳数的限制,支持最大跳数为255,默认为100跳。
(8)IGRP支持等价和非等价负载均衡。
BGP外部网关路由协议
动态路由协议可以按照工作范围分为IGP以及EGP。IGP工作在同一个AS内,主要用来发现和计算路由,为AS内提供路由信息的交换;而EGP工作在AS与AS之间,在AS间提供无环路的路由信息交换,BGP则是EGP的一种。
BGP是一种增强的路径矢量路由协议,同时BGP是拥有丰富的策略控制技术的外部网关协议。多运行于AS与AS之间。
HTTP协议
请求包:请求行 请求头 请求体
响应包:状态行 响应头 响应体
方法
- get 用于请求已被URL识别的资源 从服务器获取文档
- post 用于向服务器传输数据,例如提交表单、文件上传
OPTIONS 查询相应URL支持的HTTP方法
HEAD 获得报文首部,与get方法类似,只是不返回报文主体,一般用于验证URI是否有效 只从服务器获取文档的首部
PUT 上传文件,报文主体中包含文件内容,保存到对应URL位置 将请求的主体部分存储在服务器上
- DELETE 删除文件,与PUT方法相反,删除对应URL位置的文件 从服务器上删除一份文档
- TRACE 用于诊断,响应中返回收到请求消息的具体内容 对可能经过代理服务器传送到服务器上去的报文进行追踪
- CONNECT 要求用隧道协议连接代理
状态码
- 100:表示收到请求消息头,客户端应继续发送主体
- 200:请求被正常处理
- 201:PUT请求返回这个状态码,表示请求已成功提交
- 204:请求被受理但没有资源可以返回
- 206:客户端只是请求资源的一部分,服务器只对请求的部分资源执行get方法,相应报文中通过Content-Range指定范围的资源。
- 301:永久性重定向
- 302:临时重定向
- 303:与302状态码有相似功能,只是它希望客户端在请求一个URI的时候,能通过get方法重定向到另一个URI上
- 304:发送附带条件的请求时,条件不满足时返回,指示浏览器使用缓存中所请求资源的副本
- 307:临时重定向,与302类似,只是强制要求使用post方法
- 400:请求报文语法有误,服务器无法识别
- 401:请求需要认证
- 403:请求的对应资源禁止被访问
- 404:服务器无法找到对应资源
- 405:不支持请求中使用的请求方法
- 413:请求主体过长,服务器无法处理 (探查缓冲区溢出时会有)
- 414:请求URL过长,服务器无法处理
- 500:服务器内部错误
- 503:服务器正忙,用来说明服务器现在无法为请求提供服务,但将来可以 (服务器负载过大)
重定向和转发的区别
重定向
两次请求 不共享数据
重定向显示新的地址,可以跳转到任意的URL
转发
一次请求 共享数据
转发请求次数只有一次,也就是与服务器的交互只有一次
转发的数据不会丢失
get和post的区别
- get 是获取数据,post 是修改数据
- get 把请求的数据放在url上,以?分割 URL 和传输数据,参数之间以&相连,所以不太安全。而 post 把数据放在 HTTP 的包体内(requrest body)
- get 提交的数据最大是 2k( 限制实际上取决于浏览器), post 理论上没有限制。
- get 产生一个 TCP 数据包,浏览器会把 http header 和 data 一并发送出去,服务器响应 200(返回数据); post 产生两个 TCP 数据包,浏览器先发送 header,服务器响应 100 continue,浏览器再发送 data,服务器响应 200 ok(返回数据)。
- get 请求会被浏览器主动缓存,而 post 不会,除非手动设置。
- get 是幂等的,而 post 不是幂等的
Cookies 和 session 区别
Cookie 和 Session 都是客户端与服务器之间保持状态的解决方案
存储的位置不同,cookie:存放在客户端,session:存放在服务端。Session 存储的数据比较安全
存储的数据类型不同
两者都是 key-value 的结构,但针对 value 的类型是有差异的
cookie:value 只能是字符串类型,session:value 是 Object 类型
存储的数据大小限制不同
cookie:大小受浏览器的限制,很多是是 4K 的大小, session:理论上受当前内存的限制
生命周期的控制
cookie 的生命周期当浏览器关闭的时候,就消亡了
生命周期(以20分钟为例)
(1) cookie的生命周期是累计的,从创建时,就开始计时,20分钟后,cookie生命周期结束,
(2) session的生命周期是间隔的,从创建时,开始计时如在20分钟,没有访问session,那么session生命周期被销毁
但是,如果在20分钟内(如在第19分钟时)访问过session,那么,将重新计算session的生命周期
(3) 关机会造成session生命周期的结束,但是对cookie没有影响
访问范围
cookie为多个用户浏览器共享
session为一个用户浏览器独享
HTTP请求访问流程
- 域名解析
- 发起TCP的3次握手
- 建立TCP连接后发起http请求
- 服务器响应http请求,浏览器得到html代码
- 浏览器解析html代码,并请求html代码中的资源(如js、css、图片等)
- 浏览器对页面进行渲染呈现给用户
HTTP和HTTPS
HTTP 协议传输的数据都是未加密的,也就是明文的,因此使用 HTTP 协议传输隐私信息非不安全, HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议, 要比 http 协议安全。
https 协议需要到 ca 申请证书,一般免费证书较少,因而需要一定费用。
http 和 https 使用的是完全不同的连接方式,用的端口也不一样,前者是 80,后者是 443。
HTTPS连接建立过程
- 客户端发送支持的加密协议及版本,
SSL
、TLS
(传输层安全性协议:SSL
是TLS
的前身) 服务器从中筛选合适的加密协议
服务器端返回证书,证书中有公钥
- 客户端使用根证书验证证书合法性
客户端生成对称密钥,通过证书中的公钥加密,发送到服务端
服务端使用私钥解密,获取对称密钥,使用对称密钥加密数据
客户端解密数据,
SSL
加密通信建立,开始通信
https是如何保证数据传输的安全
客户端向服务器端发起SSL连接请求;
服务器把携带公钥的证书发送给客户端,且服务器端保存着唯一的私钥
- 客户端用公钥对双方通信的对称秘钥进行加密,并发送给服务器端
- 服务器利用自己唯一的私钥对客户端发来的对称秘钥进行解密,
- 进行数据传输,服务器和客户端双方用公有的相同的对称秘钥对数据进行加密解密,可以保证在数据收发过程中的安全,即使第三方获得数据包,也无法对其进行加密,解密和篡改。
Referer
Referer
请求头包含了当前请求页面的来源页面的地址,即表示当前页面是通过此来源页面里的链接进入的。
服务端一般使用 Referer
请求头识别访问来源,可能会以此进行统计分析、日志记录以及缓存优化等。
token
token是什么?
为了安全性,一般需要再用户登录成功之后才能发送其他请求。
token携带在请求头中,只有登录请求不需要携带token,登录成功后把token返回给前端,以后的请求前端需要携带这个token来才能请求成功!否则请求被拦截
为什么要用它?
token的目的是减轻服务器压力,减少数据库请求。
如果没有token做一层拦截的,每次请求都会去请求数据库,如果恶意请求,很可能击垮数据库
OSI七层
物理层:利用传输介质为数据链路层提供物理连接,实现比特流的透明传输。
数据链路层:接收来自物理层的bit流形式的数据,并封装成帧,传送到上一层。
网络层:将网络地址解析成对应的物理地址,并通过路由选择算法为分组通过通信子网选择最适当的路径。
传输层:在源端与目的端之间提供可靠的数据传输
会话层:负责在网络中的两节点之间建立、维持和终止通信
表示层:处理用户信息的表示问题,数据的编码,压缩和解压缩,数据的加密和解密
应用层:为用户的应用进程提供网络通信服务
IPsec 网络层
防火墙在应用层
SMTP
SMTP是建立在FTP文件传输服务上的一种邮件服务,主要用于系统之间的邮件信息传递,并提供有关来信的通知。
SMTP使用TCP端口25
DNS
客户端进行解析时,解析顺序是:先缓存,再查host文件,再查主域名服务器(如果主域名服务器故障就查辅助域名服务器),主域名服务器查不到但是配置了转发器就查转发器,最后找根域名服务器再向下一级查询。
本地缓存——Hosts 文件——DNS服务器
DNS不用做账号爆破
ICMP状态码
3 - Destination Unreachable(目的不可达)
5 - Redirect(重定向)
11 - Time Exceeded(时间超过)
DHCP
DHCP服务器必需具备这些条件:
- 具有静态配置的IP地址
- 具有作用范围的有效IP地址范围
- 配置子网掩码
MAC地址
MAC地址由48位二进制数(6个字节)组成,通常表示为12个十六进制数,格式为XX-XX-XX-XX-XX-XX 。
如:00-16-EA-AE-3C-40就是一个MAC地址,
供应商代码:前3个字节,16进制数00-16-EA代表网络硬件制造商的编号,它由IEEE分配。
序列号:后3个字节,16进制数AE-3C-40代表该制造商所制造的某个网络产品(如网卡)的系列号。
只要不更改自己的MAC地址,MAC地址在世界是唯一的。
ARP协议
地址解析协议,即 ARP(Address Resolution Protocol),是根据 IP 地址获取物理MAC地址的一个TCP/IP 协议。
ARP 高速缓存(即 ARP 表)是 ARP 地址解析协议能够高效运行的关键 。
ARP 协议工作原理:
每个主机都会在自己的ARP缓冲区中建立一个ARP列表,以表示 IP 地址和 MAC地址之间的对应关系。
新主机(网络接口)加入网络时(也可能只是 mac 地址发生变化,接口重启等),会发送 免费 ARP 报文把自己 IP 地址与 Mac 地址的映射关系广播给其他主机。
网络上的主机接收到免费 ARP 报文时,会更新自己的 ARP 缓冲区。将新的映射关系更新到自己的 ARP 表中。
某个主机需要发送报文时,首先检查 ARP 列表中是否有对应 IP 地址的目的主机的MAC地址,如果有,则直接发送数据,如果没有,就向本网段的所有主机发送ARP 数据包,该数据包包括的内容有:源主机 IP地址,源主机 MAC 地址,目的主机的IP 地址等。
当本网络的所有主机收到该 ARP数据包时:
(A)首先检查数据包中的 IP 地址是否是自己的IP 地址,如果不是,则忽略该数据包。
(B)如果是,则首先从数据包中取出源主机的 IP 和 MAC 地址写入到 ARP 列表中,如果已经存在,则覆盖。
(C) 然后将自己的 MAC 地址写入 ARP 响应包中,告诉源主机自己是它想要找的 MAC 地址。
源主机收到 ARP 响应包后。将目的主机的IP 和 MAC 地址写入 ARP 列表,并利用此信息发送数据。如果源主机一直没有收到 ARP响应数据包,表示 ARP 查询失败。
VLAN
VLAN:全名为virurl local area network 虚拟局域网。
一般工作在二层和三层,在逻辑上划分了设备和用户。这些设备可以根据VLAN,不受物理位置的限制,功能,部门,应用的情况下组织起来。
VLAN的主要作用就是分割广播域
- 物理分割
- 逻辑分割
VLAN的优势有:
- 限制广播域
- 增强局域网的安全性
- 提高网络的健壮性
- 灵活构建虚拟工作组
交换机接口
Access接口:交换机上用来连接用户主机的接口,它只能连接接入链路(Access Link)。
Trunk接口:交换机上用来和其他交换机连接的接口,它只能连接干道链路(Trunk Link)。
除此之外,还有一种接口叫Hybrid接口,是交换机上既可以连接用户主机,又可以连接其他交换机的接口。
Hybrid接口既可以连接接入链路又可以连接干道链路。
注:Hybrid接口和Trunk接口在接收数据时,处理方法是一样的。唯一不同之处在于:发送数据时,Hybrid接口可以允许多个VLAN的报文发送时不打标签,而Trunk接口只允许缺省VLAN的报文发送时不打标签。
TCP和UDP的区别
TCP 面向连接(如打电话要先拨号建立连接)提供可靠的服务;UDP 是无连接的,即发送数据之前不需要建立连接;UDP 尽最大努力交付,即不保证可靠交付。(由于 UDP 无需建立连接,因此 UDP 不会引入建立连接的时延,TCP 需要在端系统中维护连接状态,比如接受和发送缓存,拥塞控制,序号与确认号的参数等,故 TCP 会比 UDP 慢)
UDP 具有较好的实时性,工作效率比 TCP 高,适用于对高速传输和实时性有较高的通信或广播通信。
每一条 TCP 连接只能是一对一的;UDP 支持一对一,一对多,多对一和多对多的交互通信
UDP 分组首部开销小,只有 8 个字节,TCP 首部开销 20 字节。
TCP 面向字节流,实际上是 TCP 把数据看成一连串无结构的字节流;
UDP 是面向报文的(一次交付一个完整的报文,报文不可分割,报文是 UDP 数据报处理的最小单位)。
UDP 适合一次性传输较小数据的网络应用,如 DNS,SNMP 等
TCP 如何保证可靠传输?
- 三次握手。
- 将数据截断为合理的长度。应用数据被分割成 TCP 认为最适合发送的数据块(按字节编号,合理分片)
- 超时重发。当 TCP 发出一个段后,它启动一个定时器,如果不能及时收到一个确认就重发
- 确认应答。对于收到的请求,给出确认响应
- 校验和。校验出包有错,丢弃报文段,不给出响应
- 序列号。对失序数据进行重新排序,然后才交给应用层
- 丢弃重复数据。
- 流量控制。TCP 连接的每一方都有固定大小的缓冲空间。TCP 的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止传输较快主机致使较慢主机的缓冲区溢出。
- 拥塞控制。当网络拥塞时,减少数据的发送。
三次握手
刚开始客户端处于 Closed 的状态,服务端处于 Listen 状态。
第一次握手:客户端给服务端发一个 SYN 报文,并指明客户端的初始化序列号 ISN(c)。此时客户端处于 SYN_Send 状态。
第二次握手:服务器收到客户端的 SYN 报文之后,会以自己的 SYN 报文作为应答,并且也是指定了自己的初始化序列号 ISN(s)。同时会把客户端的 ISN + 1 作为 ACK 的值,表示自己已经收到了客户端的 SYN,此时服务器处于 SYN_REVD 的状态。
第三次握手:客户端收到 SYN 报文之后,会发送一个 ACK 报文,当然,也是一样把服务器的 ISN + 1 作为 ACK 的值表示已经收到了服务端的 SYN 报文,此时客户端处于 establised 状态。 服务器收到 ACK 报文之后,也处于 establised 状态,此时,双方已建立起了连接
三次握手的作用
确认双方的接受能力、发送能力是否正常。
指定自己的初始化序列号,为后面的可靠传送做准备。
如果是 HTTPS 协议的话,三次握手这个过程,还会进行数字证书的验证以及加密密钥的生成。
①(ISN)是固定的吗 三次握手的一个重要功能是客户端和服务端交换 ISN(Initial Sequence Number),以便让对方知道接下来接收数据的时候如何按序列号组装数据。 如果 ISN 是固定的,攻击者很容易猜出后续的确认号,因此 ISN 是动态生成的。
②什么是半连接队列 服务器第一次收到客户端的 SYN 之后,就会处于 SYN_RCVD 状态,此时双方还没有完全建立其连接,服务器会把此种状态下请求连接放在一个队列里,我们把这种队列称之为半连接队列。
全连接队列,就是已经完成三次握手,建立起连接的就会放在全连接队列中。如果队列满了就有可能会出现丢包现象。
关于SYN-ACK 重传次数的问题: 服务器发送完SYN-ACK包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传。如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。 注意,每次重传等待的时间不一定相同,一般会是指数增长,例如间隔时间为 1s,2s,4s,8s......
③第三次握手的时候,是可以携带数据的。第一次、第二次握手不可以携带数据,而第三次握手是可以携带数据的。 为什么这样呢?假如第一次握手可以携带数据的话,如果有人要恶意攻击服务器,那他每次都在第一次握手中的 SYN 报文中放入大量的数据。 因为攻击者根本就不理服务器的接收、发送能力是否正常,然后疯狂着重复发 SYN 报文的话,这会让服务器花费很多时间、内存空间来接收这些报文。 一个简单的原因就是会让服务器更加容易受到攻击了。 而对于第三次的话,此时客户端已经处于 established 状态,客户端已经建立连接,并且也已经知道服务器的接收、发送能力是正常的了,所以能携带数据。
四次挥手
刚开始双方都处于 establised 状态,假如是客户端先发起关闭请求,则:
第一次挥手:客户端发送一个 FIN 报文,报文中会指定一个序列号。此时客户端处于 FIN_WAIT1 状态。
第二次挥手:服务端收到 FIN 之后,会发送 ACK 报文,且把客户端的序列号值 +1 作为 ACK 报文的序列号值,表明已经收到客户端的报文了,此时服务端处于 CLOSE_WAIT 状态。
第三次挥手:如果服务端也想断开连接了,和客户端的第一次挥手一样,发给 FIN 报文,且指定一个序列号。此时服务端处于 LAST_ACK 的状态。
第四次挥手:客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答且把服务端的序列号值 +1 作为自己 ACK 报文的序列号值,此时客户端处于 TIME_WAIT 状态。 需要过一阵子以确保服务端收到自己的 ACK 报文之后才会进入 CLOSED 状态
服务端收到 ACK 报文之后,就处于关闭连接了,处于 CLOSED 状态。
这里特别需要注意的是 TIME_WAIT 这个状态,为什么客户端发送 ACK 之后不直接关闭,而是要等一阵子才关闭?
因为要确保服务器是否已经收到了ACK 报文,如果没有收到的话,服务器会重新发 FIN 报文给客户端
客户端再次收到 ACK 报文之后,就知道之前的 ACK 报文丢失了,然后再次发送 ACK 报文。
TIME_WAIT 持续的时间至少是一个报文的来回时间。
一般会设置一个计时,如果过了这个计时没有再次收到 FIN 报文,则代表对方成功,就是 ACK 报文,此时处于 CLOSED 状态。
每个状态所包含的含义
LISTEN:侦听来自远方 TCP 端口的连接请求。
SYN-SENT:在发送连接请求后等待匹配的连接请求。
SYN-RECEIVED:在收到和发送一个连接请求后等待对连接请求的确认。
ESTABLISHED:代表一个打开的连接,数据可以传送给用户。
FIN-WAIT-1:等待远程 TCP 的连接中断请求,或先前的连接中断请求的确认。
FIN-WAIT-2:从远程 TCP 等待连接中断请求。
CLOSE-WAIT:等待从本地用户发来的连接中断请求。
CLOSING:等待远程 TCP 对连接中断的确认。
LAST-ACK:等待原来发向远程 TCP 的连接中断请求的确认。
TIME-WAIT:等待足够的时间以确保远程 TCP 接收到连接中断请求的确认。
CLOSED:没有任何连接状态。