1、socket
(include\linux\Socket.h)该结构体socket 主要使用在BSD socket 层,是最上层的结构,在INET socket 层也会有涉及,但很少。
/*
* Internal representation of a socket. not all the fields are used by
* all configurations:
*
* server client
* conn client connected to server connected to
* iconn list of clients -unused-
* awaiting connections
* wait sleep for clients, sleep for connection,
* sleep for i/o sleep for i/o
*/
//该结构表示一个网络套接字
struct socket {
short type; /* 套接字所用的流类型*/
socket_state state;//套接字所处状态
long flags;//标识字段,目前尚无明确作用
struct proto_ops *ops; /* 操作函数集指针 */
/* data保存指向‘私有'数据结构指针,在不同的域指向不同的数据结构 */
//在INET域,指向sock结构,UNIX域指向unix_proto_data结构
void *data;
//下面两个字段只用于UNIX域
struct socket *conn; /* 指向连接的对端套接字 */
struct socket *iconn; /* 指向正等待连接的客户端(服务器端) */
struct socket *next;//链表
struct wait_queue **wait; /* 等待队列 */
struct inode *inode;//inode结构指针
struct fasync_struct *fasync_list; /* 异步唤醒链表结构 */
};
2、sock
(include\linux\Net.h) sock 的使用范围比socket 要大得多,sock结构的使用基本贯穿硬件层、设备接口层、ip层、INET socket 层,而且是作为各层之间的一个联系,主要是因为无论是发送还是接收的数据包都要被缓存到sock 结构中的缓冲队列中。
sock 结构与其对应的 socket 会相互绑定。
/*
* This structure really needs to be cleaned up.
* Most of it is for TCP, and not used by any of
* the other protocols.
* 大部分功能是为TCP准备的
*/
struct sock {
struct options *opt;//IP选项缓冲于此处
volatile unsigned long wmem_alloc;//发送缓冲队列中存放的数据的大小,这两个与后面的rcvbuf和sndbuf一起使用
volatile unsigned long rmem_alloc;//接收缓冲队列中存放的数据的大小
/* 下面三个seq用于TCP协议中为保证可靠数据传输而使用的序列号 */
unsigned long write_seq;//
unsigned long sent_seq;//
unsigned long acked_seq;//
unsigned long copied_seq;//应用程序有待读取(但尚未读取)数据的第一个序列号
unsigned long rcv_ack_seq;//目前本地接收到的对本地发送数据的应答序列号
unsigned long window_seq;//窗口大小
unsigned long fin_seq;//应答序列号
//下面两个字段用于紧急数据处理
unsigned long urg_seq;//紧急数据最大序列号
unsigned long urg_data;//标志位,1表示收到紧急数据
/*
* Not all are volatile, but some are, so we
* might as well say they all are.
*/
volatile char inuse,//表示其他进程正在使用该sock结构,本进程需等待
dead,//表示该sock结构已处于释放状态
urginline,//=1,表示紧急数据将被当做普通数据处理
intr,//
blog,
done,
reuse,
keepopen,//=1,使用保活定时器
linger,//=1,表示在关闭套接字时需要等待一段时间以确认其已关闭
delay_acks,//=1,表示延迟应答
destroy,//=1,表示该sock结构等待销毁
ack_timed,
no_check,
zapped, /* In ax25 & ipx means not linked */
broadcast,
nonagle;//=1,表示不使用NAGLE算法
//NAGLE算法:在前一个发送的数据包被应答之前,不可再继续发送其它数据包
unsigned long lingertime;//等待关闭操作的时间
int proc;//该sock结构所属的进程的进程号
struct sock *next;
struct sock *prev; /* Doubly linked chain.. */
struct sock *pair;
//下面两个字段用于TCP协议重发队列
struct sk_buff * volatile send_head;//这个队列中的数据均已经发送出去,但尚未接收到应答
struct sk_buff * volatile send_tail;
struct sk_buff_head back_log;//接收的数据包缓存队列,当套接字正忙时,数据包暂存在这里
struct sk_buff *partial;//用于创建最大长度的待发送数据包
struct timer_list partial_timer;//定时器,用于按时发送partial指针指向的数据包
long retransmits;//重发次数
struct sk_buff_head write_queue,//指向待发送数据包
receive_queue;//读队列,表示数据报已被正式接收,该队列中的数据可被应用程序读取?
struct proto *prot;//传输层处理函数集
struct wait_queue **sleep;
unsigned long daddr;//sock结构所代表套接字的远端地址
unsigned