0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

socket、端口、进程的关系

科技绿洲 来源:Linux开发架构之路 作者:Linux开发架构之路 2023-11-10 15:02 次阅读

socket的引入是为了解决不同计算机间进程间通信的问题。

端口是TCP/IP协议中的概念,描述的是TCP协议上的对应的应用,可以理解为基于TCP的系统服务,或者说系统进程!如下图,FTP就需要占用特定的TCP端口。

图片

而 socket 呢,是网络编程中的概念,对TCP/IP协议进行了抽象和实现,并为应用层提供接口。这里的应用A,可以是FTP应用,它属于用户进程,通过socket与内核中的网络协议栈进行交互。

图片

socket 是核心,是枢纽,是进程与网络建立关系的必经之路!

1.内核是如何将数据包转发至 socket 的呢?

网络数据首先到达网卡,然后进入内核,由网络协议栈去处理,那么内核是如何进行数据分发的呢?它怎么知道该如何把数据交给特定的用户进程呢?
这时,就需要 socket 发挥作用了!
socket 中存储了特定的四元组:源ip+port,目的ip+port;

1 > bind 到特定 ip 和 port 的socket 对应 [src ip, src port) <= > (*, *)] ;
2 > connect 到特定目的ip+port 的 socket 对应 [src ip, src port) <= > (dst ip,  dst port)];
3 > accept 返回了的 socket 对应  [src ip, src port) <= > (dst ip,  dst port)];

那么内核根据数据包的四元组信息,就可以锁定特定的socket了。并可,系统中所有 socket 中的四元组信息,必定唯一,不可能重复!

2 进程与socket的关系是怎样的呢?

每个进程,在内核中都有一个表,保存了该进程申请并占用的所有 socket 描述符,在进程看来,socket 其实跟文件也没有什么不同,只不过通过描述符获得的对象不同而已,接口对应的系统调用也不同。
那么进程跟socket是一一对应的吗?
其实不然,socket是一种资源,就像文件一样,一个进程打开了,另一个进程也可以用,只不过socket比较特殊而已。
理论上,能够通过 sendmsg 将 socket 描述符传递给其他进程,这样其他进程就可以调用该描述符的接口了。这种场景确实不怎么会用到,也没有进行实际验证。
当然,父子进程间,还有线程间,进行 socket 的共享,是比较常见的。

3 进程与端口

进程与端口,其实并没有什么直接或必然的关系,关键还是socket!
wireshark 抓包查看tcp协议数据包详情:

总结

socket 的本质是一种资源,它包含了端到端的四元组信息,用来标识数据包的归属。因此,尽管 tcp 协议的端口号只有 65535 个,但是进程可拥有的 socket 数据却不限于此(受限于进程最大文件描述符数据);

PS:

一、端口简介

随着计算机网络技术的发展,原来物理上的接口(如键盘、鼠标、网卡、显示卡等输入/输出接口)已不能满足网络通信的要求,TCP/IP协议作为网络通信的标准协议就解决了这个通信难题。TCP/IP协议集成到操作系统的内核中,这就相当于在操作系统中引入了一种新的输入/输出接口技术,因为在TCP/IP协议中引入了一种称之为Socket(套接字)应用程序接口。有了这样一种接口技术,一台计算机就可以通过软件的方式与任何一台具有Socket接口的计算机进行通信。端口在计算机编程上也就是Socket接口。

有了这些端口后,这些端口又是如何工作呢?例如一台服务器为什么可以同时是Web服务器,也可以是FTP服务器,还可以是邮件服务器等等呢?其中一个很重要的原因是各种服务采用不同的端口分别提供不同的服务,比如:通常TCP/IP协议规定Web采用80号端口,FTP采用21号端口等,而邮件服务器是采用25号端口。这样,通过不同端口,计算机就可以与外界进行互不干扰的通信。

