计算机网络
计算机网络体系结构
1. 五层协议
- 应用层
- 传输层
- 网络层
- 链路层
- 物理层
在向下的过程中,需要添加下层协议所需要的首部或者尾部,而在向上的过程中不断拆开首部和尾部。
2. ISO 七层模型
**表示层:**数据压缩、加密以及数据描述。这使得应用程序不必担心在各台主机中表示/存储的内部格式(二进制、ASCII,比如乱码)不同的问题。
**会话层:**建立会话,如session认证、断点续传。通信的应用程序之间建立、维护和释放面向用户的连接。通信的应用程序之间建立会话,需要传输层建立1个或多个连接。
一. 应用层 (Http)
1. URL、URI、URN
-
URI(Uniform Resource Identifier,统一资源标识符)。web服务器资源的名字,例如: index.html
-
URL(Uniform Resource Locator,统一资源定位符)
-
URN(Uniform Resource Name,统一资源名称),例如 urn:isbn:0-486-27557-4。
目前 WEB 只有 URL 比较流行,所以见到的基本都是 URL。
2. Http的请求报文和响应报文
(1)请求报文
(2) 响应报文
(3)Http 请求方法
方法 | 描述 |
---|---|
GET | 获取资源,并返回实体主体 |
HEAD | 类似GET方法,但不返回报文实体主体部分,用于确认URL的有效性、资源更新的时间等 |
POST | 传输实体主体,向指定资源提交数据进行处理请求 |
PUT | 上传文件,不带验证机制,存在安全性问题,一般不使用该方法; 完全替代原始资源 |
PATCH | 对资源进行部分修改 |
DELETE | 删除文件,与 PUT 功能相反,并且同样不带验证机制 |
OPTIONS | 查询指定的 URL 能够支持的方法 |
CONNECT | 要求在与代理服务器通信时建立隧道 |
TRACE | 追踪路径,服务器会将通信路径返回给客户端 |
GET 和 POST 的区别
- GET把参数包含在 UR L中,POST通过request body传递参数;
- GET请求只能进行url编码,而POST支持多种编码方式;
- GET请求会被浏览器主动cache,而POST不会,除非手动设置;
- GET请求在URL中传送的参数是有长度限制的,不能大于2KB,而POSTPOST传送的数据量较大,一般被默认为不受限制;
- GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。如果没有加密,他们安全级别都是一样的,随便一个监听器都可以把所有的数据监听到;
- GET和POST本质上就是TCP链接,并无差别。但是由于HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。
- GET产生一个TCP数据包;POST产生两个TCP数据包。
####(4)HTTP 状态码
|状态码|类别|原因短语|例子|
|:–?:–?:–?:–?]
|1XX|信息性状态码|接收的请求正在处理|100 Continue|
|2XX|成功状态码|请求正常处理完毕|200 OK; 204 No Content; 206 Partial Content|
|3XX|重定向状态码|需要进行附加操作以完成请求|301 Moved Permanently; 302 Found; 303 See Other;304 Not Modified ;307 Temporary Redirect
|4XX|客户端错误状态码|服务器无法处理请求|400 Bad Request ;401 Unauthorized;403 Forbidden;404 Not Found|
|5XX|服务器错误状态码| 服务器处理请求出错|500 Internal Server Error;503 Service Unavailable|
3. Http 协议的特点
(1) 支持B/S 和 C/S 模式。
(2) 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。
(3) 灵活:HTTP允许传送任意类型的数据对象。
(4) 无连接
HTTP限制每次连接只处理一次请求,服务器处理完请求,收到客户端的应答后就释放连
接。
无连接的好处是节省传输时间。因为传输具有突发性,请求时建立,请求完释放连接,可以尽快释
放资源来服务其他客户端。
Keep-Alive 的功能使客户端到服务端的HTTP连接持续有效,客户端下次请求服务时无需再重新
建立HTTP连接。(网页里面可能嵌了很多图片,此时如果为每个图片请求建立一个HTTP连接,效率就会
很低)
(5)无状态
无状态是指HTTP协议对于事务处理是没有记忆能力的。服务器不知道客户端的状态,即我们给服务器发
送HTTP请求,服务器会处理请求,给我们发送数据过来,但是发送完,不会有任何记录信息。也就是
打开一个服务器上的网页和上一次打开这个服务器上的网页之间没有任何联系。
优点:解放了服务器,服务器“点到即止”,不会造成不必要的占用。
缺点:每次请求会传送大量的重复数据。保持HTTP连接状态的两大技术:Cookie 和 Session。
4. 短连接和长连接 (Http 无连接特点)
-
短连接:客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。HTTP/1.0中默认使用短连接。
-
长连接:Connection:keep-alive 客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间。从HTTP/1.1起,默认使用长连接。
5. Cookie (Http 无状态特点)
Cookie 是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起
请求时被携带并发送到服务器上。它用于告知服务端两个请求是否来自同一浏览器,并保持用户的登录状
态。
(1)用途
- 会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)
- 个性化设置(如用户自定义设置、主题等)
- 浏览器行为跟踪(如跟踪分析用户行为等)
(2)创建过程
Step1: 服务器发送的响应报文包含 “Set-Cookie” 首部字段,客户端得到响应报文后把 Cookie 内容保存到浏览器中
HTTP/1.0 200 OK
Content-type: text/html
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly
[page content]
Cookie 分类
会话期 Cookie:浏览器关闭之后它会被自动删除,也就是说它仅在会话期内有效。
持久性 Cookie:指定一个特定的过期时间(Expires)或有效期(max-age)。
Secure 和 HttpOnly
标记为 Secure 的 Cookie 只应通过被 HTTPS 协议加密过的请求发送给服务端。
标记为 HttpOnly 的 Cookie 不能被 JavaScript 脚本调用。因为跨域脚本 (XSS) 攻击常常使用
JavaScript 的 Document.cookieAPI 窃取用户的 Cookie 信息,因此使用 HttpOnly 标记可
以在一定程度上避免 XSS 攻击。
Step2: 客户端之后对同一个服务器发送请求时,会从浏览器中读出 Cookie 信息通过 “Cookie” 请求首部字段发送给服务器。
(3) 作用域 Domain & Path
-
Domain 标识指定了哪些主机可以接受 Cookie。
-
Path 标识指定了主机下的哪些路径可以接受 Cookie(该 URL 路径必须存在于请求 URL 中)
6. Session (Http 无状态特点)
Session 可以存储在服务器上的文件、数据库或者内存中,现在最常见的是将 Session 存储在内存型数据库中,比如 Redis。
7. Cookie & Session
-
Cookie 存储在客户端,Session 存储在服务端;
-
Cookie 只能存储 ASCII 码字符串,而 Session 则可以存取任何类型的数据,因此在考虑数据复杂性时首选 Session;
-
Cookie 存储在浏览器中,容易被恶意查看。如果非要将一些隐私数据存在 Cookie 中,可以将 Cookie 值进行加密,然后在服务器进行解密;
-
对于大型网站,如果用户所有的信息都存储在 Session 中,那么开销是非常大的,因此不建议将所有的用户信息都存储到 Session 中。
8. Https
(1) Http 存在安全性问题
- 使用明文进行通信,内容可能会被窃听;
- 不验证通信方的身份,通信方的身份有可能遭遇伪装;
- 无法证明报文的完整性,报文有可能遭篡改。
HTTPs(Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,使用了隧道进行通信,让 HTTP 先和 SSL(Secure Sockets Layer)通信,再由 SSL 和 TCP 通信。
通过使用 SSL,HTTPs 具有了加密(防窃听)、认证(防伪装)和完整性保护(防篡改)。
(2)Https 加密
(3) Https 认证
- 通过使用 证书 来对通信方进行认证。
- 数字证书认证机构(CA,Certificate Authority)是客户端与服务器双方都可信赖的第三方机构。
- 服务器向 CA 申请公开密钥,CA 判明申请者的身份之后,会对已申请的公开密钥做数字签名,然后将公开密钥放入证书(certificate)。
- 进行 HTTPS 通信时,服务器会把证书发送给客户端。客户端取得其中的公开密钥之后,先使用数字签名进行验证,如果验证通过,就可以开始通信了。
为什么公钥加密,私钥加签?
####(4)完整性保护
- SSL 提供报文摘要功能来进行完整性保护。
- HTTPS 的报文摘要功能之所以安全,是因为它结合了加密和认证这两个操作。加密之后的报文,遭到篡改之后,也很难重新计算报文摘要,因为无法轻易获取明文。
消息摘要
消息摘要(message digest)函数是一种用于判断数据完整性的算法,也称为散列函数或哈希函数,
函数返回的值叫散列值,散列值又称为消息摘要或者指纹(fingerprint)。这种算法是一个不可逆的
算法,因此你没法通过消息摘要反向推倒出消息是什么。所以它也称为单向散列函数。
9. Http & Https
-
http是HTTP协议运行在TCP之上。所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份。
-
https是HTTP运行在SSL/TLS之上,SSL/TLS运行在TCP之上,具有了加密、认证和完整性保护的特点。
-
https协议需要到ca申请证书,一般免费证书很少,需要交费。
-
http和https使用的是完全不同的连接方式用的端口也不一样,前者是80,后者是443。
二. 传输层 (TCP)
1. TCP & UDP
-
传输控制协议 TCP(Transmission Control Protocol)是面向连接的,提供可靠交付,有流量控制,拥塞控制,提供全双工通信,面向字节流(把应用层传下来的报文看成字节流,把字节流组织成大小不等的数据块),每一条 TCP 连接只能是点对点的(一对一)。
-
用户数据报协议 UDP(User Datagram Protocol)是无连接的,尽最大可能交付,没有拥塞控制,面向报文(对于应用程序传下来的报文不合并也不拆分,只是添加 UDP 首部),支持一对一、一对多、多对一和多对多的交互通信。例如:视频传输、实时通信
2. TCP 三次握手
-
服务器处于 LISTEN(监听)状态,等待客户端的连接请求。
-
客户端向服务器发送连接请求报文,SYN=1,ACK=0,选择一个初始的序号 x。
-
服务器收到连接请求报文,如果同意建立连接,则向客户端发送连接确认报文,SYN=1,ACK=1,确认号为 x+1,同时也选择一个初始的序号 y。
-
客户端收到服务器的连接确认报文后,还要向服务器发出确认,确认号为 y+1,序号为 x+1。
-
服务器收到客户端的确认后,建立连接。
为什么TCP连接需要三次握手,两次不可以吗,为什么?
第三次握手是为了防止客户端失效的连接请求到达服务器,让服务器错误打开连接。
假设客户端和服务器数据传输完毕,释放TCP连接。但由于网络原因,客户端之前的一个已经失效的连接
请求这时候才到达服务器,服务器会打开连接。如果只是两次握手,那么TCP连接建立成功,客户端并没
有发送数据的意思,服务器却在等待客户端发送数据,这白白浪费了资源。但是三次握手不一样,客户端
不发送最后一次握手,服务器就会知道客户端并不想发送数据,就不会打开连接。
3. TCP 四次挥手
-
客户端发送连接释放报文,FIN=1。
-
服务端收到之后发出确认,此时 TCP 属于半关闭状态,服务端能向客户端发送数据。服务端进入 CLOSE-WAIT 状态;
-
当服务端不再需要连接时,发送连接释放报文,FIN=1。
-
客户端收到后发出确认,进入 TIME-WAIT 状态,等待 2 MSL(最大报文存活时间)后释放连接。
-
服务端收到客户端的确认后释放连接。
服务端 CLOSE_WAIT 状态
客户端发送了 FIN 连接释放报文之后,服务器收到了这个报文,就进入了 CLOSE-WAIT 状态。这个状
态是为了让服务器端发送还未传送完毕的数据,传送完毕之后,服务器会发送 FIN 连接释放报文。
客户端 TIME_WAIT 状态
1. 确保最后一个确认报文能够到达。如果服务器没收到客户端发送来的确认报文,那么就会重新发送连
接释放请求报文,客户端等待一段时间就是为了处理这种情况的发生。
2. 等待一段时间是为了让本连接持续时间内所产生的所有报文都从网络中消失,使得下一个新的连接不
会出现旧的连接请求报文。
4. TCP 可靠传输
-
应用数据被分割成TCP认为最适合发送的数据块;
-
TCP 数据编号和确认;TCP给发送的每一个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层。
-
超时重传:当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
-
校验和:TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段。
-
流量控制:TCP连接的每一方都有固定大小的缓冲空间,TCP的接收方只允许发送方发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,提示发送方降低发送的速率,防止包丢失。
-
拥塞控制:当网络拥塞时,减少数据的发送。
5. TCP 流量控制
流量控制是为了控制发送方发送速率,保证接收方来得及接收。
接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为 0,则发送方不能发送数据。
6. TCP 拥塞控制
在某段时间,若对网络中某资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏——产生拥塞(congestion)。
拥塞控制是为了降低整个网络的拥塞程度。
TCP 主要通过四种算法来进行拥塞控制:慢开始、拥塞避免、快重传、快恢复。
发送方需要维护一个叫做拥塞窗口(cwnd)的状态变量,注意拥塞窗口与发送方窗口的区别:拥塞窗口只是一个状态变量,实际决定发送方能发送多少数据的是发送方窗口。
(1)慢开始与拥塞避免
发送的最初执行慢开始,令 cwnd=1,发送方只能发送 1 个报文段;当收到确认后,将 cwnd 加倍;
设置一个慢启动阈值 ssthresh,当 cwnd >= ssthresh 时,进入拥塞避免,每个轮次只将 cwnd
加 1。
如果出现了超时,则令 ssthresh = cwnd/2,然后重新执行慢开始。
(2)快重传与快恢复
在发送方,如果收到三个重复确认,那么可以知道下一个报文段丢失,此时执行快重传,立即重传下一个
报文段。
在这种情况下,只是丢失个别报文段,而不是网络拥塞。因此执行快恢复,令 ssthresh = cwnd/
2 ,cwnd = ssthresh,直接进入拥塞避免
发送窗口的上限
发送方的发送窗口的上限值应当取为接收方窗口 rwnd 和拥塞窗口 cwnd 这两个变量中较小的一个
三. 网络层
因为网络层是整个互联网的核心,因此应当让网络层尽可能简单。网络层向上只提供简单灵活的、无连接的、尽最大努力交互的数据报服务。
使用 IP 协议,可以把异构的物理网络连接起来,使得在网络层看起来好像是一个统一的网络。
与 IP 协议配套使用的还有三个协议:
- 地址解析协议 ARP(Address Resolution Protocol)
- 网际控制报文协议 ICMP(Internet Control Message Protocol)
- 网际组管理协议 IGMP(Internet Group Management Protocol)
1. 地址解析协议 ARP (IP 地址 -> Mac 地址)
网络层实现主机之间的通信,而链路层实现具体每段链路之间的通信。因此在通信过程中,IP 数据报的源地址和目的地址始终不变,而 MAC 地址随着链路的改变而改变
2. 网际控制报文协议 ICMP
ICMP 是为了更有效地转发 IP 数据报和提高交付成功的机会。它封装在 IP 数据报中,但是不属于高层协议。
(1)Ping
Ping 是 ICMP 的一个重要应用,主要用来测试两台主机之间的连通性。
Ping 的原理是通过向目的主机发送 ICMP Echo 请求报文,目的主机收到之后会发送 Echo 回答报文。Ping 会根据时间和成功响应的次数估算出数据包往返时间以及丢包率。
(2) Traceroute
Traceroute 是 ICMP 的另一个应用,用来跟踪一个分组从源点到终点的路径。
Traceroute 发送的 IP 数据报封装的是无法交付的 UDP 用户数据报,并由目的主机发送终点不可达差错报告报文。
3. 网络地址转换 NAT (本地 IP -> 全球 IP)
专用网内部的主机使用本地 IP 地址又想和互联网上的主机通信时,可以使用 NAT 来将本地 IP 转换为全球 IP。
4. 路由器
路由器从功能上可以划分为:路由选择和分组转发。
(1)路由选择协议
可以把路由选择协议划分为两大类:
- 自治系统内部的路由选择:RIP 和 OSPF
- 自治系统间的路由选择:BGP
内部网关协议 RIP
基于距离向量,16 表示不可达;
RIP 按固定的时间间隔仅和相邻路由器交换自己的路由表,经过若干次交换之后,所有路由器最终会知
道到达本自治系统中任何一个网络的最短距离和下一跳路由器地址。
RIP 协议实现简单,开销小。但是 RIP 能使用的最大距离为 15,限制了网络的规模。并且当网络出现
故障时,要经过比较长的时间才能将此消息传送到所有路由器。
内部网关协议 OSPF
开放最短路径优先 OSPF,是为了克服 RIP 的缺点而开发出来的;
开放表示 OSPF 不受某一家厂商控制,而是公开发表的;最短路径优先表示使用了 Dijkstra 提出的
最短路径算法 SPF;
OSPF 具有以下特点:
向本自治系统中的所有路由器发送信息,这种方法是洪泛法;
发送的信息就是与相邻路由器的链路状态,链路状态包括与哪些路由器相连以及链路的度量;
只有当链路状态发生变化时,路由器才会发送信息。
所有路由器都具有全网的拓扑结构图,并且是一致的。相比于 RIP,OSPF 的更新过程收敛的很快。
外部网关协议 BGP
BGP(Border Gateway Protocol,边界网关协议),BGP 只能寻找一条比较好的路由,而不是最佳
路由。
每个 AS 都必须配置 BGP 发言人,通过在两个相邻 BGP 发言人之间建立 TCP 连接来交换路由信
息。