一、网络基础与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:动态/私有端口,客户端临时用
我曾经踩过的坑:写一个服务端程序,绑定了端口8080。结果怎么都启动不了。查了半天,发现另一个程序已经占用了这个端口。用netstat -ano一看,果然。从那以后,我每次写网络程序,第一件事就是检查端口是否被占用。

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这些网络特有的步骤。

核心要点:Socket是应用层与传输层之间的接口。你不需要关心数据怎么打包、怎么路由、怎么纠错,这些TCP/IP协议栈帮你做了。你只需要通过Socket收发数据就行。

1.4 C/S与B/S架构——两种主流的网络模式

C/S架构,就是客户端/服务器模式。你装一个微信客户端,它连到腾讯的服务器,这就是C/S。B/S架构,就是浏览器/服务器模式。你打开Chrome访问百度,这就是B/S。

我个人的经验是:

  • C/S架构:适合需要复杂交互、高性能的场景。比如在线游戏、视频会议。客户端可以做很多本地处理,减轻服务器压力。但缺点是要安装软件,更新麻烦。
  • B/S架构:适合信息展示、轻量交互。比如新闻网站、管理系统。不用安装,打开浏览器就能用。但所有逻辑都在服务器上,对网络要求高。

你想想看,为什么抖音用C/S架构?因为要处理视频渲染、特效这些重活,浏览器搞不定。为什么淘宝用B/S架构?因为商品浏览、下单这些操作,浏览器完全能胜任。

下面这张图,是我画的一个知识结构图,帮你理清这一节的核心脉络:

网络基础与Socket概述 · 知识体系 TCP/IP协议栈 应用层:HTTP, FTP, SMTP 传输层:TCP, UDP 网络层:IP, ICMP 链路层:以太网, Wi-Fi IP地址与端口 IPv4: 192.168.1.1 (32位) IPv6: 2001:db8::1 (128位) 端口范围: 0-65535 知名端口: 80(HTTP), 443(HTTPS) Socket概念 本质:网络通信的管道 C语言中:文件描述符 流程:创建→绑定→监听→ 接受→读写→关闭 C/S与B/S架构 C/S:客户端/服务器 → 需安装,性能强 B/S:浏览器/服务器 → 免安装,跨平台 四者环环相扣,构成网络编程的完整知识体系

好了,这一节的内容就这些。TCP/IP协议栈是骨架,IP和端口是地址,Socket是工具,C/S和B/S是架构模式。把这四个概念搞明白,后面写代码的时候,你就知道每一步在干什么了。

记住我的一句话:网络编程没那么玄乎,它就是两台机器之间互相发数据。你只要把协议、地址、端口、Socket这几个东西理清楚,剩下的就是调API的事了。


公众号:蓝海资料掘金营,微信deep3321