第十五章 插口层

  • 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,分别用来缓存接收或放的数据。后续会经常用到里面的变量进行流量控制,阻塞控制等等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值