网络编程入门:从分层模型、IP 与端口到 TCP/UDP 协议详解

发布时间:2026/11/6 3:38:54
网络编程入门:从分层模型、IP 与端口到 TCP/UDP 协议详解 网络编程网络编程即跨主机的进程间通信网络:把不同主机通过网络设备连接起来构成了网络目的资源共享信息交互互联网把网络与网络连接起来网络通信的结构为什么要分层1. 各层独立每一层只负责自己的功能不用关心别的层怎么实现。更换某一层技术其他层不受影响比如网线换光纤上层程序不用改。2. 便于标准化每层定义统一接口和协议不同厂商设备只要遵守同一层标准就能互通。3. 模块化易于开发、调试、维护问题可以分层定位是物理链路问题IP路由问题还是应用层排查故障更简单代码可以分层实现。4. 复用功能下层服务可以给多个上层协议共用。比如IP层同时给TCP、UDP使用不用重复写寻址功能。5. 支持异构网络互联不同硬件、不同操作系统只要遵守分层协议就能通信。应用程序地址ipportip地址每一台主机的编号实际上共用一个ip地址采用接入技术复用只是感觉不到本地环回地址每一台主机都有用于测试不能用于标识一台主机查看ip地址命令Windows上终端ipconfigLinux上ifconfigport端口号主机上标识一个进程知道是传给你的哪个进程程序大小端多字节数据在内存的存储方式是CPU/内存存储的概念不是文件的概念。大端模式数据的高字节保存在内存低地址低字节保存在高地址网络通信默认大端网络字节序。小端模式数据的低字节保存在内存低地址高字节保存在高地址x86架构主机默认小端主机字节序。可以标识主机MAC地址物理地址48位是不变的无法表示物理位置发生了变化ipv4地址格式点分十进制的字符串形式四字节32位一个位范围0~255地址枯竭ipv6地址格式ipv4不够用128位冒分十六进制地址空间极大有了物理地址为什么还要ip地址ip地址包含信息类似学号用于找到它互为补充方便管理mac地址时固定的无法表示你的位置发生了变化网络协议一组网络规则的集合让传输的数据看得懂。某个场景有某个场景的协议每一层有每一层的协议。tcp、udp、http协议tcp协议udp协议是传输层的两个主要协议tcp协议tcp协议提供面向连接的可靠的流式服务粘包TCP是字节流协议无报文边界发送方多次发送的数据在接收端粘在一起分不清哪一段是哪一条消息就是粘包。产生原因发送方Nagle算法合并小包、接收缓冲区多条数据堆积。tcp协议确保可靠性机制三次握手建立连接四次挥手释放连接全双工通信序号ACK确认机制累计确认保证有序丢包可定位超时重传、快速重传保证数据可靠送达滑动窗口流量控制接收方告知接收窗口限制发送速度防止接收缓冲区溢出拥塞控制慢启动、拥塞避免、快重传、快恢复防止网络拥塞校验和检测报文损坏保活机制检测连接存活tcp简图三次握手四次挥手connect建立连接三次握手全过程传输层自己完成客户端发 SYN → 服务端内核收到第一次握手放入半连接队列回复 SYNACK第二次握手客户端回 ACK第三次握手 内核收到后把连接从半连接队列移到全连接队列应用程序调用 accept() 从全连接队列取出一个已完成握手的连接返回新socketaccept阻塞说明当时没有已完成握手的连接close断开连接四次挥手告诉对方本端要关闭连接标志FIN双方close间隔很短的时候挥手可以是三次中间发送的两个报文合在一起tcp连接握手和挥手时的状态变化主要是TIME_WAIT状态客户端主动关闭那么客户端会变成TIME_WAIT状态服务器端主动关闭那么服务器端变成TIME_WAIT状态大约存在两分钟即一个报文最大生存时间的两倍重点状态变化原因timewait状态存在意义1.可靠的终止tcp连接确保你最后一次挥手发送的ACK能够发送到后结束那一端可能会丢2.迟来的tcp报文有足够的时间识别并丢弃关闭时一瞬间关闭后可能正处于发送接收报文状态还有报文在路上报文有用则识别无用则丢弃立刻启动新的服务器可能接收到这个报文但实际上时发给上一个进程的对新进程来说无用代码客户端int main() { int sockfd socket(AF_INET,SOCK_STREAM,0);//套接字 if(sockfd -1) { exit(1); } struct sockaddr_in saddr;//服务器地址,你将要连接的服务器地址;打电话只需要知道对方的号码 memset(saddr,0,sizeof(saddr)); saddr.sin_family AF_INET; saddr.sin_port htons(6000);//服务器端口 saddr.sin_addr.s_addr inet_addr(192.168.1.186);//服务器ip地址 int resconnect(sockfd,(struct sockaddr*)saddr,sizeof(saddr)); if(res-1) { printf(connect err\n); exit(1); } while( 1 ) { char buff[128] {0}; printf(input\n); fgets(buff,128,stdin); if( strncmp(buff,end,3) 0 ) { break; } send(sockfd,buff,strlen(buff)-1,0);//向服务器发送数据write memset(buff,0,128);//清空buff recv(sockfd,buff,127,0);//接受服务器返回的数据 printf(buff%s\n,buff); } close(sockfd); exit(0); }服务器端多线程模式#includestdio.h #includestdlib.h #includeunistd.h #includestring.h #includesys/socket.h #includenetinet/in.h #includearpa/inet.h void* fun(void* arg) { int c (int)arg; while( 1) { char buff[128] {0}; int n recv(c,buff,127,0);//read if( n 0 ) { break; } printf(recv(%d):%s\n,c,buff); send(c,ok,2,0); //连接套接字也相当于文件发送接收可以用read和write } close(c); //每次只需要关闭连接套接字监听套接字后续循环继续用 printf(client close(%d)\n,c); } int main() { int sockfd socket(AF_INET,SOCK_STREAM,0);//创建套接字 if( sockfd -1 ) { exit(1); } struct sockaddr_in saddr,caddr;//地址 ip port memset(saddr,0,sizeof(saddr)); saddr.sin_family AF_INET; saddr.sin_port htons(6000); //sin_port需要主机字节序列转化为网络字节序列大端 6000是port号1024以内是知名端口不可用 saddr.sin_addr.s_addr inet_addr(192.168.1.186);//ip //inet_addr将点分十进制字符串形式转化为无符号整型 int res bind(sockfd,(struct sockaddr*)saddr,sizeof(saddr));//指定ip port if( res -1 ) { printf(bind err\n); exit(1); } res listen(sockfd,5); //创建两个监听队列一个是未完成握手的一个是已完成握手的第二个参数表示已完成握手队列的大小 if( res -1 ) { exit(1); } while( 1 ) { int len sizeof(caddr);//存放客户端地址ip port ) int c accept(sockfd,(struct sockaddr*)caddr,len);//可能阻塞 if( c 0 ) { continue; } printf(acceptc%d,ip%s,port%d\n,c,inet_ntoa(caddr.sin_addr), ntohs(caddr.sin_port));//客户端ip地址拿出来会存为整型转为字符串打印端口转主机字节序列 //多线程操作 pthread_t id; pthread_create(id,NULL,fun,(void*)c); } }udp协议udp协议无连接不可靠的数据报服务udp简图sendto需要idport跟发送短信一样只需要知道号码不需要连接recvfrom接收信息可以知道对方的ipport多个进程同时发送都可以接收到即服务器可以接收多个客户端的数据如果服务器一次只能接受一个字符客户端发送hello到服务器的接收缓冲区一次读到一个字符其他收不完的直接丢了udp两次sendto发送的报文不会形成一个粘包再发送过去而是发送一次接收一次tcp与udp 区别TCP (传输控制协议) —— “可靠的送货员”核心特点面向连接、可靠传输。关键机制三次握手建立连接前确认双方状态确保通道畅通。数据确认与重传接收方需回执ACK丢失则自动重传保证数据不丢、不乱序。流量控制通过滑动窗口避免发送方“喂撑”接收方。适用场景对数据完整性要求极高的场合如网页浏览(HTTP/HTTPS)、邮件(SMTP/POP3)、文件传输(FTP)。UDP (用户数据报协议) —— “高效的快递小哥”核心特点无连接、不可靠、高效。关键机制无需握手发送即发无需建立连接延迟极低。无确认机制不管对方是否收到不进行重传数据可能丢失或乱序。面向报文保留报文边界一次发送一个数据报。适用场景允许少量数据丢失、追求实时性的场合如视频/语音通话(WebRTC)、直播、DNS查询、游戏实时对战。TCP 追求“万无一失”适合传文件、网页UDP 追求“快准狠”适合传视频、语音。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询