当前位置: 首页 > article >正文

Linux C/C++编程-网络程序架构与套接字类型

【图书推荐】《Linux C与C++一线开发实践(第2版)》_linux c与c++一线开发实践pdf-CSDN博客
《Linux C与C++一线开发实践(第2版)(Linux技术丛书)》(朱文伟,李建英)【摘要 书评 试读】- 京东图书 (jd.com)

Linux系统与编程技术_夏天又到了的博客-CSDN博客

本书讲述的Linux网络编程是指用户态网络编程,Linux网络编程还包括内核态网络编程。顾名思义,用户态网络编程开发的程序都是在用户态运行的,内核态网络编程开发的程序都是在内核态运行的。实际上,内核态网络编程和用户态网络编程的概念类似,一般掌握了用户态网络编程后,实现内核态网络编程基本上就是替换一下函数形式。

Linux用户态网络编程主要基于套接字API,套接字API是Linux提供的一种网络编程接口。通过套接字API,开发人员既可以在传输层上进行网络编程,也可以跨越传输层直接对网络层进行开发。套接字API已经是用户态网络编程必须掌握的内容。套接字编程可以分为TCP套接字编程、UDP套接字编程和原始套接字编程,我们将在后面的章节分别叙述。

socket的中文称呼为套接字或套接口,是TCP/IP网络编程中的基本操作单元,可以看作不同主机进程之间相互通信的端点。套接字是应用层与TCP/IP协议簇通信的中间软件抽象层,一组接口把复杂的TCP/IP协议簇隐藏在套接字接口后面。某个主机上的某个进程通过该进程中定义的套接字可以与其他主机上同样定义了套接字的进程建立通信,传输数据。

socket起源于UNIX,在UNIX一切皆文件的哲学思想下,socket是一种“打开—读/写—关闭”模式的实现。服务器和客户端各自维护一个“文件”,在建立连接后,可以向自己的文件写入内容供对方读取或者读取对方的内容,通信结束时关闭文件。当然这只是一个大体路线,实际上编程时还有不少细节需要考虑。

无论Windows平台还是Linux平台,都对套接字实现了自己的一套编程接口。Windows下的socket实现叫Windows Socket。Linux下的实现有两套:一套是伯克利套接口(Berkeley Sockets),起源于Berkeley UNIX,这套接口很简单,得到了广泛应用,已经成为Linux网络编程事实上的标准;另一套是传输层接口(Transport Layer Interface,TLI),它是System V系统上的网络编程API,所以这套编程接口更多的是在UNIX上使用。

简单地介绍一下System V和BSD(Berkeley Software Distribution)。System V的鼻祖正是1969年AT&T开发的UNIX,随着1993年Novell收购AT&T后开放了UNIX的商标,System V的风格也逐渐成为UNIX厂商的标准。BSD的鼻祖是加州大学伯克利分校在1975年开发的BSD UNIX,后来被开源组织发展为现在众多的BSD操作系统。这里需要说明的是,Linux不能称为“标准的UNIX”而只能称为“UNIX Like”,有一部分原因就来自它的操作风格介于System V和BSD之间,而且不同的厂商为了照顾不同的用户,各个Linux发行版本的操作风格也大不相同。本书讲述的Linux网络编程都是基于Berkeley Sockets API的。

socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口,供应用层调用已实现的进程在网络中通信。socket在TCP/IP中的地位如图12-1所示。

图12-1

由图12-1可以看出,socket编程接口其实就是用户进程(应用层)和传输层之间的编程接口。

网络程序通常有两种架构,一种是B/S架构(Browser/Server,浏览器/服务器),比如我们使用火狐浏览器浏览Web网站,火狐浏览器就是一个Browser,网站上运行的Web服务器就是一个Server。这种架构的优点是用户只需要在自己计算机上安装一个网页浏览器就可以了,主要工作逻辑都在服务器上完成,减轻了用户端的升级和维护的工作量。另一种架构是C/S架构(Client/Server,客户机/服务器),这种架构要在服务器端和客户机端分别安装不同的软件,并且对于不同的应用,客户机端也要安装不同的客户机软件,有时候客户机端的软件安装或升级比较复杂,因此维护起来成本较高。这种架构的优点是可以较充分地利用两端的硬件能力,较为合理地分配任务。值得注意的是,客户机和服务器实际上是指两个不同的进程,服务器是提供服务的进程,客户机是请求服务和接收服务的进程,它们通常位于不同的主机上(也可以是同一主机上的两个进程),这些主机由网络连接,服务器端提供服务并对来自客户机端的请求做出响应。比如我们计算机上安装的QQ程序就是一个客户机端,而在腾讯公司内部还有服务端程序。