据专家们分析,服务器端口数最大可以有65535个,但是实际上常用的端口才几十个,由此可以看出未定义的端口相当多。这是那么多黑客程序都可以采用某种方法,定义出一个特殊的端口来达到入侵的目的的原因所在。为了定义出这个端口,就要依靠某种程序在计算机启动之前自动加载到内存,强行控制计算机打开那个特殊的端口。这个程序就是后门程序,这些后门程序就是常说的木马程序。简单的说,这些木马程序在入侵前是先通过某种手段在一台个人计算机中植入一个程序,打开某个(些)特定的端口,俗称后门(BackDoor),使这台计算机变成一台开放性极高(用户拥有极高权限)的FTP服务器,然后从后门就可以达到侵入的目的。

二、端口的分类

端口的分类根据其参考对象不同有不同划分方法,如果从端口的性质来分,通常可以分为以下三类:

(1)公认端口(Well KnownPorts):这类端口也常称之为常用端口。这类端口的端口号从0到1024,它们紧密绑定于一些特定的服务。通常这些端口的通信明确表明了某种服务的协议,这种端口是不可再重新定义它的作用对象。例如:80端口实际上总是HTTP通信所使用的,而23号端口则是Telnet服务专用的。这些端口通常不会像木马这样的黑客程序利用。

(2) 注册端口(Registered Ports):端口号从1025到49151。它们松散地绑定于一些服务。也是说有许多服务绑定于这些端口,这些端口同样用于许多其他目的。这些端口多数没有明确的定义服务对象,不同程序可根据实际需要自己定义,如后面要介绍的远程控制软件和木马程序中都会有这些端口的定义的。记住这些常见的程序端口在木马程序的防护和查杀上是非常有必要的。常见木马所使用的端口在后面将有详细的列表。

(3) 动态和/或私有端口(Dynamic and/or Private Ports):端口号从49152到65535。理论上,不应把常用服务分配在这些端口上。实际上,有些较为特殊的程序,特别是一些木马程序就非常喜欢用这些端口,因为这些端口常常不被引起注意,容易隐蔽。

如果根据所提供的服务方式的不同,端口又可分为TCP协议端口和UDP协议端口两种。因为计算机之间相互通信一般采用这两种通信协议。前面所介绍的连接方式是一种直接与接收方进行的连接,发送信息以后,可以确认信息是否到达,这种方式大多采用TCP协议;另一种是不是直接与接收方进行连接,只管把信息放在网上发出去,而不管信息是否到达,也就是前面所介绍的无连接方式。这种方式大多采用UDP协议,IP协议也是一种无连接方式。对应使用以上这两种通信协议的服务所提供的端口,也就分为TCP协议端口和UDP协议端口。

使用TCP协议的常见端口主要有以下几种:

(1) FTP:定义了文件传输协议,使用21端口。常说某某计算机开了FTP服务便是启动了文件传输服务。下载文件,上传主页,都要用到FTP服务。

(2)Telnet:它是一种用于远程登陆的端口,用户可以以自己的身份远程连接到计算机上,通过这种端口可以提供一种基于DOS模式下的通信服务。如以前的BBS是纯字符界面的,支持BBS的服务器将23端口打开,对外提供服务。

(3)SMTP:定义了简单邮件传送协议,现在很多邮件服务器都用的是这个协议,用于发送邮件。如常见的免费邮件服务中用的就是这个邮件服务端口,所以在电子邮件设置中常看到有这么SMTP端口设置这个栏,服务器开放的是25号端口。

socket介绍

socket为内核对象,由操作系统内核来维护其缓冲区,引用计数,并且可以在多个进程中使用。至于称它为“句柄”“文件描述符”都是一样的,它只不过是内核开放给用户进程使用的整数而已。

socket() 创建了一个socket内核对象。accept或者connect后,才可以对socket句柄读写。因为只有在 connect或者bind,listen,accept后才会设置好socket内核对象里边的ip和端口 。

在使用socket编程时,我们都知道在网络通信以前首先要建立连接,而连接的建立是通过对socket的一些操作来完成的。那么,建立连接的过程大致可以分为以下几步:

1) 建立socket套接字。

2) 给套接字赋予地址,这个地址不是通常的网络地址的概念。

3) 建立socket连接。

以下详细解释

1. 建立socket套接字。

使用socket建立套接字的时候,我们实际上是建立了一个数据结构。这个数据结构最主要的信息是指定了连接的种类和使用的协议,此外还有一些关于连接队列操作的结构字段(这里就先不涉及他们了)。

