一,粘包问题
TCP 粘包问题 是指发送方发送的多个数据包在接收方缓冲区中被合并成一个包,或者一个包被拆分成多个包接收的现象。这本质上是 TCP字节流传输特性的体现(== 粘包问题是面向字节流的通病==),而不是协议缺陷
java
# 发送方连续发送两个小包
send("Hello")
send("World")
# 接收方可能一次收到:"HelloWorld"(粘包)
# 或者分两次收到但边界不对:类似"Hell"和"oWorld"等情况
处理方案:
java
一:
# 每个消息固定长度,不足补零
# 例如:每个包固定128字节
data = "Hello".ljust(128, '\0')
二:
# 使用特殊字符作为消息边界
# 例如:用换行符分隔
send("Hello\n")
send("World\n")
# 接收方按行读取
xml,json,protobuffer 都能够处理好粘包问题.
二,TCP连接终止的四种异常情况
TCP的连接终止的正常情况是完成四次挥手删除连接信息(删除连接信息是四次挥手的核心任务)
-
进程崩溃(正常/异常终止)
触发机制:进程结束 → 系统回收资源 → 关闭文件描述符 → 触发四次挥手
特点:
TCP连接生命周期可以比进程更长
即使进程消失,系统仍会继续完成挥手过程
与正常四次挥手流程基本相同
-
正常流程关机
触发机制:关机 → 强制终止所有进程 → 触发四次挥手
可能出现的情况:
情况A:挥手速度快,在没有完全关机时顺利完成 → 双方正确删除连接信息
情况B:挥手速度慢,系统关闭时未完成四次挥手 → 至少发送了第一个FIN
FIN的ACK缺失处理:
对端收不到ACK会重传FIN(超时重传)
重传多次失败后 →未关机方单方面释放连接
-
突然断电(拔电源)
特点:完全来不及发送FIN
硬件影响:
对机械硬盘伤害大(磁头来不及归位,可能写入错误数据)
固态硬盘相对较好
情况A:断电方如果是接收方就类似正常流程关机的情况B,由于未收到接收方的回应将进行超时重传,重传未果后将尝试"复位",由复位报文段实现即TCP结构标志位的RST标志位,复位相当于已断开连接,后续还需重新三次握手建立连接

情况B:断电方是发送方,接收方将在等待一段时间后发送"心跳包",如果发现发送方没有"心跳"便单方面断开连接