基于套接字的网络编程中,通常使用C/S架构。一个简单的客户机和服务器之间的通信过程如下:

(1)客户机向服务器提出一个请求。

(2)服务器收到客户机的请求,进行分析处理。

(3)服务器将处理的结果返回给客户机。

通常,一个服务器可以向多个客户机提供服务。因此对服务器来说,还需要考虑如何有效地处理多个客户机的请求。

在Linux系统下,有以下3种类型的套接字。

1)流套接字(SOCK_STREAM)

流套接字用于提供面向连接的、可靠的数据传输服务。该服务将保证数据能够实现无差错、无重复发送,并按顺序接收。流套接字之所以能够实现可靠的数据服务,原因在于它使用了传输控制协议,即TCP。

2)数据报套接字(SOCK_DGRAM)

数据报套接字提供了一种无连接的服务。该服务并不能保证数据传输的可靠性,数据有可能在传输过程中丢失或出现重复,且无法保证按顺序接收到数据。数据报套接字使用UDP进行数据的传输。由于数据报套接字不能保证数据传输的可靠性,因此有可能出现数据丢失的情况,需要在程序中做相应的处理。

3)原始套接字(SOCK_RAW)

原始套接字允许直接访问较低层次的协议,比如IP、ICMP,常用于检验新的协议实现,或者访问现有服务中配置的新设备。因为RAW_SOCKET可以自如地控制Linux下的多种协议,能够对网络底层的传输机制进行控制,所以可以应用原始套接字来操纵网络层和传输层应用。比如,我们可以通过RAW_SOCKET来接收发向本机的ICMP、IGMP协议包,或者接收TCP/IP栈不能够处理的IP包,也可以用来发送一些自定义包头或自定义协议的IP包。网络监听技术经常会用到原始套接字。

原始套接字与标准套接字(标准套接字包括流套接字和数据报套接字)的区别在于:原始套接字可以读写内核没有处理的IP数据包,而流套接字只能读取TCP的数据,数据报套接字只能读取UDP的数据。


http://www.kler.cn/a/460899.html

相关文章:

  • springboot集成qq邮箱服务
  • 【大模型】wiki中文语料的word2vec模型构建
  • C++ 设计模式:备忘录模式(Memento Pattern)
  • springboot 跨域配置
  • 招银网路Java后端一面,难度有点大!
  • 【UE5】UnrealEngine源码构建2:windows构建unreal engine 5.3.2
  • 【Java 新特性】深入浅出 Java Lambda 表达式
  • vim里搜索关键字
  • 【Windows】Windows系统查看目录中子目录占用空间大小
  • YK人工智能(二)——万字长文了解深度学习环境配置
  • grep如何打印行数
  • C++线程池的使用
  • 智能商业分析 Quick BI
  • Spring Security 3.0.2.3版本
  • 为什么需要设置 `NCCL_P2P_DISABLE=1` 和 `NCCL_IB_DISABLE=1`?
  • 4G报警器WT2003H-16S低功耗语音芯片方案开发-实时音频上传
  • 国产低代码框架zdppy开发笔记001 zdppy_api快速入门
  • 《鸿蒙HarmonyOS应用开发从入门到精通(第2版)》学习笔记——HarmonyOS架构介绍
  • 力扣-数据结构-8【算法学习day.79】
  • 石岩路边理发好去处
  • Kerberos用户认证-数据安全-简单了解-230403
  • 二十三种设计模式-工厂方法模式
  • 【UE5】UnrealEngine源码构建1:tag为5.3.2源码clone
  • 与你共度的烟火日常
  • 开源即时通讯IM框架MobileIMSDK的鸿蒙NEXT端开发快速入门
  • 使用 `@Async` 实现 Spring Boot 异步编程