端口号和套接字的区别
Difference between port number and socket
我开始阅读 W. Richard Stevens 的 UNIX 网络编程,我对端口和套接字感到很困惑。当我在 Internet 上阅读时,它说套接字是连接的端点,对于端口号,它是这样写的,IP 地址和端口没有形成唯一的一对。
所以现在我的问题是:
(1)这两个有什么区别?
(2)套接字和端口在内部是如何操作的。套接字是文件吗?
(3) 我们使用应用程序发送数据时是如何发送的?
(4) 如果有套接字,那我们为什么要使用端口号?
对不起我的英语..提前感谢您的回复。
(1) What is the difference between these two ?
一台计算机运行 IP 网络始终具有固定数量的端口——65535 个TCP 端口和65535 个UDP 端口。网络数据包的 header 包含一个 16 位 unsigned-short 字段,用于指定数据包应传送到哪些端口。
另一方面,套接字由每个程序demand-allocated。套接字充当程序和 OS 网络堆栈之间的 handle/interface,用于为特定网络任务构建和指定上下文。一个套接字可能会或可能不会绑定到一个端口,并且也可能(并且很常见)有多个套接字同时绑定到一个特定端口。
(2)How are sockets and ports internally manipulated. Are sockets a
file ?
这完全取决于 OS;不同的 OS 以不同的方式进行。目前尚不清楚您在这个问题中所说的“文件”是什么意思,但通常套接字与文件系统没有任何关系。另一方面,Unix-style OS 的一个特性是套接字描述符也可以像文件系统文件描述符一样使用——也就是说,你可以将它们传递给 read()/write ()/select()等,得到有用的结果。其他 OS,例如 Windows,不支持该功能,对于它们,您必须对套接字和文件使用一组完全独立的函数调用。
(3) How is data sent when we send it using an application ?
应用程序调用send()函数(或sendto()等类似函数),传入相关的套接字描述符以及指向它要发送的数据的指针,然后由网络堆栈将该数据复制到数据包中并将其传送到适当的网络设备进行传输。
(4) If sockets are there then why do we use port numbers ?
因为你需要一种方法来与其他计算机上的特定程序进行通信,而计算机 A 无法知道计算机 B 上存在哪些套接字(如果有的话)。但是端口号是固定的,所以有可能程序员将它们用作通信的集合点——例如,您的 Web 浏览器知道 Web 服务器几乎肯定会在服务器 运行 时侦听端口 80 上传入的 HTTP 请求,因此它可以发送它对端口 80 的请求有一个合理的期望,即得到有用的响应。如果它必须指定一个套接字作为目标,它会指定什么?服务器的套接字号是任意的,每次服务器运行时可能都不同。
1) What is the difference between these two ?
(2)How are sockets and ports internally manipulated. Are sockets a file ?
一个套接字是(IP+端口):
- 套接字就像电话(即用于通信的端到端设备)
- IP 就像您的电话号码(即您的插座地址)
- 端口就像你想与之交谈的人(即你想从该地址订购的服务)
套接字是进程的一部分。 linux中的一个进程是一个文件。
(3) How is data sent when we send it using an application ?
数据通过将其转换为字节来发送。关于字节顺序存在 little/big 端序问题,因此您在编码时必须考虑到这一点。
(4) If sockets are there then why do we use port numbers ?
一个套接字是(地址+端口),这意味着你想与之交谈的人(端口)可以从许多电话号码(IP)和因此从许多套接字(这并不意味着一个人在一个因为他的工作here/there可能不同),电话号码会和另一个电话号码一样回复你。
我开始阅读 W. Richard Stevens 的 UNIX 网络编程,我对端口和套接字感到很困惑。当我在 Internet 上阅读时,它说套接字是连接的端点,对于端口号,它是这样写的,IP 地址和端口没有形成唯一的一对。 所以现在我的问题是:
(1)这两个有什么区别?
(2)套接字和端口在内部是如何操作的。套接字是文件吗?
(3) 我们使用应用程序发送数据时是如何发送的?
(4) 如果有套接字,那我们为什么要使用端口号?
对不起我的英语..提前感谢您的回复。
(1) What is the difference between these two ?
一台计算机运行 IP 网络始终具有固定数量的端口——65535 个TCP 端口和65535 个UDP 端口。网络数据包的 header 包含一个 16 位 unsigned-short 字段,用于指定数据包应传送到哪些端口。
另一方面,套接字由每个程序demand-allocated。套接字充当程序和 OS 网络堆栈之间的 handle/interface,用于为特定网络任务构建和指定上下文。一个套接字可能会或可能不会绑定到一个端口,并且也可能(并且很常见)有多个套接字同时绑定到一个特定端口。
(2)How are sockets and ports internally manipulated. Are sockets a file ?
这完全取决于 OS;不同的 OS 以不同的方式进行。目前尚不清楚您在这个问题中所说的“文件”是什么意思,但通常套接字与文件系统没有任何关系。另一方面,Unix-style OS 的一个特性是套接字描述符也可以像文件系统文件描述符一样使用——也就是说,你可以将它们传递给 read()/write ()/select()等,得到有用的结果。其他 OS,例如 Windows,不支持该功能,对于它们,您必须对套接字和文件使用一组完全独立的函数调用。
(3) How is data sent when we send it using an application ?
应用程序调用send()函数(或sendto()等类似函数),传入相关的套接字描述符以及指向它要发送的数据的指针,然后由网络堆栈将该数据复制到数据包中并将其传送到适当的网络设备进行传输。
(4) If sockets are there then why do we use port numbers ?
因为你需要一种方法来与其他计算机上的特定程序进行通信,而计算机 A 无法知道计算机 B 上存在哪些套接字(如果有的话)。但是端口号是固定的,所以有可能程序员将它们用作通信的集合点——例如,您的 Web 浏览器知道 Web 服务器几乎肯定会在服务器 运行 时侦听端口 80 上传入的 HTTP 请求,因此它可以发送它对端口 80 的请求有一个合理的期望,即得到有用的响应。如果它必须指定一个套接字作为目标,它会指定什么?服务器的套接字号是任意的,每次服务器运行时可能都不同。
1) What is the difference between these two ? (2)How are sockets and ports internally manipulated. Are sockets a file ?
一个套接字是(IP+端口):
- 套接字就像电话(即用于通信的端到端设备)
- IP 就像您的电话号码(即您的插座地址)
- 端口就像你想与之交谈的人(即你想从该地址订购的服务)
套接字是进程的一部分。 linux中的一个进程是一个文件。
(3) How is data sent when we send it using an application ?
数据通过将其转换为字节来发送。关于字节顺序存在 little/big 端序问题,因此您在编码时必须考虑到这一点。
(4) If sockets are there then why do we use port numbers ?
一个套接字是(地址+端口),这意味着你想与之交谈的人(端口)可以从许多电话号码(IP)和因此从许多套接字(这并不意味着一个人在一个因为他的工作here/there可能不同),电话号码会和另一个电话号码一样回复你。