相关文章:
tcp/ip详解卷一(笔记1:概述与IP层协议)
tcp/ip详解卷一(笔记2:UDP及相关的协议)
tcp/ip详解卷一(笔记3:tcp与相关协议)
tcp/ip详解卷一(笔记4:应用层应用与协议)
参考文献:
https://www.cnblogs.com/feng9exe/p/6994637.html
http://www.cnblogs.com/web21/p/6520164.html
https://blog.youkuaiyun.com/houjixin/article/details/51923919
1 简介
插口层的主要功能是将进程发送的与协议有关的请求映射到产生插口时指定的与协议有关的实现。(将请求和 具体的协议进行映射,具体映射的协议是在创建插口时指定的)。为了允许标准的Unix I/O系统调用(如read/write)也能读写网络连接,在BSD版本中将文件系统和网络功能集成在系统调用级(即文件系统和网络功能 属于系统调用,在操作系统内核中实现)与通过一个文件描述符来访问打开的文件一样,进程也是通过一个描述符来访问插口上的网络连接。这个特点使得标准的文件系统调用,如read/write ,以及与网络有关的系统调用,如sendmsg和recvmsg,都能够通过描述符来处理插口(即能像访问文件一样,使用标准的文件系统调用,使用插口描述符来访问网络)
进程中的插口与内核中的协议之间的实现之间的层次关系如下图所示。
2. linux 下的socket
在Linux中,socket 也是文件,用来对应的文件描述符。
在进程控制块PCB中包含当前进程中打开的文件列表
struct proc {
struct proc *p_forw; /* Doubly-linked run/sleep queue. */
struct proc *p_back;
struct proc *p_next; /* Linked list of active procs */
struct proc **p_prev; /* and zombies. */
/* substructures: */
struct pcred *p_cred; /* Process owner's identity. */
/* Ptr to open files structure. */
struct filedesc *p_fd;
//以下省略若干项
.....
}
其中,struct filedesc结构体描述了进程打开的所有的文件信息
当调用socket创建系统调用时,会调用函数get_unused_fd_flags(获取当前进程打开文件描述符表中的空闲描述符)和fd_install(安装新描述符到当前进程打开文件描述符表)
struct filedesc {
struct file **fd_ofiles; /* file structures for open files */
char *fd_ofileflags; /* per-process open file flags */
struct vnode *fd_cdir; /* current directory */
struct vnode *fd_rdir; /* root directory */
int fd_nfiles; /* number of open files allocated */
u_short fd_lastfile; /* high-water mark of fd_ofiles */
u_short fd_freefile; /* approx. next free file */
u_short fd_cmask; /* mask for file creation */
u_short fd_refcnt; /* reference count */
};
这里需要重点关注该结构体的两个数组成员:struct file **fd_ofiles和char *fd_ofileflags(见上图)。其中:数组fd_ofiles的每个成员对应一个当前进程打开的文件结构体的地址;数组fd_ofileflags的每个成员对应当前进程打开的一个文件的描述符标志,文件描述符的标志采用bit位表示,因此一个打开的文件共有8个bit位表示8中不同的标志,例如标志close-on-exec和标志mapped-from-device。
结构体struct file表示当前进程中一个打开的文件,这里将关注其成员short f_type、struct fileops *f_ops和caddr_t f_data
在对socket进行read,write时,socket绑定的f_ops函数处理时,会根据socket中记录的类型调用相关的底层协议实现,完成相关的功能。