news 2026/4/16 12:55:26

揭秘IP地址:网络通信的服务端和客户端核心密码

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
揭秘IP地址:网络通信的服务端和客户端核心密码

IP地址

基本概念

  • IP地址是Internet中主机的标识
  • Internet中的主机要与别的机器通信必须具有一个IP地址
  • IP地址为32位(IPv4)或者128位(IPv6
  • 每个数据包都必须携带目的IP地址和源IP地址,路由器依靠此信息为数据包选择路由
  • 表示形式:常用点分十进制形式,如202.38.64.10,最后都会转换为一个32位的无符号整数。

二级划分

IP地址 = 网络号 + 主机号

网络号:表示是否在同一网段

主机号:同一网段内的主机ID

特殊地址

特殊的IP地址:不能分配给主机使用

  1. 网络地址:用于标识网络的起始地址, 有效网络号+全是0的主机号

192.168.50.43 192.168.50.0

128.12.1.2 128.12.0.0

12.1.2.3 12.0.0.0

  1. 广播地址:用于给局域网内所有主机发送数据使用,有效网络号+全是1的主机号

192.168.50.43 192.168.50.255

128.12.1.2 128.12.255.255

12.1.2.3 12.255.255.255

子网掩码

作用:将IP划分成网络地址和主机地址

特点:

1)子网掩码长度是和IP地址长度完全一样的,32bit的二进制数组成;

  1. 网络号全为1,主机号全为0

A类:255.0.0.0

B类:255.255.0.0

C类:255.255.255.0

IP地址 & 子网掩码 ==》网络地址

IP地址 & ~子网掩码 ==》主机地址

三级划分

二级地址 = 网络号 + 主机号

三级划分 = 网络号 + 子网号 + 主机号

域名结构

例如域名www.baidu.com.cn从右向左看

cn为高级域名,也叫一级域名,它通常分配给主干节点,取值为国家名,cn代表中国

com为网络名,属于二级域名,它通常表示组织或部门

中国互联网二级域名共40个,edu表示教育部门,com表示商业部门,gov表示政府,军队mil等等

baidu为机构名,在此为三级域名,表示百度

www:万维网world wide web,也叫环球信息网,是一种特殊的信息结构框架。

网络模型

网络的体系结构

  • 网络采用分而治之的方法设计,将网络的功能划分为不同的模块,以分层的形式有机组合在一起。
  • 每层实现不同的功能,其内部实现方法对外部其他层次来说是透明的。每层向上层提供服务,同时使用下层提供的服务
  • 网络体系结构即指网络的层次结构和每层所使用协议的集合
  • 两类非常重要的体系结构:OSI与TCP/IP

OSI模型

OSI模型是最理想的模型

物理层:传输的是bit流(0与1一样的数据),物理信号,没有格式

链路层:格式变为帧(把数据分成包,一帧一帧的数据进行发送)

网络层:路由器中是有算法的,ip,(主机到主机)(路由的转发)

传输层:端口号,数据传输到具体那个进程程序(端到端)

会话层:通信管理,负责建立或者断开通信连接

表示层:确保一个系统应用层发送的消息可以被另一个系统的应用层读取,编码转换,数据解析,管理数据加密,解密;

应用层:指定特定应用的协议,文件传输,文件管理,电子邮件等

TCP/IP模型

常见网络协议

网络接口和物理层:PPP:拨号协议(老式电话线上网方式)ARP:地址解析协议 IP-->MACRARP:反向地址转换协议 MAC-->IP网络层:IP(IPV4/IPV6):网间互连的协议ICMP:网络控制管理协议,ping 命令使用IGMP:网络分组管理协议,广播和组播使用传输层:TCP:传输控制协议UDP:用户数据报协议应用层:SSH:加密协议telnet:远程登录协议FTP:文件传输协议(TCP)TFTP:简单文件传输协议(UDP)HTTP:超文本传输协议(明文发送)HTTPS加密传输DNS:域名解析协议SMTP/POP3:邮件传输协议

TCP和UDP

