第一章 物理媒介与链路层(1960-1970)
1.1 比特流物理编码
// 曼彻斯特编码实现
vector<bool> manchester_encode(uint8_t byte) {vector<bool> bits;for(int i=7; i>=0; --i) {bool bit = (byte >> i) & 1;bits.push_back(bit); // 前半周期bits.push_back(!bit); // 后半周期}return bits;
}
物理层关键参数:
- 波特率:300-9600 baud
- 误码率:10^-4(铜缆) vs 10^-9(光纤)
- 同步机制:前导码检测(1010交替模式)
代码解析:
曼彻斯特编码通过电平跳变解决时钟同步问题,每个比特周期中间必然发生跳变:
• bit
表示原始数据位(0或1)
• bits.push_back(bit)
对应前半周期电平
• bits.push_back(!bit)
产生后半周期的反向电平
这种编码方式使10Mbps以太网的波特率达到20Mbaud,但牺牲了50%的带宽效率。前导码(56位交替1010…)帮助接收端建立时钟同步。
1.2 以太网帧深度解析
┌─────────┬─────────┬─────────┬─────┬─────────┐
│ 前导码 │ 帧起始符 │ 目标MAC │ 源MAC │ 类型 │ 数据(46-1500B) │ CRC32 │
├─────────┼─────────┼─────────┼─────┼─────────┤
│ 7字节 │ 1字节 │ 6字节 │6字节│ 2字节 │ 变长 │4字节 │
└─────────┴─────────┴─────────┴─────┴─────────┘
// CSMA/CD伪代码实现
void transmit_frame(Frame f) {while(true) {if(carrier_sense() == IDLE) {send(f);while(!collision_detect()) {if(transmission_complete()) return;}send_jam_signal();backoff_time = calculate_backoff();sleep(backoff_time);}}
}
机制详解:
冲突检测多路访问(CSMA/CD)是早期以太网的核心:
- 载波侦听:检测信道是否空闲(物理层电压检测)
- 冲突检测:发送同时监听信道,若检测到异常电压则判定冲突
- 退避算法:采用二进制指数退避(BEB),冲突次数n对应的等待时间为
rand(0, 2^n - 1) * slot_time
该机制使得10BASE5网络的端到端传播延迟必须小于512位时(51.2μs),限制了网络直径不超过2500米。
第二章 网络层革命(1974-1981)
2.1 IP协议解剖
// IP头结构体(兼容IPv4/v6)
struct IPHeader {
#if IPV4uint8_t version:4, ihl:4;uint8_t tos;uint16_t total_length;uint16_t identification;uint16_t frag_off:13, flags:3;uint8_t ttl;uint8_t protocol;uint16_t checksum;uint32_t saddr;uint32_t daddr;
#else uint32_t flow_label:20, version:4, traffic_class:8;uint16_t payload_length;uint8_t next_header;uint8_t hop_limit;uint128_t saddr;uint128_t daddr;
#endif
};
MTU分片算法:
vector<IPFragment> fragment_packet(IPPacket p, uint16_t mtu) {vector<IPFragment> fragments;uint16_t header_len = p.header.ihl * 4;uint16_t max_data = mtu - header_len;uint16_t offset = 0;while(offset < p.payload.size()) {uint16_t frag_size = min(max_data, p.payload.size() - offset);bool more_frag