-
1.1、 概念
插口层的主要功能是将进程发送的与协议有关的请求映射到产生插口时指定的与协议有关的实现。
下图说明了进程中的插口接口与内核中的协议实现之间的层次关系
-
1.2、socket结构
struct socket { short so_type; /* generic type, see socket.h */ short so_options; /* from socket call, see socket.h */ short so_linger; /* time to linger while closing */ short so_state; /* internal state flags SS_*, below */ caddr_t so_pcb; /* protocol control block */ struct protosw *so_proto; /* protocol handle */ /* * Variables for connection queueing. * Socket where accepts occur is so_head in all subsidiary sockets. * If so_head is 0, socket is not related to an accept. * For head socket so_q0 queues partially completed connections, * while so_q is a queue of connections ready to be accepted. * If a connection is aborted and it has so_head set, then * it has to be pulled out of either so_q0 or so_q. * We allow connections to queue up based on current queue lengths * and limit on number of queued connections for this socket. */ struct socket *so_head; /* back pointer to accept socket */ struct socket *so_q0; /* queue of partial connections */ struct socket *so_q; /* queue of incoming connections */ short so_q0len; /* partials on so_q0 */ short so_qlen; /* number of connections on so_q */ short so_qlimit; /* max number queued connections */ short so_timeo; /* connection timeout */ u_short so_error; /* error affecting connection */ pid_t so_pgid; /* pgid for signals */ u_long so_oobmark; /* chars to oob mark */ /* * Variables for socket buffering. */ struct sockbuf { u_long sb_cc; /* actual chars in buffer */ u_long sb_hiwat; /* max actual char count */ u_long sb_mbcnt; /* chars of mbufs used */ u_long sb_mbmax; /* max chars of mbufs to use */ long sb_lowat; /* low water mark */ struct mbuf *sb_mb; /* the mbuf chain */ struct selinfo sb_sel; /* process selecting read/write */ short sb_flags; /* flags, see below */ short sb_timeo; /* timeout for read/write */ } so_rcv, so_snd; #define SB_MAX (256*1024) /* default for max chars in sockbuf */ #define SB_LOCK 0x01 /* lock on data queue */ #define SB_WANT 0x02 /* someone is waiting to lock */ #define SB_WAIT 0x04 /* someone is waiting for data/space */ #define SB_SEL 0x08 /* someone is selecting */ #define SB_ASYNC 0x10 /* ASYNC I/O, need signals */ #define SB_NOTIFY (SB_WAIT|SB_SEL|SB_ASYNC) #define SB_NOINTR 0x40 /* operations not interruptible */ caddr_t so_tpcb; /* Wisc. protocol control block XXX */ void (*so_upcall) __P((struct socket *so, caddr_t arg, int waitf)); caddr_t so_upcallarg; /* Arg for above */ };
插口代表一条通信链路的一端,存储或指向与链路有关的所有信息。这些信息包括:使用的协议、协议的状态信息(包括源和目的地址)、到达的连接队列、数据缓存和可选标志。
so_type由产生插口的进程来指定,它指明插口和相关协议支持的通信语义。对于UDP,so_type等于SOCKDGRAM,而对于TCP,so_type则等于SOCKSTREAM。
so_options是一组改变插口行为的标志。
通过getsockopt和setsockopt系统调用进程能修改除SO_ACCEPTCONN外所有的插口选项。当在插口上发送listen系统调用时,
SO_ACCEPTCONN被内核设置。
so_linger等于当关闭一条连接时插口继续发送数据的时间间隔(单位为一个时钟滴
答)
so_state表示插口的内部状态和一些其他的特点。
设置了SO_ACCEPTCONN标志的插口维护两个队列,分别为还没有完全建立的连接队列so_q0和已经建立或将被接受的链接so_q,每一个被排队的插口中,so_head指向设置了SO_ACCEPTCONN的源插口。so_qlimit控制可排队的连接数
对于TCP协议,so_q0队列存储TCP的三次握手还未完成时的连接,so_q存储TCP的三次握手已经完成的连接
每一个插口包含两个数据缓存(struct sockbuf),so_rcv和so_snd,分别用来缓存接收或放的数据。后续会经常用到里面的变量进行流量控制,阻塞控制等等
第十五章 插口层
于 2022-08-27 21:29:40 首次发布