UDP TCP 协议相同点:都存在于传输层

TCP:传输控制协议

TCP(Transmission Control Protocol)是一种面向连接的传输层协议,它能提供高可靠性通信(数据无误、数据无丢失、数据无失序、数据无重复到达的通信)

适用情况:

1、适合于对传输质量要求较高,以及传输大量数据的通信。

2、在需要可靠数据传输的场合,通常使用TCP协议

3、MSN/QQ等即时通讯软件的用户登录账户管理相关的功能通常采用TCP协议

缺点:

发送量较大,效率低

UDP :用户数据报协议

UDP (User Datagram Protocol)用户数据报协议,是不可靠的无连接的协议。在数据发送前,因为不需要进行连接,所以可以进行高效率的数据传输。

适用情况:1.发送小尺寸数据(如对DNS服务器进行IP地址查询时)2.在接收到数据,给出应答较困难的网络中使用UDP。3.适合于广播/组播式通信中。4.MSN/QQ/skype 等即时通讯软件的点对点文本通讯以及音视频通讯通常采用UDP协议5.流媒体、VOD、VoIP、IPTV等网络多媒体服务中通常采用UDP方式进行实时数据传输

程预备知识

socket套接字

socket简介

1》1982 - Berkeley software Distributions操作系统引入了socket作为本地进程之间通信的接口2》1986 - Berkeley扩展了socket接口,使之支持UNIX下的TCP/IP 通信3》现在很多应用(FTP,Telnet)都依赖这一接口socket1、是一个编程接口2、是一种特殊的文件描述符(everything in unix is a file)3、并不仅限于TCP/IP协议4、面向连接(Transmission control Protocol - TCP/IP)5、无连接(User Datagram Protocol -UDP和Inter-network Packet Exchange- IPX)为什么需要socket?普通的IO操作过程:打开文件->读/写操作―>关闭文件TCP/IP协议被集成到操作系统的内核中,引入了新型的"IO"操作进行网络通信的两个进程在不同的机器上,如何连接?网络协议具有多样性,如何进行统一的操作需要一种通用的网络编程接口: socket

socket类型

1)流式套接字(SOCK_STREAM) TCP

提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复的发送且按发送顺序接收。内设置流量控制,避免数据流淹没慢的接收方。数据被看作是字节流,无长度限制。

2)数据报套接字(SOCK_DGRAM) UDP

提供无连接服务。数据包以独立数据包的形式被发送,不提供无差错保证,数据可能丢失或重复,顺序发送,可能乱序接收。

3)原始套接字(SOCK_RAW)

可以对较低层次协议如IP、ICMP直接访问。

端口号

  • 为了区分一台主机接收到的数据包应该转交给哪个进程来进行处理,使用端口号来区分
  • TCP端口号与UDP端口号独立
  • 端口号一般由IANA (Internet Assigned Numbers Authority) 管理
  • 端口用两个字节来表示2byte

字节序

  1. 字节序是指不同类型的cpu主机,内存存储"多字节整数"序列的方式
  2. 浮点类型,字符类型,字符串没有字节序。
  3. 小端序(little-endian) - 低序字节存储在低地址 (主机字节序)
  4. 大端序(big-endian)- 高序字节存储在低地址 (网络字节序)

主机字节序到网络字节序

u_longhtonl(u_long hostlong);u_shorthtons(u_short short);//掌握这个

网络字节序到主机字节序

u_longntohl(u_long hostlong);u_shortntohs(u_short short);

IP地址转换

man inet_addr

typedefuint32_tin_addr_t;structin_addr{in_addr_t s_addr;};in_addr_tinet_addr(constchar*ip);//从人看的IP地址转换为机器使用的32位无符号整数char*inet_ntoa(structin_addrin);//从机器到人

测试代码:

#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <stdio.h>intmain(intargc,charconst*argv[]){//1.将字符串IP转换为32位无符号整数structin_addrin;in.s_addr=inet_addr("192.168.50.12");//2.将32位无符号整数转换为字符串IPchar*p=inet_ntoa(in);printf("%s\n",p);return0;}

