2011-01-24 74 views
15

我一直在阅读基本的网络编程知识,但是我很难找到关于什么是套接字以及它如何与OSI或TCP/IP协议栈相关的直接解释。了解套接字基础知识

  1. 有人可以向我解释什么是套接字吗?它是程序员或API定义的数据结构,还是网卡上的硬件设备?

  2. 上述网络模型的哪些层处理“原始”套接字?传输层?网络层?

  3. 就它们在它们之间传递的数据而言,是基于套接字文本还是二进制文件?

  4. 是否有替代以套接字为基础的网络编程?或者,所有联网的应用程序使用某种形式的套接字?

如果我能得到这么多,我应该有一个非常清楚的理解我正在阅读的一切。谢谢你的帮助!

回答

7

简短回答:

  1. 插座是IP连接端点的抽象 - 所以,如果你认为它是一个API结构,你是不是很离谱。请仔细阅读http://en.wikipedia.org/wiki/Internet_socket
  2. Internet layer即IP协议。在实践中,您通常使用明确的套接字来绑定到某个传输层参数(数据报/ UDP或流/ TCP)。套接字以网络字节顺序发送数据 - 无论是文本还是二进制数据,都取决于上层协议。
  3. 从理论上说,可能是肯定的 - 但在实践中所有的IP通信用“插座”
+0

感谢Kimvais!那么,可以肯定地说一个实现套接字结构的人必须允许它符合IP协议吗? – Eugie 2011-01-24 13:19:49

4

套接字是由操作系统提供的软件机制。就像其名称所暗示的那样,即使套接字不是物理设备,也可以将其视为“电源插座”或某种电气连接器,而不是软件机制。在现实世界中,当您有两个电气连接器时,可以用电线连接它们。以同样的方式在网络编程中,您可以在一台电脑上创建一个套接字,在另一台电脑上创建另一个套接字,然后连接这些套接字。当你向其中一个人写数据时,你会从另一个人那里收到。还有几种不同类型的插座。例如,如果您正在编写服务器软件,则您希望拥有一个侦听套接字,该套接字永远不会发送或接收实际数据,只会侦听并接受传入连接,并为每个新连接创建一个新套接字。

+0

谁负责将数据从一端发送到另一端? – 2013-02-08 01:00:28

3

套接字进行,在C的说法,是在内核空间的数据结构,对应于一个UDP的一个终点或TCP会话(我在谈论UDP时使用会话非常简单)。它通常与本地端的单个端口号相关联,并且在会话的任何一侧很少有一个“众所周知”的号码。

“原始插座”是或多或少物理运输的终点。它们很少用于应用程序编程,但有时用于各种诊断事件(traceroute,ping,可能还有其他),并且可能需要提升特权才能打开。

套接字本质上是一个二进制八位字节传输。将套接字(至少是TCP套接字)视为基于文本的流并不罕见。

我还没有看到一个编程模型不涉及套接字之类的东西,如果你深入挖掘,但肯定有其他模型做网络。在“/ net /”伪文件系统中,打开“/net/127.0.0.0.1/tcp/80”(或“tcp/www”)会给你一个文件句柄,其中写入最终在本地主机上的web服务器上不过是一个。