在linux中一切皆为文件,内核的socket也是一个文件,文件有个句柄fd
,说白了就是文件的身份证号码,通过它可以知道是哪个Sock
。
<aside> 💡
文件句柄:sock_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)
</aside>
socket_fd
是一个**int类型的数字,**中文翻译为:”套接字“,一套用于连接的文字。
sock
是最基础的结构,可以按照不同的协议派生出不同的功能的sock
。
inet_sock
特指用了网络传输功能的sock
,在sock
的基础上还加入了TTL
,端口,IP地址这些跟网络传输相关的字段信息。inet_connection_sock
是指面向连接的sock
,在inet_sock
的基础上加入面向连接的协议里相关字段,比如accept队列
,数据包分片大小,握手失败重试次数等。tcp_sock
就是正儿八经的tcp协议专用的sock
结构了,在inet_connection_sock
基础上还加入了tcp特有的滑动窗口、拥塞避免等功能代码执行socket提供的connect(sockfd, "ip:port")
方法时,会通过sockfd句柄找到对应的文件,再根据文件里的信息指向内核的sock
结构。通过这个sock结构主动发起三次握手。
<aside> 💡 在服务端握手次数还没达到"三次"的连接,叫半连接,完成好三次握手的连接,叫全连接。它们分别会用半连接队列和全连接队列来存放。
</aside>
sock结构体里带了一个发送缓冲区和一个接收缓冲区。
send()
方法发送数据时,同样也会通过sock_fd
句柄找到对应的文件,根据文件指向的sock
结构,找到这个sock
结构里带的发送缓冲区,将数据会放到发送缓冲区。recv()
方法。