TCP编程

流程

函数接口

socket

#include <sys/types.h> /* See NOTES */#include <sys/socket.h>int socket (int domain,int type, int protocol) ;功能:创建套接字参数:domain:协议族AF_UNIX,AF_LOCAL 本地通信AF_INET ipv4AF_INET6 ipv6type:套接字类型SOCK_STREAM:流式套接字SOCK_DGRAM:数据报套接字SOCK_RAW:原始套接字protocol:协议–填0自动匹配底层,根据type系统默认自动帮助匹配对应协议传输层:IPPROTO_TCP、IPPROTO_UDP、IPPROTO_ICMP网络层: htons (ETH_P_IP|ETH_P_ARP|ETH_P_ALL)返回值:成功 文件描述符失败 -1,更新errno

bind

#include <sys/types.h> /* See NOTES */#include <sys/socket.h>intbind(intsockfd,conststructsockaddr*addr,socklen t addrlen);功能:绑定参数:socket:套接字addr:用于通信结构体(提供的是通用结构体,需要根据选择的通信方式,填充对应结构体--通信方式由当时socket第一个参数确定)addrlen:结构体大小返回值:成功0失败-1,更新errno通用结构体:structsockaddr{sa_family_t sa_family;charsa _data[14];}ipv4通信结构体:structsockaddr_in{sa_family_t sin_family;in_port_t sin_port;structin_addrsin_addr;};structin_addr{uint32_ts_addr;};本地通信结构体:structsockaddr_un{sa_family_t sun_family;/* AF_UNIX */charsun_path[108];/*pathname */};

listen

#include <sys/types.h> /* See NOTES */#include <sys/socket.h>intlisten(intsockfd,intbacklog);功能:监听,将主动套接字变为被动套接字参数:sockfd:套接字backlog:同时响应客户端请求链接的最大个数,不能写0.不同平台可同时链接的数不同,一般写510返回值:成功0失败-1,更新errno

accept

#include <sys/types.h> /* See NOTES */#include <sys/socket.h>intaccept(intsockfd,structsockaddr*addr,socklen_t*addrlen);accept(sockfd,NULL,NULL);阻塞函数,阻塞等待客户端的连接请求,如果有客户端连接,则accept()函数返回,返回一个用于通信的套接字文件;参数:Sockfd :套接字addr: 链接客户端的ip和端口号如果不需要关心具体是哪一个客户端,那么可以填NULL;addrlen:结构体的大小如果不需要关心具体是哪一个客户端,那么可以填NULL;返回值:成功:文件描述符;//用于通信失败:-1,更新errno

recv

ssize_trecv(intsockfd,void*buf,size_tlen,intflags);功能:接收数据参数:sockfd:用于通信的文件描述符buf 存放位置len 大小flags 一般填0,相当于read()函数MSG_DONTWAIT 非阻塞返回值:<0失败出错 更新errno==0表示客户端退出>0成功接收的字节个数

send

ssize_tsend(intsockfd,constvoid*buf,size_t len,intflags);功能:发送数据参数:sockfd:用于通信的文件描述符buf:发送内容存放的地址len:发送内存的长度flags:如果填0,相当于write();

connect

intconnect(intsockfd,conststructsockaddr*addr,socklen_t addrlen);功能:用于连接服务器;参数:sockfd:socket函数的返回值addr:填充的结构体是服务器端的;addrlen:结构体的大小返回值-1失败,更新errno正确0

代码

server.c

