共计 2112 个字符,预计需要花费 6 分钟才能阅读完成。
网络模型结构
OSI 七层模型 | TCP/IP 四层模型 | 功能 | 基本单位 |
---|---|---|---|
应用层 | 应用层 | 文件传输,电子邮件,文件服务 | |
表示层 | 数据格式化,代码转换,数据加密 | ||
会话层 | 负责在数据传输中设置和维护两台计算机之间的通信连接 | ||
传输层 | 传输层 | 提供端到端的通信 | |
网络层 | 网络层 | 逻辑编址、分组传输、路由选择 | 数据包 |
数据链路层 | 网络接口层 | 数据封装,错误检测和纠正 | 帧 |
物理层 | 传输比特流 | 比特 |
TCP
TCP
:传输控制协议。
面向连接的、可靠的、基于字节流的传输层通信协议。
将应用层的数据流分割成报文段并发送给目标节点的 TCP
层。
数据包都有序号,对方收到则发送 ACK
确认,否则重传。
使用校验和来校验数据在传输过程中是否有误。
数据包格式
以 IP
加端口的形式,唯一确定网络中通信的进程,也称为Socket
。
Flags
URG
:紧急指针标志 ACK
:确认序号标志PSH
:push
标志 RST
:重置连接标志SYN
:同步序号,用于建立连接过程FIN
:finish
标志,用于释放连接
三次握手
TCP
协议提供可靠的连接服务,采用三次握手建立一个连接。
第一次握手:建立连接时,客户端发送 SYN (seq = x)
包到服务器,同时进入 SYN_SEND
状态,等待服务器确认。
第二次握手:服务器收到 SYN
包,必须确认客户的 SYN (ack = x + 1)
,同时自己也发送一个SYN (seq = y)
包,即 SYN + ACK
包,此时服务器进入 SYN_RECV
状态。
第三次握手:客户端收到服务器的 SYN + ACK
包,向服务器发送确认包 ACK (ack = y + 1)
,此包发送完毕,客户端和服务器进入ESTABLISHED
状态,完成三次握手。
为什么需要三次握手才能建立起连接?
为了确定双方 Sequence Number
的初始值。
- 客户端发送它的
Sequence Number
初始值。 - 服务端确认收到。
- 服务端发送它的
Sequence Number
初始值。 - 客户端确认收到。
2、3 两步可以进行合并,即服务端发一个 TCP
数据包就可以完成确认和发送自己的 Sequence Number
两项任务,所以就是三次握手。
异常情况
第一次握手
Client
会超时重传,直到收到 Server
的确认。
第二次握手
Server
会超时重传,直到收到 Client
的确认。
第三次握手
Client
发完 ACK
后,单方面进入 ESTABLISHED
状态,而 Server
还处在 SYN_RECV
状态,未建立起连接。
- 假设双方都没有数据发送,
Server
会超时重传,直到收到Client
的确认,收到后Server
也进入ESTABLISHED
状态,连接建立完成。 - 假设此时
Client
有数据发送,B
收到A
的数据包,自然会切换至ESTABLISHED
状态,并接受数据。 - 如果
Server
有数据要发送,因连接还没有建立成功,无法发送数据,Server
超时重传SYN + ACK
,直到收到Client
的确认,连接建立完成。
SYN Flood
增加允许半开连接最大数量。
回收最早的半开 TCP
连接。
回发SYN Cookie
,若为正常连接,则会回发确认消息,直接建立连接。
建立连接后,Client 出现故障怎么办?
向对方发送保活探测报文,如果未收到响应则继续发送。
尝试次数达到保活探测数仍未收到响应则中断连接。
四次挥手
第一次挥手:Client
发送一个 FIN
,用来关闭Client
到Server
的数据传送,Client
进入 FIN_WAIT_1
状态。
第二次挥手:Server
收到 FIN
后,发送一个 ACK
给Client
,Server
进入 CLOSE_WAIT
状态。
第三次挥手:Server
发送一个 FIN
,用来关闭Server
到Client
的数据传送,Server
进入 LAST_ACK
状态。
第四次挥手:Client
收到 FIN
后,Client
进入 TIME_WAIT
状态,接着发送一个 ACK
给Server
,Server
进入 CLOSED
状态,完成四次挥手。Client
等待 2MSL
后也进入 CLOSED
状态。
为什么会有 TIME_WAIT 状态
确保对方有足够的时间收到 ACK
包,如果传输错误,对方会进行重传,一来一回正好2MSL
。
避免新旧连接混淆。
为什么需要四次挥手才能断开连接?
因为 TCP
是全双工的,所以发送方和接受方都需要发送 FIN
报文和 ACK
报文。
服务器出现大量 CLOSE_WAIT 状态的原因
对方关闭连接,而我方却没有及时关闭连接。
- 检查释放资源的代码。
- 检查处理请求的线程配置。
滑动窗口
数据分为四类:
- 发送并得到确认的。
- 发送但是没有得到确认的。
- 没有发送,但是准备发送的。
- 没有发送,也没有准备发送的。
类别 2
和类别 3
是发送窗口。
收到确认后,发送窗口开始滑动。
UDP
UDP
:用户数据报协议。
特点
非连接协议。
不维护连接状态,支持同时向多个客户端传输相同的消息。
数据包报头只有 8
个字节,额外开销较小。
吞吐量只受限于数据生成速率、传输速率和机器性能。
尽最大努力交付,不保证可靠交付,不需要维持复杂的链接状态表。
面向报文,不对应用程序提交的报文信息进行拆分或合并。
TCP 和 UDP 的区别
TCP
面向连接,UDP
无连接。TCP
可靠,UDP
不可靠。TCP
利用序列号保证了消息的有序性,UDP
不具有有序性。TCP
速度比较慢(需要握手),UDP
速度快。- 根据报文的头部来分析,
TCP
重量级,UDP
轻量级。