-
网线断开
本质:上述情况(断电)的结合
特点:通信物理中断,双方可能都无法完成正常挥手
将发生断电情况的A和B
三,IP协议
1)IP数据报的结构
java
0 15 31
├───────┬───────┬─────────────────┬───────────────────────────────┤
│ 版 本 │ 首部长度 │ 服 务 类 型 │ 总 长 度 │
│ (4位) │ (4位) │ (8位) │ (16位) │
├───────┴───────┴─────────────────┴───────────────────────────────┤
│ 标 识 │ 标 志 │ 片 偏 移 │
│ (16位) │ (3位) │ (13位) │
├───────────────────────────────────────────────────────────────┤
│ 生 存 时 间 │ 协 议 │ 首 部 检 验 和 │
│ (8位) │ (8位) │ (16位) │
├───────────────────────────────────────────────────────────────┤
│ 源 I P 地 址 │
│ (32位) │
├───────────────────────────────────────────────────────────────┤
│ 目 的 I P 地 址 │
│ (32位) │
├───────────────────────────────────────────────────────────────┤
│ 选 项 (如 有,0~320位) │ 数 据 │
│ │ (0~31位) │
└───────────────────────────────────────────────────────────────┘
- 版本的取值只有两种4,6分别对应IPv4与IPv6(IPv4是当前主流版本)
- 首部长度的单位4字节,即首部长度的数值*4才是真实长度
- 服务类型虽为8位,实际上4位有效,且有效位彼此冲突(即必须是一个1,3个0),分别有四种模式,最小延时(数据传输快),最大吞吐量(可传输数据量大),最高可靠性(不容易丢包),最小成本(硬件设备开销小)
- 总长度表达描述了IP数据报报头加载荷部分的长度
- 生存时间的单位是次数,一个IP数据报每经过一个路由器转发生存时间减一,如果数值归0证明丢包,假如给出了一个错误的目的IP,数据无法到达,生存时间归0就丢包即可以免浪费硬件资源,虽然生存时间仅有8位,但已经绰绰有余不会发生正常情况下丢包问题
- 8位协议表示传输层使用的是哪种协议(TCP,UDP...)
- 首部校验和仅针对IP数据报首部校验,载荷装载的传输层协议数据有自己的校验和避免数据出错
- 源IP与目的IP即"发件人","收件人"简单的关系
- 标识,标志,片偏移见下文
2)IP数据报的拆包组包功能
由于IP数据报总长度仅有16位的限制,载荷可能无法携带完整的传送层数据报,因此IP数据报具有将传输层数据报拆包使用多个IP数据报携带与重新组包组成一个传输层数据报的功能,依赖标识标志与片偏移实现
- IP数据报将数据拆包后,16位标识数值相同的是同一个传输层数据报
- 3位标志位有两位有效,最高位是保留位必须为0,1位表示是否分片,1位表示是否是一个数据报的结束片段(拆分出的最后一个片段)
- 13位片偏移表示组装多个载荷的组装顺序
3)IP协议的对地址的管理
IP协议作用于网络层,核心任务是为每一台设备分配逻辑地址(IP地址),并把数据打包成"IP数据报",根据地址从源主机发送到目的主机
1.核心内容
IPv4地址为32位,通常写作点分十进制(如192.168.1.1)。其地址空间理论容量约为 42.9亿 个(2³²),这个数据看似很大,实则在网络飞速发展的如今并不够用
为解决上述问题,诞生了以下策略
-
动态分配IP地址

-
NAT(网络地址映射)机制
核心是,将IP地址空间划分为公网与私网,私有地址可在不同局域网内随意重复,仅在访问公网时由网关设备映射为少量公网地址,公网地址必须唯一,在复杂的网络中,不同局域网能找到一个公网设备或者公网中继,借由公网设备访问其余公网设备,并且有可能访问其余局域网设备
由于上述设定便有了
a)公网设备可直接访问公网设备
b)相同局域网内的设备可直接互相访问
c)不同局域网下的设备不允许互相访问
d)公网设备不允许主动访问局域网设备
e)局域网设备访问公网设备,需对IP地址进行替换(也可能需对端口号替换)
-
IPv6
动态IP地址与NAT本质都是提高IP的利用率,并未实际增加IP数量,IPv6采用了16字节表示,是一个极大的数,从根本解决了IP地址不够用的问题,但是IPv4与IPv6的报头结构不兼容,推动IPv6就需要大范围替换硬件设备,因此现在多用动态分配IP地址与NAT解决问题
2.NAT仅关注局域网访问公网的情况
NAT机制的替换IP过程主要关注的内容
源IP,替换后的IP,源端口,替换后的端口,目的IP,目的端口
请求发送过程,需要通过找到公网设备或者公网中继器,将源IP替换为公网设备或者公网中继器的IP(特殊情况端口也需替换),并记录未替换前的真实值以便接收响应
响应返回过程,目的IP实则是局域网找到的公网设备或者公网中继器的IP,需要将被替换的IP(若有端口端口也需),根据记录值,替换回真实值
- 大部分情况下,局域网内的设备访问的是不同网站,访问公网设备仅需通过替换IP
响应返回时,仅需关注记录的是哪个IP访问的该网站,替换回源IP - 少数情况下,局域网内的设备访问的是同一个网站并且两个局域网设备分配的源端口号不相等,
响应返回时,在替换回真实值时,由于有多个设备访问的同一网站,无法确定要给哪个IP,如果记录的端口不同,便可找到应该接收响应的局域网设备 - 极端情况下,局域网内的设备访问的是同一个网站并且两个局域网设备分配的源端口号相等,访问公网设备可能需要将端口号也替换,
响应返回时,由于无法区分应该给哪个IP,通过端口号区分竟也相同,因此需要替换端口号,由公网设备或者公网中继器分配一个虚拟的端口号,用于区分
3.网段划分
IPv4地址逻辑上由网络位与主机位构成,网段划分的核心在于子网掩码,IP地址本身无法分割网络号与主机号两部分,需要借助子网掩码,子网掩码的二进制表示左测全1,右侧全0,有几个1就代表网络号有几位(家用默认24位网络位,8位主机位)。
由IP地址与子网掩码进行与运算能得到一个网络号,多个不同的IP地址可以与子网掩码进行与运算得到相同的结果,称为网络号(),网络号相同就处于同一网段
子网掩码中1越多,网段划分越多,主机位越少,一个网段可容纳的主机数也变少

