2026/3/19 19:03:40
网站建设
项目流程
冷水江网站定制,齐家装饰公司官网,wordpress用户注册收不到邮件,找附近的装修公司目录认识源IP地址和目的IP地址认识端口号端口号(port)是传输层协议的内容.端口号范围划分理解 端口号 和 进程 ID理解源端口号和目的端口号理解 socket传输层的典型代表认识UDP协议认识TCP协议网络字节序字节序网络数据流socket编程接口常见APIsockadd…目录认识源IP地址和目的IP地址认识端口号端口号(port)是传输层协议的内容.端口号范围划分理解 端口号 和 进程 ID理解源端口号和目的端口号理解 socket传输层的典型代表认识UDP协议认识TCP协议网络字节序字节序网络数据流socket编程接口常见APIsockaddr 结构认识源IP地址和目的IP地址IP地址标识主机的唯一性源IP地址表示当前发送方是谁目的IP地址表示要发给谁接收方是谁源 IP 地址是发送 IP 数据报的主机 / 网络设备的网络层标识用于明确数据的来源节点。目的 IP 地址是接收 IP 数据报的主机 / 网络设备的网络层标识用于明确数据的最终目标节点。认识端口号在网络中传输数据不是目的将数据交给主机也不是目的交给主机内部的进程才是目的。进程是人在系统中的代表将数据交给进程就相当于人拿到了数据。一台主机中有多个进程通过目的IP地址就算知道了要往哪一台主机发送数据如何把数据交给指定进程呢端口号是用来标识网络上的某一台主机中的某一个进程。一个端口号只能绑定一个进程而一个进程可以被多个端口号绑定只要保证通过端口号找到唯一的一个进程就可以了。端口号(port)是传输层协议的内容.端口号是一个2 字节 16 位的整数端口号用来标识一个进程, 告诉操作系统, 当前的这个数据要交给哪一个进程来处理IP 地址 端口号能够标识网络上的某一台主机的某一个进程一个端口号只能被一个进程占用端口号范围划分0 - 1023:知名端口号, HTTP, FTP, SSH 等这些广为使用的应用层协议, 他们的端口号都是固定的.1024 - 65535: 操作系统动态分配的端口号. 客户端程序的端口号就是由操作系统从这个范围分配的.理解 “端口号” 和 “进程 ID”端口号和进程ID都是标识进行的唯一性为什么又有端口号又有进程ID呢直接使用进程ID就好了呀。进程 ID 属于系统概念技术上也具有唯一性确实可以用来标识唯一的一个进程但是这样做会让系统进程管理和网络强耦合实际设计的时候并没有选择这样做。理解源端口号和目的端口号传输层协议(TCP 和 UDP)的数据段中有两个端口号, 分别叫做源端口号和目的端口号. 就是在描述“数据是谁发的, 要发给谁”.理解 socket网络间通信本质就是两个进程在通信只不过不是同一台主机中的两个进程通信而是网络中的两个进程在通信IP端口号可以标识网络中的某一个进程而IP端口号就是socket。综上IP 地址用来标识互联网中唯一的一台主机port 用来标识该主机上唯一的一个网络进程IPPort 就能表示互联网中唯一的一个进程所以通信的时候本质是两个互联网进程代表人来进行通信{srcIpsrcPortdstIpdstPort}这样的 4 元组就能标识互联网中唯二的两个进程所以网络通信的本质也是进程间通信我们把 ipport 叫做套接字 socket传输层的典型代表如果我们了解了系统也了解了网络协议栈我们就会清楚传输层是属于内核的那么我们要通过网络协议栈进行通信必定调用的是传输层提供的系统调用来进行的网络通信。我们所写的代码都是在应用层进行的所以如果想写网络的代码需要调用系统调用。认识UDP协议此处我们也是对 UDP(User Datagram Protocol 用户数据报协议)有一个直观的认识; 后面再详细讨论不可靠无连接面向数据报传输层协议认识TCP协议此处我们先对 TCP(Transmission Control Protocol 传输控制协议)有一个直观的认识;后面我们再详细讨论 TCP 的一些细节问题.可靠传输有连接面向字节流传输层协议udp和tcp区别不可靠在哪里TCP协议在数据传输过程中如果数据有丢失会重传而UDP协议不会什么是有连接和无连接TCP协议在传输之前会先和目标主机建立连接就像打电话一样会先喂喂喂建立连接而UDP协议不会就像对讲机一样发送完数据就完成了。什么是面向字节流就像传文件管道传输可以类比之前的文件流数据被视为一连串无结构的字节序列。发送方和接收方之间就像建立了一条管道数据源源不断地流过去。什么是面向数据报就像寄信包裹传输数据被视为一个个独立的、有边界的数据包。发送方发一个包接收方就收一个包。网络字节序字节序字节序指的是多字节数据在内存中的存储顺序主要分两种主机字节序不同 CPU 架构的存储习惯比如 x86/x64 是小端序部分嵌入式 CPU 是大端序没有统一标准。网络字节序TCP/IP 协议强制规定的统一标准大端序目的是让不同架构的主机能正确解析彼此的通信标识IP、端口。网络数据流我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分, 磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分, 网络数据流同样有大端小端之分.那么如何定义网络数据流的地址呢?发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存因此,网络数据流的地址应这样规定:先发出的数据是低地址,后发出的数据是高地址TCP/IP 协议规定,网络数据流应采用大端字节序,即低地址高字节不管这台主机是大端机还是小端机, 都会按照这个 TCP/IP 规定的网络字节序来发送/接收数据如果当前发送主机是小端, 就需要先将数据转成大端; 否则就忽略, 直接发送即可;如果主机A是小端主机B是大端那么主机A想主机B发送数据时数据会解析错误。举个例子假设你的主机是小端序端口 80十六进制0x0050在内存中存储为0x50 0x00如果直接传输接收方比如大端序主机会解析成0x5000十进制 20480完全偏离实际端口通信直接失败。所以在网络通信的过程中网络数据流应采用大端字节序。为使网络程序具有可移植性,使同样的 C 代码在大端和小端计算机上编译后都能正常运行,可以调用以下库函数做网络字节序和主机字节序的转换。这些函数名很好记,h 表示 host,n 表示 network,l 表示 32 位长整数,s 表示 16 位短整数。例如 htonl 表示将 32 位的长整数从主机字节序转换为网络字节序,例如将 IP 地址转换后准备发送。如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回。如果主机是大端字节序,这些函数不做转换,将参数原封不动地返回。注意在写socket编程时需要将端口号和IP地址转成网络序列传输的数据不用转换成网络序列。为什么端口号 / IP 地址必须转网络序端口号16 位整数、IPv4 地址32 位整数的本质是多字节的数值型数据且是 TCP/IP 协议头的核心字段必须满足以下两点协议强制要求TCP/IP 协议栈规定协议头中的端口、IP 等字段必须以网络字节序大端传输。跨主机兼容性不同主机的主机字节序可能不同只有统一为网络字节序才能保证无论双方是什么架构都能正确解析 “要和谁通信”IP、“通信的哪个应用”端口。为什么传输的数据不用转网络序传输的数据比如文本、文件、自定义二进制数据的本质是字节流byte stream而非 “协议头的数值型标识”核心原因有 2 点单字节数据无字节序问题大部分传输的数据是文本如 HTTP、JSON、普通字符串每个字符仅占1 个字节ASCII/UTF-8。单字节数据不存在 “顺序颠倒” 的问题 —— 无论大端还是小端主机单个字节的内容比如字符’a’的 ASCII 码0x61都是完全一致的按接收顺序拼接即可。多字节数据的处理权在应用层如果传输的是多字节数值比如 int、long 类型的业务数据如 “用户 ID123456”并非 “绝对不用转”而是TCP/IP 协议栈不强制处理需要应用层自己约定字节序比如统一转大端。比如你要传输一个 32 位整数123456如果直接传小端序的字节接收方大端会解析错误但这是应用层的问题而非协议层的要求 —— 协议栈只负责 “传字节”不负责 “解析字节的含义”。简单来说协议栈只负责 “通信链路的标识IP / 端口” 的统一解析而 “数据内容” 的解析规则由应用程序自己定这也是网络编程中 “应用层协议”如 HTTP、自定义二进制协议存在的原因之一。socket编程接口常见API// 创建 socket 文件描述符 (TCP/UDP, 客户端 服务器) int socket(int domain, int type, int protocol); // 绑定端口号 (TCP/UDP, 服务器) int bind(int socket, const struct sockaddr *address,socklen_t address_len); // 开始监听 socket (TCP, 服务器) int listen(int socket, int backlog); // 接收请求 (TCP, 服务器) int accept(int socket, struct sockaddr* address,socklen_t* address_len); // 建立连接 (TCP, 客户端) int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);sockaddr 结构既有网络socket通信也有本地的socket通信还有原始socket通信socket有很对种类来满足不同的应用场景这么多种socket类型我们要每一种都实现一套接口规范吗答案是NO16位地址类型来表示socket通信类型struct sockaddr_in表示网络通信struct sockaddr_un表示unix域间通信本地通信socket API 可以都用 struct sockaddr *类型表示, 在传递参数的时候强转成struct sockaddr *即可。