socket的定义是什么,为什么需要它以及它是如何工作的?

时间:2013-07-18 06:55:26

标签: sockets

我知道套接字广泛用于网络程序,我可以用它编写代码。但我无法理解一些事情:

1。我们为什么需要套接字?

如果它用于通过网络层区分应用程序层程序,为什么不使用应用程序名称或其他uniqueue属性?

套接字是标准吗?

套接字只是linux或其他操作系统中的结构吗?

2。套接字如何工作?

socket附近有很多功能,比如bind,accept,listen,send。例如,send()通过TCP发送msg到dest,以及它如何将msg发送到网络层?它是否将msg发送到tcp缓冲区?网络层进程如何读取tcp缓冲区数据以及如何将数据发送到下层进程?

如果我使用send(int sockfd, const void *buf, size_t len, int flags)函数,第一个arg'sockfd'是一个未定义的套接字,例如random int,会导致什么结果?为什么?操作系统是什么过程?

2 个答案:

答案 0 :(得分:3)

套接字源于Berkeley(因此名称为Berkeley sockets),它们是通过网络进行进程间通信的“标准”抽象。

  1. POSIX套接字是一个标准,它们基本上是原始的Berkeley套接字(对于接口)
  2. 该接口有很好的文档记录,它指定了例如,如果对sockfd中的send参数使用随机int,会发生什么。 “以及它如何将msg发送到网络层?”是一个如何实现库的问题,并在不同的操作系统上有不同的答案。从用户的角度来看,这应该是无关紧要的。

答案 1 :(得分:3)

在UNIX上,套接字是一种文件描述符。在Windows上,SOCKET是一种HANDLE。文件描述符和HANDLE是这些操作系统允许对资源执行各种操作(如读和写)的方式。因此,网络连接被认为是OS的网络服务提供的OS资源。

套接字API或多或少是标准的,尽管每个操作系统可能提供特定于操作系统的API以及标准API的操作系统特定选项。

套接字的底层实现很可能涉及一个结构。

操作系统如何实现套接字API与实现其他系统调用没有太大区别。 send() API最终转换为系统调用,将数据传递到网络堆栈。网络堆栈将管理自己的缓冲区,但send()通常会将用户空间中的数据复制到网络缓冲区(这与调用write()系统调用时发生的情况没有什么不同)。网络堆栈通过其代码处理数据,将其传递到不同的层(通常:套接字 - > TCP - > IP - >以太网驱动程序)。在最低层,它类似于操作系统用于与物理设备通信的任何设备驱动程序。

当您将非套接字文件描述符传递给send()时,我很可能会收到错误,EBADFEINVALENOTSOCK