【无标题】

一、网络通信基础

在当今数字化时代,不同主机间的通信至关重要。以两个分别位于西安和成都的 QQ 用户为例,他们之间的通信需要借助物理层面和软件层面的通路来实现。

(一)物理通路

  • 有线和无线连接的多样性
    • 有线连接:提供了稳定可靠的通信基础,是传统网络通信的重要方式之一。
    • 5G 和 4G 无线通信:随着移动通信技术的不断发展,5G 和 4G 为用户带来了高速的数据传输体验。5G 具有更高的带宽、更低的延迟和更大的连接密度,能够满足日益增长的物联网和高清视频等应用需求。4G 则在广泛覆盖和成熟技术方面具有优势,为用户提供了较为稳定的移动网络连接。
    • 星链等新兴技术:星链等卫星通信技术的出现,为全球范围内的网络覆盖提供了新的解决方案。尤其是在偏远地区或自然灾害等情况下,卫星通信可以作为重要的备用通信手段,确保信息的传输不受地理条件的限制。
  • 不同通信方式的特点和应用场景
    • 有线连接适用于固定场所的网络需求,如办公室、家庭等,能够提供稳定的高速网络连接,适合大数据量的传输和对网络稳定性要求较高的应用场景。
    • 5G 和 4G 无线通信则适用于移动设备和需要灵活网络接入的场景,如智能手机、平板电脑等移动终端用户可以随时随地接入网络,进行各种在线活动。同时,5G 和 4G 也为智能交通、工业自动化等领域的发展提供了有力支持。
    • 星链等卫星通信技术主要应用于偏远地区、海洋、航空等无法通过传统有线或无线通信覆盖的区域,为这些地区的用户提供网络连接服务。此外,在应急救援等特殊情况下,卫星通信也能够发挥重要作用。

(二)软件通路

  • OSI 七层模型与实际应用模型
    • 为了解决不同体系结构的网络的互联问题,国际标准化组织 ISO 于 1981 年制定了开放系统互连参考模型(OSI/RM),即 OSI 七层模型。这七层分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。每个层次都有其特定的功能和职责,共同协作实现网络通信。
    • 然而,在实际应用中,主要使用的是 tcp/ip 模型,它可以分为应用层、传输层、网络层、数据链路层和物理层,或者四层模型,即应用层、传输层、网络层和网络接口层。这些模型更加简洁实用,能够满足大多数网络通信的需求。
  • 各层次的功能和协议规范
    • 物理层:规定了物理层面的电气特性及相关机械特性。物理层面数据的传输是以一位一位二进制数据(比特流)的形式进行。物理层的主要任务是确保数据在物理介质上的正确传输,包括信号的编码、解码、传输速率的控制等。
    • 数据链路层:规定了传输数据的格式(帧数据),并控制传输过程的可靠性。数据链路层负责将物理层传输的比特流组织成帧,进行差错检测和纠正,以及流量控制等功能,确保数据在相邻节点之间的可靠传输。
    • 网络层(网际层):用于解决网络与网络之间数据传输(数据包)。网络层的主要功能是实现不同网络之间的互联,通过 IP 地址进行数据包的路由选择,确保数据能够准确地从源主机传输到目标主机。
    • 传输层:传输控制层,控制传输过程,保证数据完整和可靠。传输层主要有两种协议,TCP(传输控制协议)和 UDP(用户数据报协议)。TCP 是一种面向连接的协议,能够提供高可靠性的通信服务;UDP 是一种无连接的协议,具有高效的数据传输性能,但可靠性相对较低。
    • 会话层:处理一次会话过程。会话层负责建立、维护和管理通信双方之间的会话连接,协调数据的交互过程,确保会话的有序进行。
    • 表示层:规定了传输数据的格式和方式(加密)。表示层主要负责数据的格式转换、加密和解密、压缩和解压缩等功能,确保不同系统之间能够正确地理解和处理数据。
    • 应用层:就是直接获取要收发的数据。应用层是用户与网络之间的接口,各种应用程序通过应用层协议与网络进行交互,如 HTTP、FTP、SMTP 等协议。

二、操作系统角度的网络通信

从操作系统的角度来看,网络通信涉及用户层和内核层。用户层的程序员通过应用层与内核层进行交互,内核层实现了传输层、网络层、数据链路层和物理层的功能,其中 tcp/ip 协议栈起到了关键作用。

(一)IP 地址

  • IP 地址的本质和表示方式
    • IP 用来标识网络中的一台主机,本质是 32 位整型数值,以点分十进制表示,如 192.168.1.149。这种表示方式更加直观,便于用户记忆和使用。
  • IP 地址的组成和作用
    • IP 地址由网络号和主机号组成,网络号表示主机所处的网络,主机号表示该网络能容纳的主机。通过 IP 地址,可以准确地定位网络中的一台主机,实现数据的准确传输。

(二)端口号

  • 端口号的数值范围和作用
    • 端口号是 16 位数值(unsigned short),范围是 0~65535。端口号用于表示主机中某一个具体进行网络通信的进程。每一个应用程序进程都有一个唯一的端口号,通过端口号可以区分数据包属于哪个应用程序进程,确保数据能够正确地传输到目标进程。
  • 端口号的分类和管理
    • 端口号一般由 IANA(Internet Assigned Numbers Authority)管理,分为众所周知端口(1~1023)、已登记端口(1024~49151)和动态或私有端口(49152~65535)。
    • 众所周知端口(1~1023)主要分配给标准应用服务软件,如 http 协议用到的端口号 80。
    • 已登记端口(1024~49151)是注册端口号,非标准应用服务软件的软件可以申请使用这个范围内的端口号。
    • 动态或私有端口(49152~65535)是系统动态分配给应用程序使用的端口号。

