我开始阅读W. Richard Stevens的UNIX网络编程,我对端口和套接字感到很困惑。当我在互联网上阅读时,它说套接字是一个连接的端点,对于端口号,它写的是,IP地址和端口没有形成唯一的对。 所以现在我的问题是:
(1)这两者有什么区别?
(2)内部如何操作套接字和端口。套接字是文件吗?
(3)当我们使用应用程序发送数据时如何发送数据?
(4)如果有插座那么我们为什么要使用端口号?
对不起我的英文..先谢谢你的回复。
答案 0 :(得分:4)
(1)这两者有什么区别?
运行IP网络的计算机始终具有固定数量的端口 - 65535个TCP端口和65535个UDP端口。网络数据包的头部包含一个16字节的无符号短字段,用于指定应将数据包传送到哪些端口。
另一方面,套接字由每个程序分配需求。套接字用作程序和OS的网络堆栈之间的句柄/接口,用于构建和指定特定网络任务的上下文。套接字可以绑定也可以不绑定到端口,并且也可以(并且通常)同时将多个套接字绑定到特定端口。
(2)内部如何操作套接字和端口。是插座吗? 文件?
这完全取决于操作系统;不同的操作系统以不同的方式。目前还不清楚这个问题中“文件”是什么意思,但一般情况下套接字与文件系统没有任何关系。另一方面,Unix风格的操作系统的一个特性是套接字描述符也可以像文件系统文件描述符一样使用 - 即你可以将它们传递给read()/ write()/ select()等并获得有用的结果。其他操作系统(如Windows)不支持该功能,对于它们,您必须对套接字与文件使用完全独立的函数调用集。
(3)当我们使用应用程序发送数据时如何发送数据?
应用程序调用send()函数(或类似函数,如sendto()),传入相关的套接字描述符以及指向它想要发送的数据的指针,然后由网络堆栈决定将该数据复制到数据包中并将其传送到适当的网络设备进行传输。
(4)如果有套接字那么我们为什么要使用端口号?
因为您需要一种与其他计算机上的特定程序通信的方法,并且计算机A无法知道计算机B上存在哪些套接字(如果有)。但端口号是固定的,因此程序员可以将它们用作通信的集合点 - 例如,您的Web浏览器知道每当服务器运行时,Web服务器几乎肯定会在端口80上侦听传入的HTTP请求,因此它可以将其请求发送到端口80合理期望获得有用的回应。如果必须将套接字指定为目标,它会指定什么?服务器的套接字号是任意的,每次服务器运行时都可能不同。
答案 1 :(得分:0)
1)两者之间有什么区别? (2)如何在内部操纵套接字和端口。套接字是文件吗?
套接字是(IP +端口):
套接字是进程的一部分。 linux中的进程是一个文件。
(3)使用应用程序发送数据时如何发送数据?
通过将数据转换为字节来发送数据。关于字节顺序的字节序问题很少/很大,因此在编码时必须考虑到这一点。
(4)如果有套接字,那为什么要使用端口号?
一个套接字是(地址+端口),这意味着您想与之交谈的人可以通过许多电话号码(IP)来访问,因此可以通过许多套接字进行访问(这并不意味着一个电话号码上的人将会与另一个电话号码中的一个回复给您,因为他在这里/那里的工作可能有所不同。