注意:
- 在同一局域网中,IP地址不可重复否则无法正常上网
- 局域网中,设备的网络号不可与路由器的网络号不同,否则也无法上网
- 两个相邻的局域网中,网络号不可相同(相邻即路由器连接的两个网络)
4.部分特殊IP地址
- 127.*是环回IP,其中127.0.0.1代表本机
- 如果某个IP的主机号全0,表示的即网段划分的一个网络号,即表示整个网段,因此不可分配给某个主机
- 如果某个IP的主机号全1(二进制全1并非点分十进制的全1),那么该IP表示广播地址,广播地址即有消息发送到广播地址,局域网内的所有设备都可收到消息(传输层依赖于UDP,广播地址难以可靠传输数据)
4)路由选择
当一个数据包要从一台设备去往另一台设备时,沿途的每个路由器都要决定下一步(称之为下一跳)把包转给谁(借由路由表实现,路由表是路由器内部的数据结构,下一跳就是 路由表的部分内容)
四,数据链路层的简略理解
数据链路层引入了新一套地址体系称为MAC地址。并且采用以太网数据帧等多种协议传输,以下仅介绍以太网数据帧。
MAC地址为6字节,一般情况下MAC地址与网卡一对一绑定,网卡出厂时MAC地址已经确定
网络层规划好的下一跳具体如何到达便依赖于数据链路层
1)以太网数据帧的部分结构

- 6位的目的地址与源地址(都是MAC地址,MAC地址通常以16进制表示,字节之间使用 - 或者 :分隔)
- 2位的类型,标识了载荷的意义,以下是较常见类型
0800即代表载荷数据是IPv4的数据
ARP就是让路由器或交换机建立一个内部结构能将IP地址与MAC地址建立联系(映射关系,已知IP能知道对应MAC),RARP则是ARP的逆过程是MAC地址与IP地址建立联系

- CRC为校验和判断数据是否有误
2)注意
- 以太网数据帧部分范围是46-1500字节
下限46由ARP决定,ARP是46字节
上限1500由硬件限制决定,称为MTU - IP数据报常封装进以太网数据帧(等数据链路层协议)的载荷,而TCP与UDP又封装于IP数据报的载荷
五,DNS域名系统
在DNS出现前本地有一个hosts文件,hosts文件是一个存在于操作系统本地的纯文本文件,用于手动建立主机名(域名)与IP地址的静态映射关系,它在DNS(域名系统)出现之前是互联网域名解析的唯一方式,如今也未被完全取代

DNS(域名系统)是应用层协议,负责将人类易记的域名(如 www.google.com)转换为机器可读的IP地址(如 142.250.185.78)
由域名翻译为IP称为正向解析,是最常用的功能,反之称为反向解析,用的较少
DNS并非只有一份,有多个镜像服务器备份,而是由全球数万台服务器通过任播和主从复制构成的巨大冗余系统