struct tcp_sock 从 struct inet_connection_sock 结构体的基础上继承而来,在 struct inet_connection_sock 上增加了一些tcp协议相关的字段,如滑动窗口协议,拥塞算法等一些TCP专有的属性。由于这种继承关系,可以互相转换,如下举例两种转换方式,第一种是struct sock转换为struct tcp_sock,第二种是struct sock转换成struc...
看完上面两个,我们觉得第三个应该就是struct tcp_sock了,但事实上,struct tcp_sock并不直接从struct inet_sock上扩展,而是从struct inet_connection_sock基础上进行扩展,struct inet_connection_sock是所有面向连接的socket的表示,关于该socket,及下面所有tcp相关的socket,我们在分析 tcp实现时再详细介绍,这里只列出它...
看完上面两个,我们觉得第三个应该就是struct tcp_sock了,但事实上,struct tcp_sock并不直接从struct inet_sock上扩展,而是从struct inet_connection_sock基础上进行扩展,struct inet_connection_sock是所有面向连接的socket的表示,关于该socket,及下面所有tcp相关的socket,我们在分析 tcp实现时再详细介绍,这里只列出它...
而对应struct tcp_sock,其第一个成员变量是struct inet_connection_sock inet_conn,不过struct inet_connection_sock inet_conn的第一个成员变量依然是struct inet_sock inet。所以无论是udp_sock还是tcp_sock,其内存布局上都保证了struct inet_sock inet为第一个成员变量。 structinet_sock{ /* sk and pinet6 h...
TCP_CLOSING, TCP_MAX_STATES }; 这些取值从名字上看,似乎只使用于TCP协议,但事实上,UDP和RAW也借用了其中一些值,在一个socket创建之初,其取值都是 TCP_CLOSE,一个UDP socket connect完成后,将这个值改为TCP_ESTABLISHED,最后,关闭sockt前置回TCP_CLOSE,RAW也一样。
socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None) famliy:地址族;默认为AF_INET;还有AF_INET6、AF_UNIX、AF_CAN、AF_RDS;(AF_UNIX实际上是使用本地 socket 文件来通信)。 type:套接字类型;应为SOCK_STREAM(默认值,基于TCP)、SOCK_DGRAM(基于UDP)、SOCK_RAW或其他SOCK_常量之一。
{SOCK_STREAM=1,// 用于与TCP层中的tcp协议数据的struct socketSOCK_DGRAM=2,//用于与TCP层中的udp协议数据的struct socketSOCK_RAW=3,// raw struct socketSOCK_RDM=4,//可靠传输消息的struct socketSOCK_SEQPACKET=5,// sequential packet socketSOCK_DCCP=6,SOCK_PACKET=10,//从dev level中获取数据包的...
这两者之间的概念似乎有些混淆,可以这么理解,struct proto_ops的成员操作struct socket层次上的数据,处理完了,再由它们调用成员sk->sk_prot的函数,操作struct sock层次上的数据。即它们之间存在着层次上的差异。struct proto类型的变量在协议栈中总共也有三个,分别是mytcp_prot,myudp_prot,myraw_prot,对应TCP, ...
sock结构工作在INET socket层,所有BSD socket层的操作都通过struct sock 及其域字段prot指针转化为prot锁指向的函数处理,所以sock结构是维系 BSD socket层和INET socket层的纽带,其重要性是不言而喻的。 下面是对sock结构的简单注释,有些没有的待我弄懂后再来修改,^_^ ...
socket在Linux中对应的文件系统叫Sockfs,每创建一个socket,就在sockfs中创建了一个特殊的文件,同时创建了sockfs文件系统中的inode,该inode唯一标识当前socket的通信。 如下图所示,左侧窗口使用nc工具创建一个TCP连接;右侧找到该进程id(3384),通过查看该进程下的描述符,可以看到"3 ->socket:[86851]",socket表示这是...