5

网络模型结构

OSI七层模型 TCP/IP四层模型 功能 基本单位
应用层 应用层 文件传输,电子邮件,文件服务
表示层 数据格式化,代码转换,数据加密
会话层 负责在数据传输中设置和维护两台计算机之间的通信连接
传输层 传输层 提供端到端的通信
网络层 网络层 逻辑编址、分组传输、路由选择 数据包
数据链路层 网络接口层 数据封装,错误检测和纠正
物理层 传输比特流 比特

TCP

TCP:传输控制协议。

面向连接的、可靠的、基于字节流的传输层通信协议。

将应用层的数据流分割成报文段并发送给目标节点的TCP层。

数据包都有序号,对方收到则发送ACK确认,否则重传。

使用校验和来校验数据在传输过程中是否有误。

数据包格式

IP加端口的形式,唯一确定网络中通信的进程,也称为Socket

clipboard.png

Flags

URG:紧急指针标志
ACK:确认序号标志
PSHpush标志
RST:重置连接标志
SYN:同步序号,用于建立连接过程
FINfinish标志,用于释放连接

三次握手

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状态,完成三次握手。

clipboard.png

为什么需要三次握手才能建立起连接?

为了确定双方Sequence Number的初始值。

  1. 客户端发送它的Sequence Number初始值。
  2. 服务端确认收到。
  3. 服务端发送它的Sequence Number初始值。
  4. 客户端确认收到。

2、3两步可以进行合并,即服务端发一个TCP数据包就可以完成确认和发送自己的Sequence Number两项任务,所以就是三次握手。

异常情况

第一次握手

Client会超时重传,直到收到Server的确认。

第二次握手

Server会超时重传,直到收到Client的确认。

第三次握手

Client发完ACK后,单方面进入ESTABLISHED状态,而Server还处在SYN_RECV状态,未建立起连接。

  1. 假设双方都没有数据发送,Server会超时重传,直到收到Client的确认,收到后Server也进入ESTABLISHED状态,连接建立完成。
  2. 假设此时Client有数据发送,B收到A的数据包,自然会切换至ESTABLISHED状态,并接受数据。
  3. 如果Server有数据要发送,因连接还没有建立成功,无法发送数据,Server超时重传SYN + ACK,直到收到Client的确认,连接建立完成。

SYN Flood

增加允许半开连接最大数量。

回收最早的半开TCP连接。

回发SYN Cookie,若为正常连接,则会回发确认消息,直接建立连接。

建立连接后,Client出现故障怎么办?

向对方发送保活探测报文,如果未收到响应则继续发送。

尝试次数达到保活探测数仍未收到响应则中断连接。

四次挥手

第一次挥手:Client发送一个FIN,用来关闭ClientServer的数据传送,Client进入FIN_WAIT_1状态。

第二次挥手:Server收到FIN后,发送一个ACKClientServer进入CLOSE_WAIT状态。

第三次挥手:Server发送一个FIN,用来关闭ServerClient的数据传送,Server进入LAST_ACK状态。

第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACKServerServer进入CLOSED状态,完成四次挥手。Client等待2MSL后也进入CLOSED状态。

clipboard.png

为什么会有TIME_WAIT状态

确保对方有足够的时间收到ACK包,如果传输错误,对方会进行重传,一来一回正好2MSL

避免新旧连接混淆。

为什么需要四次挥手才能断开连接?

因为TCP是全双工的,所以发送方和接受方都需要发送FIN报文和ACK报文。

服务器出现大量CLOSE_WAIT状态的原因

对方关闭连接,而我方却没有及时关闭连接。

  1. 检查释放资源的代码。
  2. 检查处理请求的线程配置。

滑动窗口

数据分为四类:

  1. 发送并得到确认的。
  2. 发送但是没有得到确认的。
  3. 没有发送,但是准备发送的。
  4. 没有发送,也没有准备发送的。

clipboard.png

类别2和类别3是发送窗口。

clipboard.png

收到确认后,发送窗口开始滑动。

clipboard.png

UDP

UDP:用户数据报协议。

特点

非连接协议。

不维护连接状态,支持同时向多个客户端传输相同的消息。

数据包报头只有8个字节,额外开销较小。

吞吐量只受限于数据生成速率、传输速率和机器性能。

尽最大努力交付,不保证可靠交付,不需要维持复杂的链接状态表。

面向报文,不对应用程序提交的报文信息进行拆分或合并。

TCP和UDP的区别

  1. TCP面向连接,UDP无连接。
  2. TCP可靠,UDP不可靠。
  3. TCP利用序列号保证了消息的有序性,UDP不具有有序性。
  4. TCP速度比较慢(需要握手),UDP速度快。
  5. 根据报文的头部来分析,TCP重量级,UDP轻量级。

张喜硕
2.1k 声望423 粉丝

浅梦辄止,书墨未浓。