乐趣区

计算机网络笔记

网络模型结构

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

TCP

TCP:传输控制协议。

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

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

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

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

数据包格式

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

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

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

为了确定双方 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 状态。

为什么会有 TIME_WAIT 状态

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

避免新旧连接混淆。

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

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

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

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

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

滑动窗口

数据分为四类:

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

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

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

UDP

UDP:用户数据报协议。

特点

非连接协议。

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

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

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

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

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

TCP 和 UDP 的区别

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