1. 从零理解TCP/IP协议栈
2003年我在大学机房第一次用telnet连接BBS时,看着黑色终端里跳动的文字,突然意识到这些字符是如何跨越千山万水准确到达对方电脑的。这种神奇体验促使我拆解了TCP/IP协议栈的每一层封装,今天我们就用ChatDemo这个案例,还原数据包在网络中的完整旅程。
TCP/IP协议栈就像快递物流系统:应用层是你要寄的包裹内容(比如ChatDemo的文字消息),传输层给包裹贴上快递单(TCP头部),网络层规划运输路线(IP路由),链路层则是卡车和飞机等实体运输工具。没有这套标准协议之前,不同厂商的网络设备就像说着不同语言的快递公司,根本无法协作。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. ChatDemo的协议设计要点
2.1 消息格式定义
在ChatDemo中,我们采用JSON作为应用层协议格式。一个典型的消息包如下:
json复制{
"type": "text",
"sender": "user123",
"timestamp": 1625097600,
"content": "Hello TCP/IP!"
}
关键设计点:字段顺序固定可以省略键名节省流量,但考虑到可扩展性,建议保留完整JSON结构。实测在100Mbps局域网中,完整JSON的解析耗时仅比优化格式多0.3ms。
2.2 TCP连接管理
ChatDemo使用经典的C/S架构,服务端需要处理三个核心状态:
- LISTEN状态:调用
socket(),bind(),listen()后进入
c复制int server_fd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in address = {
.sin_family = AF_INET,
.sin_port = htons(8080),
.sin_addr.s_addr = INADDR_ANY
};
bind(server_fd, (struct sockaddr*)&address, sizeof(address));
listen(server_fd, 5); // 积压队列长度
- ESTABLISHED状态:通过
accept()接收新
