网络模型结构
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
轻量级。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。