【问题标题】:What's the difference between endpoint and socket?端点和套接字有什么区别?
【发布时间】:2018-05-09 09:24:09
【问题描述】:

我见过的几乎所有套接字定义都与术语端点密切相关:

wikipedia:

网络套接字是用于发送或接收数据的内部端点 在计算机网络中的单个节点上。具体来说,它是一个 此端点在网络软件中的表示

This answer:

套接字是(双向)通信中的端点

Oracle's definition:

套接字是两个之间双向通信链路的一个端点 在网络上运行的程序

甚至stackoverflow对标签“sockets”的定义是:

双向进程间通信流的端点

This other answer 更进一步:

TCP 套接字是一个端点实例

虽然我不明白在这种情况下“实例”是什么意思。如果端点是,根据this 的回答,是一个 URL,我看不出它是如何被实例化的。

【问题讨论】:

  • @OliverCharlesworth 谢谢,但这无助于澄清差异
  • 区别类似于“车辆和汽车有什么区别?” - 汽车是一种特殊类型的车辆。
  • @OliverCharlesworth 如果套接字对端点就像汽车对车辆,那么除了套接字之外还有其他类型的端点吗?
  • 术语“endpoint”的含义显然取决于上下文。例如,如果您指的是布线,则表示布线末端的物理主机接口。如果您指的是 ICMP,它是主机内部的 IP 模块。如果您指的是传输协议,例如TCP,那么它就是一个套接字。

标签: sockets networking endpoint


【解决方案1】:

“端点”是一个通用术语,包括管道、接口、节点等,而“套接字”是网络中的一个特定术语。

【讨论】:

    【解决方案2】:

    恕我直言 - 逻辑上(强调)“套接字”和“端点”是相同的,因为它们都是 Internet 地址与 TCP 端口的串联。从技术上讲,在核心网络中,没有“端点”之类的东西,只有“套接字”。继续,阅读下文...

    正如@Zac67 所强调的,“socket”是网络中一个非常具体的术语——如果你阅读 TCP RFC (https://www.rfc-editor.org/rfc/rfc793),那么你甚至不会找到一个“endpoint”的引用,它只谈论“socket” ”。但是当你走出 RFC 世界时,你会听到很多关于“端点”的信息。

    现在,他们都在谈论 IP 地址和 TCP 端口的组合,但你不能说“请给我你的应用程序的套接字”,你会说“请给我您的应用程序的端点”。因此,恕我直言,有人可以理解 Socket 和 Endpoint 之间区别的方式是 - 即使两者都指 IP 地址和 TCP 端口的组合,但是当您在计算机进程的上下文或操作系统的上下文中交谈时,您使用术语“套接字”,否则,在与一般人交谈时,您将使用“端点”。

    【讨论】:

      【解决方案3】:

      我是一个来自嵌入式系统世界和底层事物的人, Endpoint 是在你机器的远端构造的一个硬件缓冲区,这是什么意思?

      YourMachine <---------------> Device
      [Socket]    ----------------> [Endpoint]
      [Endpoint]  <---------------- [Socket]
      

      sockets和endpoints都是endpoints,但是sockets是一个endpoint,它驻留在你的机器上的sender[Socket是一个用来区分sender和receiver的词]

      好的,既然我们知道它是一个缓冲区,那么缓冲区和网络之间的关系是什么?

      窗口

      当您在 Windows 上创建一个套接字时,操作系统会返回该套接字的句柄,实际上套接字实际上是一个内核对象,因此在 Windows 中,当您创建一个内核对象时,返回的值是一个用于访问该套接字的句柄对象,通常句柄是 void* ,然后将其转换为 Windows 可以理解的数值,现在您可以访问套接字内核对象,所有 IO 操作都在 OS 内核中处理,并且由于您想与外部设备通信,所以您有首先到达内核并且套接字正是这样做的,换句话说,套接字在内核中创建一个套接字对象=在内核中创建一个端点=在内核中创建一个缓冲区,该缓冲区用于稍后通过电线传输数据使用 OS HAL(硬件抽象层),您可以与其他设备交谈,您很高兴

      现在,如果其他设备没有通信缓冲区=端点,那么您无法与它通信,即使您在自己端打开一个套接字,也必须是双向数据通信=发送和接收

      另一个访问 IO 外设的例子是访问 RAM(主内存),访问 RAM 的两种方式,访问进程堆栈或访问进程堆,堆栈不是内核对象,实际上您可以直接访问堆栈而无需到达 OS内核,只需从 RSP(堆栈指针寄存器)中减去一个值,例如:

      ; This example demonstrates how to allocate 32 contiguous bytes from stack on Windows OS
      ; Intel syntax
      StackAllocate proc
          sub rsp, 20h
          ret
      StackAllocate endp 
      

      访问堆不同,堆是内核对象,因此当您在代码中调用 malloc()/new 运算符时,会通过 windows 代码调用长调用堆栈,关键是到达 RAM 需要内核帮助,堆栈分配上面实际上没有到达RAM,我所做的只是减去CPU内部的RSP中的一个现有值,所以我没有走到外面,内核中的堆对象返回一个句柄,Windows用来管理碎片内存,最后返回一个 void* 到那个内存

      希望有所帮助

      【讨论】:

        猜你喜欢
        • 2010-12-28
        • 1970-01-01
        • 2013-09-05
        • 1970-01-01
        • 1970-01-01
        • 2020-02-05
        • 1970-01-01
        • 2016-03-08
        相关资源
        最近更新 更多