计算机网络知识点
前言
记录一些基础和重要的知识点。
三次握手
- 客户端向服务器发送SYN (test客户端发送能力、服务器接收能力)【此时 Seq 初始化为 j 】
- 服务器接收到向客户端发送SYN、ACK (test服务器发送能力、客户端接收能力)【此时 SYN 的 Seq 初始化为 k,ACK 的 Seq 为 j + 1 】
- 客户端接收到向服务器发送ACK (客户端能接收到)【ACK 的 Seq 为 k + 1 】
作用:
- 确认双方的接受发送能力正常
- 制定自己的初始化序列号(initial sequence number, ISN)[1],为后面可靠传输做准备
四次挥手
- 客户端发送FIN,制定一个序列号 Seq ,处于FIN_WAIT1状态
- 服务器收到FIN后,发送ACK,且把序列号值+1作为ACK的序列号值,表明已经接收到了客户端的报文,此时服务器处于CLOSE_WAIT状态
- 如果服务器也想断开连接,向客户端发送FIN,且制定一个序列号 Seq ,此时处于CLOSE_WAIT状态
- 客户端收到FIN后,一样发送ACK作为应答,且把序列号值+1作为ACK的序列号值,此时处于TIME_WAIT[2]状态,需要过一阵子确保收到ACK才会进入CLOSED状态
- 服务器收到ACK后,处于关闭状态,处于CLOSED状态
TCP
特点
- 面向连接:即双方传输前建立一条通道,如三次握手四次挥手
- 只能有两个端点,即两个套接字[3],只能点对点
- 提供可靠传输:无差错、不丢失、无重复、按序到达
- 提供全双工通信:允许通信双方的应用进程在任何时候都可以发送数据,因为两端都没有发送缓存和接受缓存
- 面向字节流:虽然应用程序与TCP交互是一次一个大小不等的数据块,但TCP将这些数据看成一连串无结构的字节流,不保证接收方收到的和发送的具有对应大小关系。(可能发送方应用程序交给发送方的TCP10个数据块,但就受访的TCP可能只用了4个数据块就保收到的字节流交付给上层的应用程序,但字节流完全一致。)
可靠性原理
- 传输信道无差错,保证传输数据正确
- 不管发送方以多快的速度发送数据,接收方总是来得及处理收到的数据
- 首先,采用三次握手和四次挥手来建立和释放TCP连接,保证可靠
- 其次,TCP采用连续ARQ协议[4](回退N,Go-back-N;超时自动重传)来保证数据传输的正确性,使用滑动窗口协议来保证接收方能及时处理所接收到的数据,进行流量控制
- 最后,TCP采用 慢开始、拥塞避免、快重传和快恢复 进行拥塞控制,避免网络拥塞
UDP
- 无连接
- 尽最大努力交付,不保证可靠
- 无拥塞控制,出现拥塞也不会降低发送速率
- 支持一对一、一对多、多对多
- 首部开销小,只有8字节
- 面向报文,对应用层交下来的报文不合并不拆分,保留原报文边界
TCP和UDP对比
不同
- TCP可靠,UDP不可靠
- TCP面向连接,UDP无连接
- TCP传输数据有序,UDP不保证有序性
- TCP不保存数据边界,UDP保留
- TCP慢
- TCP有流量控制和拥塞控制
- TCP重量级,UDP轻量级
- TCP首部 20 字节,UDP 8 字节
常用协议
TCP
- HTTP
- HTTPS
- FTP
- TELNET
- SMTP
UDP
- DNS
- DHCP
- TFTP
- SNMP
- RIP
应用场景
TCP
效率要求低,准确性要求高(因为传输种需要对数据确认、重发、排序等)
- 文件传输
- 收发邮件
- 远程登录
UDP
效率高,准确性要求低
- 在线视频
- 即时通讯(速度要求高,偶尔出现断连不是大问题,无需重发机制)
- 广播通信
TCP如何保证可靠行
-
数据包校验
主要目的是校验数据传输过程中是否会有变化,如果有错,则丢弃,TCP一段时间得不到响应,将会重传
-
对失序数据包重新排列
TCP会对失序数据进行重新排序,才交给应用层
-
丢弃重复数据
如果有重复数据,将会被丢弃
-
应答机制
当TCP收到发自TCP连接另一端的数据,将发送一个确认信息,但并非立即发送
-
超时重发
TCP发出一个段的时候,启动一个定时器,如果一段时间得不到应答,则重发
-
流量控制
TCP连接的每一方都有固定大小缓冲空间。只允许另一端发送能容纳的数据,防止较快主机使较慢主机的缓冲区溢出。TCP使用的流量控制协议是可变大小的滑动窗口协议。
TCP拥塞控制
拥塞控制 VS 流量控制
- 拥塞控制:全局过程,涉及到所有的主机、路由器(网络层)、以及降低网络传输性能有关所有因素
- 流量控制:点对点通信量控制,抑制发送速率,让接收方来得及接收
在某段时间,若对网络中某一资源的需求超过了该资源所能提供的,网络就会变差,即为拥塞。
拥塞控制防止过多数据注入网络,使网络中的路由器或链路不过载。
为了进行拥塞控制,要维持一个拥塞窗口(cwnd)的状态变量。
- 取决于网络拥塞程度
- 动态变化
- 发送方的发送窗口 = min(拥塞窗口,接收方接收窗口)
慢启动/开始
一开始就传送大量数据,容易堵塞,在不知道的情况下就慢慢来
- 试探
- 从小到大逐渐增大发送窗口
- cwnd初始化位1,每经过一个传播轮次,大小加倍
拥塞避免
让cwnd缓慢增大,每经过一个往返时间RTT[5]就:cwnd+=1
快速重传和快速恢复(FRR)[6]
快速恢复丢失数据包。
如果没有FRR,数据包丢失,TCP会使用定时器要求暂停传输,暂时时间里,没有新的或复制的数据包被发送。
有了FRR,如果接收方接收到不按顺序的数据段,则会给发送分发送一个重复确认,如果发送方接收到3个重复确认,会假定确认件指出的数据段丢失了,并立即重传。
跟名字有关,快即不会因为定时器暂停传输耽误传输。
当单独的数据包丢失,FRR有效;如若多个在段时间丢失,则不能很有效。
TCP滑动窗口(Sliding Window)
主要利用滑动窗口来实现流量控制。
- 由于早期传输中,并不会考虑网络拥堵状况,直接发送数据,导致中间节点堵塞掉包,无法继续传输。
- 滑动窗口大小意味着接收方还有多大的缓冲区可以用于接收数据
- 发送发可以利用滑动窗口大小确定可以发送多少数据
- 为0时,不能再发
- 但有两种情况是例外的:
- 允许用户终止在远端机上的运行进程
- 发送发可以发送1字节的数据报来通知接收方重新声明它希望接收的下一字节及发送方的滑动窗口大小
HTTP 1.0 VS 1.1 VS 2.0
-
1.0:可以理解为短暂tcp连接
-
1.1:引入持久连接,默认不关闭,可以多个请求复用;引入管道机制,在一个tcp连接里,可以同时发送多个请求
HTTP方法
- GET:获取资源,大部分使用
- POST:传输实体主体
- HEAD:获取报文首部,但不返回报文实体主体部分,与GET类似
- PUT:上传文件,但是不带验证机制,任何人都能上传,存在安全性问题❌
- DELETE:与PUT相反,用来删除,也不带验证机制
- PATCH:对资源部分修改。PUT虽然也可以修改,但是是完全代替的方式
- OPTIONS:查询制定URL支持的方法
- CONNECT:要求在与代理服务器通信时建立隧道。使用SSL和TLS(Transport Layer Security,传输层安全)协议把通信内容加密后经网络隧道传输
- TRACE:追踪路径。服务器会将通信路径返回给客户端。容易收到XST攻击(Cross-Site Tracing,跨站追踪)
HTTP状态码
**1XX:**表示目前是协议的中间状态,还需要后续请求
2XX: 表示请求成功
**3XX:**表示重定向状态,需要重新请求
**4XX:**表示请求报文错误(客户端错误)
5XX: 服务器端错误
- 100 客户端应继续发送请求
- 101 切换请求协议,从HTTP切换到WebSocket
- 200 请求成功,有响应体
- 301 永久重定向:会缓存
- 302 临时重定向:不会缓存
- 304 协商缓存命中
- 400 包含语法错误,当前请求无法被服务器理解。(一般在服务器端表单验证失败)
- 401 当前请求需要用户验证
- 403 服务器禁止访问 (属于前端bug)
- 404 资源未找到
- 405 请求方法不能被用于请求相应的资源
- 408 超时
- 500 服务器端错误(一半是代码出错,后台bug)
- 502 Bad Gateway,作为网关或代理工作的服务器尝试执行请求时,从上有服务器接收到无效响应
- 503 服务器繁忙
- 504 超时
301 VS 302
301 永久重定向
页面永久转移
- 目录结构调整或网页拓展名变化,转移到新地址
- 多个域名跳转到同一个域名
有助于URL权重的集中
301 临时重定向
页面暂时转移
- 暂时转移到新地址
- 用于网址劫持
容易导致网站降权,严重会被封网站,不建议(❌)
HTTP VS HTTPS
S: SSL(Secure Socket Layer),运行在TCP上,增添了加密和认证。
HTTP | HTTPS | |
---|---|---|
端口 | 80 | 443 |
资源消耗 | - | 加减密处理消耗更多 |
开销 | - | 证书需购买(免费较少) |
安全性 | 差(明文传输)❌ | 好 |
速度 | 快 | 慢 |
HTTPS的加密机制:共享密钥和公开密钥加密并用的混合加密机制。
HTTPS加密流程
对称加密:使用同一个密钥加密解密,问题在如何安全将密钥发送,快但没那么安全
非对称加密:有公钥私钥,公钥可以随意发布,私钥不可以,发送一方使用对方公钥加密,对方接受到使用私钥解密,安全但慢
SSL采用混合加密,融合了上量两种加密方式的优点。
混合加密:先使用非对称加密保护一个对称密钥的协商过程,然后对称密钥协商完成之后,使用对称加密传输,即用对称加密来传送消息,但对称加密所使用的密钥我们可以通过非对称加密的方式发送出去。
SSL加密是将身份验证和加密传输两步骤合在一起,总流程为:
- 需要被验证身份的一方生成一对密钥
- 去权威机构生成一个CA证书(并且将公钥交给权威机构)
- 通信前将CA证书发给对端(证书会包含机构信息和公钥信息)
- 对端对证书进行解析,对当前通信方身份进行验证。
- 身份验证通过之后,使用混合加密方式传输数据:即先使用非对称加密方式协商对称密钥,对称密钥协商完成之后,使用对称加密传输。其中使用非对称加密方式协商对称密钥的过程为:
- 使用公钥加密数据(一个随机数+对称密钥算法列表)发送给验证方;
- 验证方回复数据(一个随机数+对称密钥算法列表);
- 双方使用两个随机送以及对称密钥算法列表计算出一对密钥。
GET VS POST
GET用于获取资源,POST用于传输实体主体。
参数
GET和POST都可以使用额外的参数。
GET
以查询字符串出现在URL中,URL只支持ASCII码,所以如果存在中文等字符需要编码;限制长度
POST
参数存储在实体主体中(不代表安全性更高,抓包软件也可以查看);POST参数支持标准字符集。
安全性
安全的HTTP方法不会改变服务器状态,也就是说它只是可读的。
GET较为安全,而POST不是,因为POST的目的是传送实体主体内容,可能是用户上传的数据,上传成功后,服务器可能会把这个数据存储到数据库中,因此状态也发生了变化。
安全的方法: GET、HEAD、OPTIONS
不安全的方法: POST、PUT、DELETE
幂等性
同样的请求被执行一次与连接执行多次的效果相同,服务器的状态也是一样的。
幂等方法不应该有副作用,统计用途除外。
安全的方法 = 幂等的方法。
正确实现的条件下,GET、HEAD、PUT、DELETE等方法也是幂等的,但POST不是。
可缓性
- 请求报文的HTTP方法本身是可缓存的,包括GET和HEAD,但是PUT和DELETE不可,POST在多数情况下都不可
- 响应报文的状态码是可缓存的,包括:200、203、204、206;300、301;404、405、410、414;501
- 响应报文的Cache-Control首部字段没有指定不进行缓存
XMLHttpRequest
XMLHttpRequest 是一个 API,它为客户端提供了在客户端和服务器之间传输数据的功能。它提供了一个通过 URL 来获取数据的简单方式,并且不会使整个页面刷新。这使得网页只更新一部分页面而不会打扰到用户。XMLHttpRequest 在 AJAX 中被大量使用。
- POST方法浏览器会先发送Header再发送Data,但并非所有浏览器会如此,例如FireFox
- GET方法Header和Data一起发送
IP地址分类
- 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开头的IP地址是保留回环地址,不可能出现在网络上的。127开头的IP主要用于测试 如:127.0.0.1 本机地址,主要用于测试。)
在浏览器输入URL地址到显示主页的过程
TCP/IP模型中用到的协议
应用层:
- HTTP:WWW 访问协议
- DNS:域名解析
传输层:
- TCP:在客户和服务器之间建立连接,提供可靠的数据传输
网络层:
-
IP:进行路由选择
-
ICMP:提供网络传输中的差错检测
-
ARP:将目的IP 地址映射成物理MAC 地址
数据链路层:
- DNS解析:浏览器查询DNS,获取域名对应的IP地址。
- TCP连接:获得域名所对应的IP地址后,浏览器向服务器请求三次握手
- 发送HTTP请求 :TCP建立后,发送HTTP请求(应用层 ->传输层 ->网络层 ->数据链路层)
- 服务器处理HTTP请求并返回HTTP报文 :根据响应参数处理并返回视图给浏览器(数据链路层 ->网络层 ->传输层 ->应用层)
- 浏览器渲染解析页面 :解析渲染,与到对js、css等引用重复以上步骤请求资源,最后呈现出一个完整的界面
- 连接结束
DNS解析
- 客户端输入域名
- 在本地DNS服务器查询对应IP地址(递归),查到返回
- 查不到则本地DNS服务器以DNS客户身份请求根域名服务器(迭代)
- 根域名服务器将顶级DNS服务器域名IP地址告知本地DNS服务器
- 本地DNS服务器向顶级DNS服务器查询
- 顶级DNS服务器要么返回所查询IP地址,要么告知本地DNS服务器下一步向哪个权威DNS服务器查询
图源:《图解网络》
OSI参考模型 VS TCP/IP参考模型
OSI & TCP/IP 参考模型每一层作用及协议
OSI | 作用 | 协议 | TCP/IP | 数据 | |
---|---|---|---|---|---|
应用层 | 各种应用程序和协议;网络服务与最终用户的一个接口 | HTTP、TFTP、FTP、NFS、WAIS、SMTP、 DNS | 应用层 | Message | |
表示层 | 数据和信息的语法转换内码、数据压缩解压、加密解密。 | Telnet、Rlogin、SNMP、HTTP、Gopher | |||
会话层 | 为通信双方指定通信方式,并创建、注销会话。 | SMPP、SCP、SSH | |||
传输层 | 提供可靠或不可靠的传输。 | TCP、UDP | 传输层 | 数据段 | |
网络层 | 逻辑寻址、路由选择。 | IP 、ICMP、IGMP 、ARP 、RARP | 网络层 | 数据包 | 路由器 |
数据链路层 | 建立逻辑连接,进行硬件地址寻址,差错校验等功能 | PPP、 LLC 、MAC | 数据链路层 | 数据帧 | 交换机 |
物理层 | 建立、维护、断开物理连接 | IEEE802.3有线局域网(以太网) IEEE802.11无线局域网标准 | 物理层 | 数据流 | 网关 |
cookie VS session VS token
cookie | Session | – |
---|---|---|
数据放在客户浏览器上 | 存放在服务器上 | |
存放本地不是很安全 | - | |
- | 太多会影响服务器性能 | |
单个保存最多4K,大多浏览器限制一个站点最多20个 | ||
- | 存放重要信息 |
ISN是动态生成的,防止攻击者猜出后续确认号 ↩︎
主要为了确定服务器能否收到ACK ↩︎
Socket,就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议栈进行交互的接口。 ↩︎
自动重传请求(Automatic Repeat-reQuest,ARQ)是OSI模型中数据链路层的错误纠正协议之一。它包括停止等待ARQ协议和连续ARQ协议,错误侦测(Error Detection)、正面确认(Positive Acknowledgment)、逾时重传(Retransmission after Timeout)与负面确认继以重传(Negative Acknowledgment and Retransmission)等机制。 ↩︎
RTT(Round-Trip Time) ↩︎
fast retransmit and recovery, FRR ↩︎