当我们使用socket函数以后,如果成功的话会返回一个int型的描述符,它指向前面那个被维护在内核里的socket数据结构。我们的任何操作都是通过这个描述符而作用到那个数据结构上的。这就像是我们在建立一个文件后得到一个文件描述符一样,对文件的操作都是通过文件描述符来进行的,而不是直接作用到inode数据结构上。我之所以用文件描述符举例,是因为socket数据结构也是和inode数据结构密切相关,它不是独立存在于内核中的,而是位于一个VFS inode结构中。所以,有一些比较抽象的特性,我们可以用文件操作来不恰当的进行类比以加深理解。

如前所述,当建立了这个套接字以后,我们可以获得一个象文件描述符那样的套接字描述符。就象我们对文件进行操作那样,我们可以通过向套接字里面写数据将数据传送到我们指定的地方,这个地方可以是远端的主机,也可以是本地的主机。如果你有兴趣的话,还可以用socket机制来实现IPC,不过效率比较低,试试也就行了(没有试过)。

2. 给套接字赋予地址。

依照建立套接字的目的不同,赋予套接字地址的方式有两种:服务器端使用bind,客户端使用connetc。

Bind:

我们都知道,只要使用IP, prot就可以区分一个tcp/ip连接(当然这个连接指的是一个连接通道,如果要区分特定的主机间的连接,还需要第三个属性 hostname)。

我们可以使用bind函数来为一个使用在服务器端例程中的套接字赋予通信的地址和端口。

在这里我们称通信的IP地址和端口合起来构成了一个socket地址,而指定一个socket使用特定的IP和port组合来进行通行的过程就是赋予这个socket一个地址。要赋予socket地址,就得使用一个数据结构来指明特定的socket地址,这个数据结构就是struct sockaddr。对它的使用我就不说了,因为这篇文档的目的是澄清概念而不是说明使用方法。Bind函数的作用就是将这个特定的标注有socket地址信息的数据结构和socket套接字联系起来,即赋予这个套接字一个地址。但是在具体实现上,他们两个是怎么联系在一起的,我还不知道。

一个特定的socket的地址的生命期是bind成功以后到连接断开前。你可以建立一个socket数据结构和socket地址的数据结构,但是在没有bind以前他们两个是没有关系的,在bind以后他们两个才有了关系。这种关系一直维持到连接的结束,当一个连接结束时,socket数据结构和socket地址的数据结构还都存在,但是他们两个已经没有关系了。如果你要是用这个套接字在socket地址上重新进行连接时,需重新bind他们两个。再注明一次,我说的这个连接是一个连接通道,而不是特定的主机之间的连接。

Bind指定的IP通常是本地IP(一般不特别指定,而使用INADDR_ANY来声明),而最主要的作用是指定端口。在服务器端的socket进行了bind以后就是用listen来在这个socket地址上准备进行连接。

connect:

对于客户端来说,是不会使用bind的(并不是不能用,但没什么意义),他们会通过connet函数来建立socket和socket地址之间的关系。其中的socket地址是它想要连接的服务器端的socket地址。在connect建立socket和socket地址两者关系的同时,它也在尝试着建立远端的连接。

3. 建立socket连接。

对于准备建立一个连接,服务器端要两个步骤:bind, listen;客户端一个步骤:connct。如果服务器端accept一个connect,而客户端得到了这个accept的确认,那么一个连接就建立了。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Socket
    +关注

    关注

    0

    文章

    179

    浏览量

    34443
  • 网络协议
    +关注

    关注

    3

    文章

    240

    浏览量

    21371
  • TCP
    TCP
    +关注

    关注

    8

    文章

    1272

    浏览量

    78301
  • 端口
    +关注

    关注

    4

    文章

    820

    浏览量

    31588
