套接字的真正定义是啥?
Posted
技术标签:
【中文标题】套接字的真正定义是啥?【英文标题】:what is the real definition of a socket?套接字的真正定义是什么? 【发布时间】:2021-12-15 07:36:51 【问题描述】:我不明白什么是套接字我学到了 TCP/IP 模型和层被放在另一个里面并发送到目的地 如果我错了,我想并纠正我的是套接字是应用程序和传输层之间的一个程序(有人说是文件),当应用程序想要连接它时,它会创建一个带有端口和 IP 的套接字(我不知道是谁这两个属于它是我们的机器还是目的地)并且该套接字根据这些端口和IP创建数据报 这是我的理解我知道这不是现实但我没有找到任何视频或课程解释请纠正我
【问题讨论】:
这能回答你的问题吗? What is the difference between a port and a socket? 【参考方案1】:“Socket”可以表示两个稍微不同的东西:
-
这是 TCP 连接终止的地方。
对于常见的 BSD 样式套接字 API,任何传输层端口分配都是一个套接字。
套接字是应用程序和传输层之间的程序(有人说是文件)
并非如此 - 套接字(主要)是一个传输层概念。您需要一个套接字来创建 TCP 连接或发送或接收 UDP 数据报。
不知道这两个属于谁,是我们的机器还是目的地
套接字是(潜在的)TCP 连接的本地端,或者可以用来发送或接收 UDP 数据报的东西。请注意,UDP 通常是无连接的,但套接字 API 将其视为面向连接的。
【讨论】:
【参考方案2】:套接字对于网络会话就像文件句柄对于文件系统会话一样——也就是说,它是操作系统持有的关于您正在做什么的一组状态信息的标识符,并且您的程序会传递该标识符到各种函数调用,作为操作系统快速查找执行您要求它执行的任务所需的状态信息的一种方式。
例如,文件句柄表示操作系统内部保存的以下状态信息,以支持您对文件的读/写/更新:
您打开的文件的 inode 读/写位置在该文件中的偏移量 文件的读/写/追加模式 内部数据缓冲区有助于加快对文件的 I/O 操作...您将文件句柄传递给函数调用,以便操作系统可以查找关联的数据结构,没有这些数据结构操作系统就不会知道,例如将传递给write()
或fwrite()
的数据放在哪里。
同样,socket 表示网络任务的状态信息,包括:
联网任务是使用TCP还是UDP 网络任务是使用 IPv4 还是 IPv6 网络任务应该使用阻塞 I/O 还是非阻塞 I/O 网络任务应绑定到哪个本地端口(如果有) 默认情况下网络任务应该发送到哪个远程 IP 地址和端口(如果有) 用于存储传入数据的数据缓冲区,直到您可以调用recv()
来处理它
一个数据缓冲区,用于存储传出数据(在您调用 send()
之后),直到网卡能够物理发送它
对于 TCP,例如当前连接状态、MTU、传输窗口大小、下一个数据包序列 ID 等,以帮助管理重传和流量控制
还有许多其他设置/选项
当您创建套接字时,操作系统分配内部内存来存储状态信息,然后您关闭套接字,操作系统可以释放分配的内部内存,因为它知道它不再需要它。
【讨论】:
【参考方案3】:socket是操作系统的一个接口,允许应用程序访问网络。
【讨论】:
以上是关于套接字的真正定义是啥?的主要内容,如果未能解决你的问题,请参考以下文章