(三)掩码

  • 掩码的作用和计算方法
    • 掩码用于确定 IP 地址中的网络号和主机号。例如,对于 IP 地址 192.168.1.149 和掩码 255.255.255.0,通过按位与运算可以得到网络地址为 192.168.1.0。掩码的作用是将 IP 地址划分成网络地址和主机地址两部分,以便在网络中进行路由选择和数据包的转发。

三、网络编程协议

网络编程中主要涉及 TCP 和 UDP 两种协议。

(一)TCP 协议

  • 特点和适用场景
    • TCP 是一种面向连接的传输层协议,能提供高可靠性通信,具有面向连接、可靠传输和面向字节流等特点。
    • 面向连接意味着在进行数据传输之前,通信双方需要先建立连接,类似于打电话通话之前必须先打通。这种连接保证了数据传输的可靠性和有序性。
    • 可靠传输是通过 TCP 协议机制中的确认、重传、流量控制等功能实现的,确保数据无误、无丢失、无失序、无重复到达。
    • 面向字节流表示 TCP 把数据看成一连串无结构的字节流,进行传输和处理。
    • TCP 适用于对传输质量要求较高、传输大量数据的场合,如 QQ 等即时通讯软件的用户登录账户管理相关功能。在这些场景下,数据的准确性和完整性至关重要,TCP 协议能够提供可靠的保障。

(二)UDP 协议

  • 特点和适用场景
    • UDP 是不可靠的无连接协议,在数据发送前不需要进行连接,因此可以进行高效率的数据传输。
    • UDP 具有不可靠、无连接和数据报等特点。不可靠意味着 UDP 不保证数据的可靠传输,可能会出现数据丢失、重复或乱序的情况。无连接表示通信双方在发送数据之前不需要建立连接,直接将数据封装成数据报进行发送。
    • UDP 适用于发送小尺寸数据(如对 DNS 服务器进行 IP 地址查询时)、在接收到数据给出应答较困难的网络中使用 UDP(如无线网络)、适合于广播 / 组播式通信中,以及 MSN/QQ/Skype 等即时通讯软件的点对点文本通讯以及音视频通讯通常采用 UDP 协议,流媒体、VOD、VoIP、IPTV 等网络多媒体服务中通常采用 UDP 方式进行实时数据传输。在这些场景下,对数据传输的实时性要求较高,而对数据的可靠性要求相对较低,UDP 协议能够满足这些需求。

四、编程模型

网络编程有多种模型,包括 c/s(客户端 - 服务器模型)、b/s(浏览器 - 服务器模型)和 p2p(点对点传输)。

(一)基于 UDP 的 c/s 通信模型

  • 客户端(client)
    • 客户端是主动的角色,通过 socket 进行网络通信。socket 有两种含义,一是一种特殊的文件,专门用于网络通信(不同主机间的进程);二是 socket 编程接口,即 socket 函数。socket 函数用于向内核提出创建一个基于内存的套接字描述符,参数包括 domain(地址族,用于指定通信范围,如 ipv4、ipv6 等)、type(套接字类型,如 SOCK_STREAM 对应 TCP,SOCK_DGRAM 对应 UDP)和 protocol(协议,通常为 0 表示自动适应应用层协议)。
    • 客户端使用 sendto 函数发送数据,该函数的参数包括用于通信的 socket 对应的 fd、表示要发送的数据所在的一块空间、表示发送的字节数、默认值为 0 的 flags、表示要发送到的地址(网络地址 ip + 端口号)以及表示 dest_addr 这个参数的长度。
  • 服务器端(server)
    • 服务器端是被动的角色,同样通过 socket 进行网络通信。服务器端使用 recvfrom 函数接收数据,该函数的参数与 sendto 函数类似,用于接收来自客户端的数据。

(二)数字和字符串转换函数

  • 数字转换函数
    • 在网络编程中,数字转换函数用于主机字节序和网络字节序之间的转换。例如,uint32_t htonl(uint32_t hostlong)uint16_t htons(uint16_t hostshort)用于主机转网络,将主机字节序的 32 位和 16 位整数转换为网络字节序。uint32_t ntohl(uint32_t netlong)uint16_t ntohs(uint16_t netshort)用于网络转主机,将网络字节序的 32 位和 16 位整数转换为主机字节序。
  • 字符串转换函数
    • 字符串转换函数用于将 IP 地址的字符串表示形式转换为网络字节序的整数表示形式,以及将网络字节序的整数表示形式转换为 IP 地址的字符串表示形式。例如,in_addr_t inet_addr(const char *cp)用于主机转网络,将 IP 地址的字符串表示形式转换为网络字节序的整数表示形式。char *inet_ntoa(struct in_addr in)用于网络转主机,将网络字节序的整数表示形式转换为 IP 地址的字符串表示形式。

综上所述,网络编程涉及多个层面的知识和技术,包括物理通路和软件通路的建立、IP 地址和端口号的管理、TCP 和 UDP 协议的特点和应用场景、编程模型的选择以及数字和字符串转换函数的使用等。理解这些内容对于开发高效、可靠的网络应用程序至关重要。

  • 12
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值