我不明白什么是套接字,我学习了TCP/IP模型和层是把一个放在另一个里面,并发送到目的地如果我错了,我认为并纠正我的是套接字是应用程序和传输层之间的程序(有些人说文件),当应用程序想要连接时,它会创建一个带有端口和IP的套接字(我不知道这两个属于谁,是我们的机器还是目的地),套接字根据这些端口和IP创建数据报这是我的理解,我知道这不是现实,但我没有找到任何视频或课程解释,请纠正我
Socket"可以表示两种稍微不同的东西:
- TCP连接终止的位置。
- 对于通用bsd风格的套接字API,任何传输层端口分配都是套接字。
套接字是介于应用程序和传输层之间的程序(也有人说是文件)
不完全是——套接字(主要)是一个传输层的概念。您需要一个套接字来创建TCP连接或发送或接收UDP数据报。
我不知道这两个是谁的是我们的机器还是目的地
套接字是(潜在的)TCP连接的本地端,或者可以用来发送或接收UDP数据报的东西。请注意,UDP通常是无连接的,但套接字API将其视为面向连接的。
套接字之于网络会话,就像文件句柄之于文件系统会话——也就是说,它是一组由操作系统持有的关于你正在做什么的状态信息的标识符,你的程序将该标识符传递给各种函数调用,作为操作系统快速查找执行你要求它执行的任务所需的状态信息的一种方式。
例如,一个文件句柄代表了以下状态信息,这些状态信息由操作系统内部持有,以支持你对文件的读/写/更新:
- 您打开的文件的inode
- 文件读/写位置的偏移量
- 文件的读/写/追加模式
- 帮助加快文件I/O操作的内部数据缓冲区
…你将文件句柄传递给函数调用,这样操作系统就可以查找相关的数据结构,否则操作系统就不知道将传递给write()
或fwrite()
的数据放在哪里。
类似地,套接字表示网络任务的状态信息,包括:
- 组网任务使用TCP还是UDP
- 组网任务是使用IPv4还是IPv6
- 网络任务应该使用阻塞I/O还是非阻塞I/O
- 网络任务应该绑定到哪个本地端口(如果有的话)到
- 默认情况下,网络任务应该发送到哪个远程IP地址和端口(如果有的话)
- 一个数据缓冲区,用于存储传入的数据,直到您绕过调用
recv()
来处理它 - 一个数据缓冲区,用于存储传出数据(在您调用
send()
之后),直到网卡能够物理发送它 - 对于TCP,诸如当前连接状态、MTU、传输窗口大小、下一个数据包序列ID等,以帮助管理重传和流量控制
- 以及许多其他设置/选项
当你创建套接字时,操作系统分配内部内存来存储状态信息,然后你关闭套接字,操作系统可以释放分配的内部内存,因为它知道它不再需要它了。
套接字是操作系统的接口,允许应用程序访问网络。