#include <sys/types.h> /* See NOTES */#include <sys/socket.h>#include <stdio.h>#include <netinet/in.h>#include <netinet/ip.h>#include <arpa/inet.h>#include <unistd.h>intmain(intargc,charconst*argv[]){// 1.创建流式套接字intsockfd=socket(AF_INET,SOCK_STREAM,0);if(sockfd<0){perror("socket err");return-1;}// 2.填充结构体信息structsockaddr_inaddr;addr.sin_family=AF_INET;addr.sin_port=htons(8888);addr.sin_addr.s_addr=inet_addr("192.168.1.77");// 3.绑定if(bind(sockfd,(structsockaddr*)&addr,sizeof(addr))<0){perror("bind err");return-1;}//4.监听if(listen(sockfd,5)<0){perror("listen err");return-1;}//5.等待客户端连接intacceptfd=accept(sockfd,NULL,NULL);if(acceptfd<0){perror("accept err");return-1;}//6.接收数据charbuf[32]={0};intret=recv(acceptfd,buf,sizeof(buf),0);if(ret<0){perror("recv err");return-1;}printf("%s\n",buf);//7.关闭套接字close(acceptfd);close(sockfd);return0;}

client.c

#include <sys/types.h> /* See NOTES */#include <sys/socket.h>#include <stdio.h>#include <netinet/in.h>#include <netinet/ip.h>#include <arpa/inet.h>#include <unistd.h>intmain(intargc,charconst*argv[]){// 1.创建流式套接字intsockfd=socket(AF_INET,SOCK_STREAM,0);if(sockfd<0){perror("socket err");return-1;}// 2.填充结构体信息structsockaddr_inaddr;addr.sin_family=AF_INET;addr.sin_port=htons(8888);addr.sin_addr.s_addr=inet_addr("192.168.1.77");// 3.连接if(connect(sockfd,(structsockaddr*)&addr,sizeof(addr))<0){perror("connect err");return-1;}//4.发送数据charbuf[32]="hello";intret=send(sockfd,buf,sizeof(buf),0);if(ret<0){perror("write err");return-1;}printf("send ok\n");//7.关闭套接字close(sockfd);return0;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 10:48:19

Solidity实战:构建一个去中心化投票系统

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 在快马平台上生成一个去中心化投票系统的Solidity智能合约。功能包括&#xff1a;创建投票提案、投票、查看投票结果。要求合约安全可靠&#xff0c;防止重复投票和篡改结果。使用A…

作者头像 李华
网站建设 2026/4/16 12:26:36

编程小白也能懂:图解面向对象与面向过程

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个交互式教学模块&#xff0c;用可视化方式展示面向对象和面向过程的区别。要求&#xff1a;1) 使用动物世界的比喻(如猫狗类vs.动物行为过程)&#xff1b;2) 提供可拖拽的UM…

作者头像 李华
网站建设 2026/4/1 18:49:27

扫雷游戏在算法教学中的实战应用

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个用于算法教学的扫雷游戏&#xff0c;重点展示游戏背后的算法逻辑。要求&#xff1a;1. 实现递归展开空白区域的算法&#xff1b;2. 可视化展示算法执行过程&#xff08;如高…

作者头像 李华
网站建设 2026/4/16 12:15:45

ENSP下载官网不适用?试试这些AI开发必备工具

YOLO&#xff1a;从实验室到产线的实时视觉引擎 在智能制造车间里&#xff0c;一台工业相机正以每秒30帧的速度扫描着高速运转的PCB板。不到50毫秒后&#xff0c;系统就准确标出了一个仅占图像0.5%面积的虚焊点&#xff0c;并触发了自动剔除机制——这背后没有复杂的规则引擎&a…

作者头像 李华
网站建设 2026/4/16 12:13:10

企业级Qt应用打包实战:从开发到交付全流程

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个企业级Qt应用打包系统&#xff0c;要求&#xff1a;1. 支持自动化代码签名(Windows的signtool和macOS的codesign)&#xff1b;2. 自动收集和验证第三方依赖库&#xff1b;3…

作者头像 李华
网站建设 2026/4/16 12:24:16

TestNG分组测试配置详解

分组测试的价值与TestNG优势‌ 在敏捷开发与持续集成实践中&#xff0c;测试用例的精细化管理成为保障软件质量的关键。TestNG作为Java领域主流的测试框架&#xff0c;通过‌分组测试‌功能&#xff0c;允许开发者基于功能模块、优先级或环境标签动态组织测试用例&#xff0c;实…

作者头像 李华