一、网络基础与Socket概述:TCP/IP协议栈、IP地址与端口、Socket概念、C/S与B/S架构
各位同学,咱们今天聊聊网络编程的根基。说实话,我刚开始学Socket的时候,也是一头雾水。只知道调几个函数就能发数据,但底层到底怎么跑的,完全没概念。后来踩了不少坑,才慢慢摸清楚门道。
这一节,咱们把地基打牢。你想想看,盖房子如果地基歪了,后面装修得再漂亮也没用。网络编程也一样,TCP/IP协议栈、IP地址、端口、Socket这些概念,必须吃透。
1.1 TCP/IP协议栈——网络通信的骨架
TCP/IP协议栈,说白了就是一套通信规则。我习惯把它比作快递系统:你寄包裹,要写地址、贴单号、选快递公司,最后送到收件人手里。网络通信也是这个道理。
这个协议栈分四层,每层各司其职:
| 层级 | 名称 | 核心协议 | 我眼中的职责 |
|---|---|---|---|
| 第4层 | 应用层 | HTTP、FTP、SMTP | 你直接打交道的,比如浏览器、邮件客户端 |
| 第3层 | 传输层 | TCP、UDP | 保证数据可靠到达,或者追求速度 |
| 第2层 | 网络层 | IP、ICMP | 负责寻址和路由,找到对方在哪 |
| 第1层 | 链路层 | 以太网、Wi-Fi | 物理传输,比如网线、无线信号 |
我在项目中遇到过一个问题:客户端发数据,服务端收不到。查了半天,发现是应用层协议没对齐。客户端用JSON格式,服务端却按XML解析。嗯,这就是分层的好处——问题出在哪一层,就查哪一层,不用把整个系统翻个底朝天。
1.2 IP地址与端口——找到那台机器上的那个程序
IP地址,就是网络上的门牌号。IPv4是32位,写成四个数字,比如192.168.1.1。IPv6是128位,更长,但原理一样。
端口呢?我打个比方:IP地址找到了你家那栋楼,端口就是你家门牌号。一台服务器上跑着Web服务、FTP服务、邮件服务,怎么区分?靠端口。Web服务默认80端口,FTP用21,SSH用22。
端口范围是0到65535。其中:
- 0-1023:知名端口,系统保留。比如HTTP的80、HTTPS的443
- 1024-49151:注册端口,给应用程序用
- 49152-65535:动态/私有端口,客户端临时用
1.3 Socket概念——通信的管道
Socket,中文叫套接字。说白了,它就是网络通信的管道。一端连着你的程序,另一端连着网络。你往管道里写数据,数据就通过网络传到对方那里。
在C语言里,Socket就是一个文件描述符。你操作它,就像操作文件一样:打开、读写、关闭。我刚开始学的时候觉得奇怪,为什么网络通信和文件操作这么像?后来明白了,Unix哲学就是「一切皆文件」。
一个典型的Socket通信流程:
// 服务端
int server_fd = socket(AF_INET, SOCK_STREAM, 0); // 创建Socket
bind(server_fd, (struct sockaddr*)&address, sizeof(address)); // 绑定IP和端口
listen(server_fd, 3); // 监听连接
int client_fd = accept(server_fd, (struct sockaddr*)&client_addr, &addrlen); // 接受连接
read(client_fd, buffer, 1024); // 读取数据
write(client_fd, reply, strlen(reply)); // 发送数据
close(client_fd); // 关闭连接
你看,是不是很像文件操作?open、read、write、close。只不过多了bind、listen、accept这些网络特有的步骤。
1.4 C/S与B/S架构——两种主流的网络模式
C/S架构,就是客户端/服务器模式。你装一个微信客户端,它连到腾讯的服务器,这就是C/S。B/S架构,就是浏览器/服务器模式。你打开Chrome访问百度,这就是B/S。
我个人的经验是:
- C/S架构:适合需要复杂交互、高性能的场景。比如在线游戏、视频会议。客户端可以做很多本地处理,减轻服务器压力。但缺点是要安装软件,更新麻烦。
- B/S架构:适合信息展示、轻量交互。比如新闻网站、管理系统。不用安装,打开浏览器就能用。但所有逻辑都在服务器上,对网络要求高。
你想想看,为什么抖音用C/S架构?因为要处理视频渲染、特效这些重活,浏览器搞不定。为什么淘宝用B/S架构?因为商品浏览、下单这些操作,浏览器完全能胜任。
下面这张图,是我画的一个知识结构图,帮你理清这一节的核心脉络:
好了,这一节的内容就这些。TCP/IP协议栈是骨架,IP和端口是地址,Socket是工具,C/S和B/S是架构模式。把这四个概念搞明白,后面写代码的时候,你就知道每一步在干什么了。
记住我的一句话:网络编程没那么玄乎,它就是两台机器之间互相发数据。你只要把协议、地址、端口、Socket这几个东西理清楚,剩下的就是调API的事了。