计算机网络
mingzaily / 2019-10-18
网络基础
OSI 模型
表格
概念层 | 数据单位 | 作用 | 设备 |
---|---|---|---|
物理层 | 比特 | 提供光纤标准、传送数据的通路,传输比特流 | 网线等等 |
数据链路层 | 数据帧 | 帧定界和帧同步;顺序控制,指对帧的收发顺序的控制;差错检测和恢复;APR、RARP 协议 | 交互机、网桥 |
网络层 | 数据分组或数据包 | 两个主机系统之间提供连接和路径选择 | 路由器 |
传输层 | 报文段 | 定义传输协议和端口;分段传输,到达目的地址后重组 | - |
会话层 | - | 管理应用程序间的通信 | - |
表示层 | - | 把应用层提供的信息变换为能够共同理解的形式、保证各系统、应用可以读取 | - |
应用层 | - | 应用层协议,如 HTTP 协议 | - |
总结
- 下面 4 层(物理层、数据链路层、网络层和传输层)主要提供数据传输和交换功能,即以节点到节点之间的通信为主;
- 第 4 层(传输成 TCP/UDP)作为上下两部分的桥梁,是整个网络体系结构中最关键的部分;
- 简言之,下 4 层主要完成通信子网的功能,上 3 层主要完成资源子网的功能。
TCP/IP 四层模型
TCP/IP 又叫网际协议群,可以说是 OSI 模型的实现,强调在计算机上实现协议应该开发哪种程序
概念层 | TCP/IP 协议群 |
---|---|
应用层 | FTP、HTTP、Telnt |
数据链路层 | TCP、UDP |
网络层 | IP、ICMP、RIP、OSFF,ICMP,BGF |
网络接口层/链路层 | ISO、IEEE 标准 |
TCP 三次握手&四次挥手
报文格式
TCP Tags
- URF 紧急指针标志
- ACK 确认序号标志
- PSH push 标志
- RST 重置连接标志
- SYN 同步需要,用于建立连接过程
- FIN 完成标志,用于释放连接
三次握手
具体过程
一般由客户端发起连接请求
- 第一次握手(SYN=1, seq=x)
客户端发送一个 TCP 的 SYN 标志位置 1 的包。
发送完毕后,客户端进入SYN_SEND
状态。 - 第二次握手(SYN=1, ACK=1, seq=y, ack=x+1)
服务器发回确认包(ACK)应答。SYN 标志位和 ACK 标志位均为 1。
发送完毕后,服务器端进入SYN_RCVD
状态。 - 第三次握手(ACK=1,seq=x+1,ack=y+1)
客户端再次发送确认包(ACK)。SYN 标志位为 0,ACK 标志位为 1
发送完毕后,客户端进入ESTABLISHED
状态,当服务器端接收到这个包时,也进入ESTABLISHED
状态,TCP 握手结束。
为什么需要三次握手才能建立起连接
- 为了初始化 seq number,作为以后数据传输的序号,保证数据传输过程中数据不会乱序
首次握手隐患-SYN 超时
- Server 收到 Client 的 SYN,回复 SYN-ACK 的时候未收到 ACK
- Server 不断重试直至超时
- 攻击者可以把 SYN 的队列耗尽,使正常请求无法处理
- SYN Flood 防护措施
- SYN 队列满后,通过 tcp_syncookies 参数回发 SYn Cookie
- 若为正常连接则 Cliet 会回发 SYNCookie,直接建立连接
建立连接后,Client 出现故障
- 向对方发送保活探测报文,如果未收到响应则继续发送,直到保活探测数
四次挥手
具体过程
- 第一次挥手(FIN=1,seq=u)
Client 发送一个 FIN 包,迎来关闭 Client 到 Server 的数据传送。
发送完毕后,客户端进入FIN_WAIT_1
状态。 - 第二次挥手(ACK=1,seq=v,ack=u+1)
Server 收到 FIN 包,发送一个 ACK 到 Client,确认序号为收到序号+1。
发送完毕后,服务器端进入CLOSE_WAIT
状态。
客户端接收到这个确认包之后,进入FIN_WAIT_2
状态,等待服务器端关闭连接。 - 第三次挥手(FIN=1,ACK=1,seq=w,ack=u+1)
Server 发送一个 FIN 包,用来关闭 Server 到 Client 的数据传送。
发送完毕后,服务器端进入LAST_ACK
状态,等待来自客户端的最后一个 ACK。 - 第四次挥手(ACK=1,seq=u+1,ack=w+1)
Client 收到 FIN 包后,Client 进入TIME_WAIT
状态,接着发送一个 ACK 包给 Server,确认序号为收到序号+1。
服务器端接收到这个确认包之后,关闭连接,进入CLOSED
状态。 - 客户端等待了某个固定时间(两个最大段生命周期,2MSL,2 Maximum Segment Lifetime)之后,没有收到服务器端的 ACK ,认为服务器端已经正常关闭连接,于是自己也关闭连接,进入
CLOSED
状态。在等待过程中,可以使本连接持续的时间内所产生的所有报文段从网络中消失。这样就可以使下一个新的连接中不会出现旧的连接请求报文段。
为什么需要四次握手才能断开连接
- 因为全双工,发送发和接收方都需要 FIN 报文和 ACK 报文
服务器出现大量 CLOSE_WAIT 状态的原因
- 对方关闭 socket 连接,我方忙于读与写,没有及时关闭连接
- 检查代码,特别是释放资源的代码
- 检查配置,特别是处理请求的线程配置
TCP 和 UDP 区别
UDP 简介
- 面向非连接
- 不维护连接状态,支持同时向多个客户端传输相同的消息
- 数据包报头只有 8 哥字节,额外开销小
- 吞吐量之受限于数据生成速率、传输速率以及机器性能
- 尽最大努力交付,不保证可靠交付,不需要维持复杂的链接状态表
- 面向报文,不对应用程序提交的信息进行拆分或者合并
TCP 和 UDP 的区别
- 面向连接 VS 无连接(适用于多端发布)
- 可靠性
- 有序性
- 速度
- 量级
TCP 的滑动窗口
TCP 使用滑动窗口做流量控制与乱序重排
- 保证 TCP 的可靠性
- 保证 TCP 的流控特性
RTT 和 RTO
- RTT 发送一个数据包到收到对应的 ACK,所花费的时间
- RTO 发送时间间隔(根据 RTT 计算)
HTTP 与 HTTPS
http 特点
- 支持客户/服务器模式
- 简单快速
- 灵活
- 无连接(即使 http1.1 的 keep-live 机制,属于 http 之外的,始终认为请求结束后关闭连接,下层实现对上层透明)
- 无状态
http 响应步骤
- 客户端连接到 Web 服务器
- 发送 http 请求
- 服务器接收请求并返回 HTTP 响应
- 释放连接 TCP 连接
- 客户端浏览器解析 HTML 内容
在浏览器地址栏键入 URL 回车流程
- DNS 解析
- TCP 连接
- 发送 HTTP 请求
- 服务器处理请求并返回 HTTP 报文
- 浏览器解析渲染页面
- 连接结束
常见 HTTP 状态码
- 1XX 指示信息:表示请求已接受,继续处理
- 2XX 成功:表示请求已被成功接收、理解、接受
- 3XX 重定向:要完成请求必须进行更进一步的操作
- 4XX 客户端错误:请求用语法错误或请求无法实现
- 5XX 服务器端错误:服务器未能实现合法的请求
GET 和 POST 请求的区别
- HTTP 报文层面:GET 请求信息放在 URL,POST 放在报文体中
- 数据库层面:GET 符合幂等性和安全性,POST 不符合
- 其他层面:GET 可以被缓存、被存储,而 POST 不行
Cookue 和 Session 的区别
- Cookie 数据存放在客户的浏览器上、Seession 数据放在服务器上
- Session 相对于 Cookie 更安全
- 若考虑减轻服务器开销,应当考虑 Cookie
HTTP 和 HTTPS 的区别
SSL(TLS) 安全套接层
- HTTPS 需要到 CA 申请证书,HTTP 不需要
- HTTPS 密文传输,HTTP 明文传输
- 连接方式不同,HTTPS 默认使用 443 端口,HTTP 使用 80 端口
- HTTPS=HTTP+加密+认证+完整性保护,较安全
HTTPS 并不绝对安全
- 浏览器默认填充 http://,请求需要进行跳转,有被劫持的风险
- 可以使用 HSTS 优化