收藏 人收藏

    评论

    相关推荐

    【我是电子发烧友】详解Linux的SOCKET编程

    SOCKET编程,应坛友的要求1. 网络中进程之间如何通信进程通信的概念最初来源于单机系统。由于每个进程都在自己的地址范围内运行,为保证两个相互通信的
    发表于 05-12 09:01

    【100ASK_IMX6ULL(带屏) 开发板试用体验】基于unix socket的单主进程双从进程全双工通信

    IP地址和端口号,而unix socket是通过存储于磁盘上的文件实现,这个文件由主进程bind()生成,只要主进程与从进程在生成
    发表于 11-08 15:08

    一文解析sal socket与其他socket之间的关系

    1、sal socket与其他socket关系结合结构体之间的引用关系图,与下图看;从 uml 对象关系图中可以得到下面的信息:从 sal
    发表于 06-28 17:50

    多个socket使用相同端口,不同IP地址该如何实现?

    目前使用CH395Q芯片,手册5.26明确说明了"如果两个或者多个 Socket 都采用相同的模式,则源端口号不得相同。"但现在实际使用中想实现端口复用的功能,即两个socket
    发表于 10-13 06:35

    socket编程基础

    函数说明socket()用来建立一个新的socket,也就是向系统注册,通知系统建立一通信端口。参数domain 指定使用何种的地址类型,完整的定义在/usr/include/bits/soc
    发表于 12-09 14:59 0次下载

    Socket网络基础编程

    常用的进程之间通信机制,通过它不仅能实现本地机器上的进程之间的通信,而且通过网络能够在不同机器上的进程之间进行通信。 每一个socket都用一个半相关描述{协议、本地地址、本地
    发表于 10-18 17:13 3次下载

    socket是什么意思_socket编程是什么意思_socket详解

    从编程语言的角度,socket是一个无符号整型变量,用来标识一个通信进程。两个进程通信,总要知道这几个信息:双方的ip地址和端口号,通信所采用的协议栈。
    发表于 12-28 17:21 2.3w次阅读

    你知道linux socket进程通信是怎样实现的?

    socket进程通信与网络通信使用的是统一套接口,只是地址结构与某些参数不同
    发表于 04-23 14:49 2482次阅读
    你知道linux <b class='flag-5'>socket</b><b class='flag-5'>进程</b>通信是怎样实现的?

    socket编程到底是什么

    简称套接字,是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多数是基于socket来完成通信的。
    的头像 发表于 01-16 17:36 3056次阅读

    Socket套接字的原理说明

    和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字 (Socket)的接口,区分不同应用程序进程间的网络通信和连接。 生成套接字主要有3个参数:通信的目的IP地址、使用的传输层协议(TCP或UDP)和使用的端口
    的头像 发表于 06-18 19:16 1501次阅读
    <b class='flag-5'>Socket</b>套接字的原理说明

    Linux进程间的五种通信方式介绍 4

    进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息。IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享内存、Socket(套接字)等。其中
    的头像 发表于 02-15 10:19 412次阅读

    什么是Socket连接?Socket与TCP连接的关系

    主机 A 的应用程序必须通过 Socket 建立连接才能与主机B的应用程序通信,而建立 Socket 连接需要底层 TCP/IP 协议来建立 TCP 连接。 而建立 TCP 连接需要底层 IP 协议来寻址网络中的主机。
    发表于 03-31 15:10 747次阅读

    什么是Socket连接?与TCP连接有什么关系

    什么是Socket连接?它与TCP连接有什么关系? 计算机网络是我们日常生活中不可或缺的一部分,而Socket连接则是网络通信中必不可少的一种机制。Socket是应用层与TCP/IP协
    的头像 发表于 05-23 11:43 411次阅读

    网络中进程之间如何通信

    socket?那什么是socketsocket的类型有哪些?还有socket的基本函数,这些都是本文想介绍的。本文的主要内容如下: 1、网络中
    的头像 发表于 11-13 10:48 180次阅读
    网络中<b class='flag-5'>进程</b>之间如何通信

    什么是Socket连接?Socket的工作原理 它与TCP连接有什么关系

    什么是Socket连接?Socket的工作原理 它与TCP连接有什么关系Socket连接是一种网络连接,用于在计算机网络中的两个节点之间传输数据。它是一种全双工、可靠的通信方法,可
    的头像 发表于 01-22 16:10 411次阅读