计算机网络
概览&&术语
网络协议:
计算机之间为了实现网络通信而达成的一种“约定”或者”规则“,有这种约定不同厂商的生产设备,以及不同操作系统组成的计算机之间,就可以实现通信
网卡MAC码:
全球惟一的一个固定组织来分配的,未经认证和授权的厂家无权生产网卡。
每块网卡都有一个固定的卡号,并且任何正规厂家生产的网卡上都直接标明了卡号.
一般为一组12位的16进制数。其中前6位代表网卡的生产厂商。后面的位数是设备号。
计算机网络协议体系:
OSI体系结构:应用层,表示层,会话层,传输层,网络层,数据链路层,物理层.
TCP/IP体系结构:应用层,传输层,网络层,数据链路层,物理层.
TCP/IP体系:
应用层:DHCP,HTTP,HTTPS,RTMP,P2P,DNS,GTP,RPC
传输层:UDP,TCP
网络层:ICMP,IP,OSPF,BGP,IPSec,GRE
链路层:ARP,VLAN,STP
物理层:网络跳线.
网络模型
URL输入到显示页面
DNS解析(将域名解析成IP地址)-->TCP链接(TCP三次握手)-->发送HTTP请求,-->服务器处理请求并返回HTTP报文-->浏览器解析渲染页面-->断开连接(TCP四次挥手).
URL:统一资源定位符
URL:统一资源定位符 scheme://host.domain:port/path/filename
协议 服务器域名/ip 服务器端口 资源路径 查询参数
Http:// www.baidu.com: 8080 /ncdcd/uc ?\_page=home&\_redirect=1#/home
scheme:定义因特网服务类型,常见的协议:http,https,ftp,file.
host:定义域名主机,http的默认主机是www.
domain: 定义因特网域名,如:baidu.com
port: 定义主机上的端口号,如http默认端口号是80
path:定义服务器上的路径.
filename:定义文档/资源的名称.
查询参数:
? 保留字,标识查询字符串的开始.
search=ruby 参数的键/值对
& 保留字 给查询字符串添加参数时使用
results=10 参数的键/值对
查询字符串有最大长度,查询字符串中使用的键/值对儿是显示在 URL 上的。
查询字符串中无法使用空格和特殊字符比如`&`它们必须用 URL 编码代替
DNS解析
DNS 是一个分布式数据库,把像http://www.google.com这样的域名翻译成 IP 地址,并将请求映射到远程服务器.
DNS 服务器集群是分层级的,没有任何一个单一的 DNS 服务器中包含所有数据。如果一个 DNS 服务器里没有一个请求需要的域名,这个 DNS 服务器就会把请求转发给这个集群上更上一层节点的 DNS 服务器。最终,这个域名会在某个 DNS 服务器上的数据库里被发现,然后它对应的 IP 地址所代表的设备就会来接受这个请求。
通过在浏览器地址栏里敲 IP 地址也能访问网站。
浏览器在使用HTTPS传输数据的流程:
总体来说,https属于混合加密,使用非对称秘钥加密密文通信的对称秘钥,使用对称秘钥进行密文通信,保证了通信的效率。
首先客户端通过URL访问服务器建立SSL连接。
服务端收到客户端请求后,会将网站支持的证书信息(证书中包含公钥)传送一份给客户端。
客户端的服务器开始协商SSL连接的安全等级,也就是信息加密的等级。客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站。
服务器利用自己的私钥解密出会话密钥。服务器利用会话密钥加密与客户端之间的通信。
TCP的三次握手:
先由客户端(浏览器)发送一个请求到服务器.服务器发送请求数据到客户端,客户端发送信息服务端.
发送HTTP请求:
TCP三次握手之后,开始发生HTTP请求报文,请求报文由请求行,请求头.请求体组成.
服务器发送请求并返回HTTP报文:
略
浏览器解析渲染页面:
HTML与CSS同时解析生成HTML结构树和CSS结构树,两树合合并成渲染树,渲染树计算好信息,绘制页面.
断开链接:
当数据传送完毕,需要断开TCP链接,发送四次挥手.
HTTP协议
比如分析 HTTPS,我会用 Wireshark 从建立 TCP 连接时就开始抓包,从二进制最底层来分析里面的 Record、Cipher Suite、Extension,讲 ECDHE、AES、SHA384,再画出详细的流程图,做到“一览无余”。
在互联网世界里,HTTP 通常跑在 TCP/IP 协议栈之上,依靠 IP 协议实现寻址和路由、TCP协议实现可靠数据传输、DNS 协议实现域名查找、SSL/TLS 协议实现安全通信。此外,还有一些协议依赖于 HTTP,例如 WebSocket、HTTPDNS 等。这些协议相互交织,构成了一个协议网,而 HTTP 则处于中心地位。
HTTP历史:
1. HTTP 协议始于三十年前蒂姆·伯纳斯 - 李的一篇论文;
2. HTTP/0.9 是个简单的文本协议,只能获取文本资源;
3. HTTP/1.0 确立了大部分现在使用的技术,但它不是正式标准;
4. HTTP/1.1 是目前互联网上使用最广泛的协议,功能也非常完善;
5. HTTP/2 基于 Google 的 SPDY 协议,注重性能改善,但还未普及;
6. HTTP/3 基于 Google 的 QUIC 协议,是将来的发展方向。
HTTP协议:
超文本传输协议,从客户端发出请求到服务器并等待响应。
关于协议:HTTP 是一个用在计算机世界里的协议。它使用计算机能够理解的语言确立了一种计算机之间交流通信的规范,以及相关的各种控制和错误处理方式。
关于传输:HTTP 是一个在计算机世界里专门用来在两点之间传输数据的约定和规范。
关于超文本:所谓“超文本”,就是“超越了普通文本的文本”,它是文字、图片、音频和视频等的混合体,最关键的是含有“超链接”,能够从一个“超文本”跳跃到另一个“超文本”,形成复杂的非线性、网状的结构关系。
无状态协议.使开发去模拟web应用有状态的体验.两点不局限在浏览器到服务器,也可以是服务器到服务器,既把服务器做客户端.
HTTP/1.1版本=HTTP+SSL/TLS,通过 SSL证书来验证服务器的身份,并为浏览器和服务器之间的通信进行加密。
HTTP 是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范”。
HTTP原理:
基于TCP/IP通信协议来传递数据的协议,传输的数据类型为HTML文件,、图片文件, 查询结果等.
HTTP特点:
支持客户端/服务端模式,也是一种请求/响应模式的协议.
简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。
灵活:HTTP允许传输任意类型的数据对象。传输的类型由Content-Type加以标记。
无状态:无状态是指协议对于事务处理没有记忆,后续处理需要前面的信息,则必须重传(浏览器cookie可以解决这个问题)。
HTTP缺点:
请求信息明文传输,容易被窃听截取.
数据的完整性未校验,容易被篡改.
没有验证对方身份,存在冒充危险。
HTTPS:
在HTTP的基础上增加SSL/TLS协议安全协议,这些协议由加密算法和哈希算法组成。TLS协议是在SSL的基础上发展起来的更安全的协议.
HTTPS缺点:
HTTPS协议加密中多次握手,导致页面的加载时间延长近50%;
HTTPS连接缓存不如HTTP高效,会增加数据开销和功耗;
申请SSL证书需要钱,功能越强大的证书费用越高。SSL涉及到的安全算法会消耗 CPU 资源,对服务器资源消耗较大。
HTTP和HTTPS的区别:
HTTPS是HTTP协议的安全版本,HTTP协议的数据传输是明文的,是不安全的,
HTTPS使用了SSL/TLS协议进行了加密处理。默认端口不一样,http是80,https是443。
https协议需要到CA申请证书,一般需要花钱获取,http不需要。
SSL
SSL 的全称是“Secure Socket Layer”,由网景公司发明,当发展到 3.0 时被标准化,改名为 TLS,即“Transport Layer Security”,但由于历史的原因还是有很多人称之为SSL/TLS,或者直接简称为 SSL。
SSL 使用了许多密码学最先进的研究成果,综合了对称加密、非对称加密、摘要算法、数字签名、数字证书等技术,能够在不安全的环境中为通信的双方创建出一个秘密的、安全的传输通道,为 HTTP 套上一副坚固的盔甲。
HTTP报文组成:
请求报文构成:请求行:包括请求方法、URL、协议/版本 。请求头(Request Header)。请求正文
响应报文构成:状态行 响应头 响应正文
常见响应头字段:
User-Agent:告知服务器客户端的相关信息,比如浏览器的类型、版本等。
Accept-Encoding:告知服务器,客户端支持的压缩格式。
Cookie: 一般都是通过Cookie信息头封装在请求的信息头部分。
Content-Type:用来告知服务器,所发送的请求主体的数据类型(数据组织格式)。如果是POST方法,则建议一定指定该信息头。
常见请求方法
GET:获取资源,请求指定的页面信息,并返回实体主体。
POST:向服务器创建资源,提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立,或者对已有资源的修改。
HEAD:类似于get请求,只不过返回的响应中没有具体的内容,只获取报头。
PUT:从客户端向服务器传送的数据取代指定的文档的内容。
DELETE:请求服务器删除指定的资源。
请求头部
请求头部提供更多关于服务器和要获取的资源的信息。一些有用的请求头部是:
字段名 | 描述 | 举例 |
---|---|---|
Host | 服务器域名 | Host:www.reddit.com |
Accept-Language | 可接受的语言 | Accept-Language: en-US,en;q=0.8 |
User-Agent | 一个标识客户端的字符串 | User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/38.0.2125.101 Safari/537.36 |
Connection | 客户端连接的类型 | Connection: keep-alive |
HTTP响应
服务器返回的原始数据就是所谓的响应
状态码+响应头部
响应状态码
访问一个网页时,浏览器会向web服务器发出请求。此网页所在的服务器会返回一个包含HTTP状态码的信息头用以响应浏览器的请求。
状态码分类:
1XX- 信息型,服务器收到请求,需要请求者继续操作。
2XX- 成功型,请求成功收到,理解并处理。
3XX – 重定向,需要进一步的操作以完成请求。
4XX – 客户端错误,请求包含语法错误或无法完成请求。
5XX – 服务器错误,服务器在处理请求的过程中发生了错误。
常见状态码:
200 OK – 客户端请求成功 301 – 资源(网页等)被永久转移到其它URL 302 – 临时跳转
400 Bad Request – 客户端请求有语法错误,不能被服务器所理解
401 Unauthorized – 请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
404 – 请求资源不存在,可能是输入了错误的URL 500 – 服务器内部发生了不可预期的错误
503 Server Unavailable – 服务器当前不能处理客户端的请求,一段时间后可能恢复正常。
响应头部
头部名称 | 描述 | 举例 |
---|---|---|
Content-Encoding | 数据的编码类型 | Content-Encoding: gzip |
Server | 服务器的名称 | Server:thin 1.5.0 codename Knife |
Location | 通知客户端新的资源位置 | Location: http://www.github.com/login |
Content-Type | 响应数据的类型 | Content-Type:text/html; charset=UTF-8 |
有状态的WEB应用
HTTP 协议是无状态的。换句话说,在你的各次请求之间,服务器是不会保留你的 “状态” 信息。
每一次请求都被认为是一次全新的请求,不同的请求之间并不知道对方的存在.这种” 无状态性 “使得 HTTP 和互联网都是 “去中心化” 的,不会轻易被人掌控。 但也是因为这种属性,使得 web 开发者在开发有状态的 web 应用时十分的困难。主要技术手段有session(会话),Cookies,异步javascript调用(AJAX).
Session
Cookies
AJAX
AJAX 请求就像是普通请求:发送到服务器的请求依然跟普通请求一样有着一个 HTTP 请求该有的所有组成部分,并且服务器处理 AJAX 请求的方法跟处理普通请求也是一样的。唯一不同就是,不是通过浏览器刷新来处理响应,而通常由客户端的一些 javascript 代码来处理。
安全性
同源策略同源策略( Same-origin policy )
它允许来自同一站点的资源进行互相访问而不受限制,但是会阻止其他不同站点对文档/资源的访问。换句话说它可以阻止另一个站点通过脚本来操纵本站点的文档。同源的文档必须有相同的协议,主机名和端口号。举个例子,
同源策略涉及的是访问文件内容,而不是链接,你可以随意链接到任何 URL。
跨域资源共享技术 CORS
CORS 是一种机制,允许我们绕过同源策略,从一个域名向另一个域名的资源发起请求。CORS 的原理是添加新的 HTTP 头部,来对一些域名授权,那这些域名就可以发起对本页面资源的请求。
会话劫持(Session Hijacking)
会话在维持 HTTP 的状态上扮演着重要的角色。我们也知道会话 id 作为一个唯一的令牌来唯一标识一个会话。通常,会话 id 是作为 cookie 存储在计算机上的一个随机字符串. 会话 id 随着每一个到服务器的请求被送往服务器用于唯一标识这个会话。
攻击者拿到了这个会话 id ,他就会跟用户共享这一个会话,同时也就能访问这个 web 应用了。
会话劫持的对策
* 一个比较流行的会话劫持防范措施是重置会话。也就是对于一个用户认证系统来说,一次成功的登录包括验证旧的会话 id 和生成一个新的会话 id 。完成此步骤后,在下一个请求里,会要求受害者进行身份验证。然后会话 id 就会改变,这样攻击者就无法访问到这个会话了。很多网站都采取这种办法,当用户在进行敏感操作的时候保证用户身份的正确性,比如给信用卡充值或者删除账户的时候。
* 另一个很有用的方法是给会话设置过期时间。那些不会过期的会话给了攻击者太多的时间去伪装成一个合法用户。如果设置了过期时间,比如 30 分钟,这样一来攻击者就不会那么从容的进行攻击了。
* 最后,其实我们已经讲过了,另一个办法就是整站使用 HTTPS 把攻击者能得到会话 id 的可能性降至最低。
跨站脚本攻击 (XSS)
当你允许用户输入的 HTML 和 javascript 在你自己的网站上直接显示的时候,就有可能遭受这种攻击。如输入评论.
跨站脚本攻击的解决方案
* 阻止此类攻击的一个办法就是总是对用户输入的内容做无害处理。消除有问题的输入,比如\`\`标签,或者使用一个更安全的输入格式,比如 Markdown,这样就可以阻止 HTML 和 javascript 同时出现在用户的输入里。
* 第二个办法就是在显示之前转义用户输入的所有数据.如果你需要用户能够输入 HTML 和 javascript 代码,那么当你显示这些输入内容的时候要确保它们被正确转义,这样浏览器就不会把它们当做代码给执行了。
杂症
`
URI和URL的区别:
HTTP使用统一资源标识符URI来传输数据和建立连接。URI: 统一资源标识符。URL: 统一资源定位符。
URI 是用来标示一个具体的资源,我们可以通过 URI 知道一个资源是什么,是一个抽象的相对概念。
URL 则是用来定位具体的资源的,标示了一个具体的资源位置。属于URI的一个子集,算是URI在的具体实现方式互联网上的每个文件都有一个唯一的URL。
post和get的区别:
都包含请求头请求行,post多了请求body。
get多用来查询,请求参数放在url中,不会对服务器上的内容产生作用。post用来提交,如把账号密码放入body中。
GET是直接添加到URL后面的,直接就可以在URL中看到内容,而POST是放在报文内部的,用户无法直接看到。
GET提交的数据长度是有限制的,因为URL长度有限制,具体的长度限制视浏览器而定。而POST没有。
安全性(幂等性),安全的方法属于幂等的,get多次请求,服务端状态不会改变,属于幂等,POST执行多次,每次都会改变服务端状态,不具备幂等性。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。