天天看點

Linux核心協定棧-從BSD socket接口層到傳輸層1

本文接上一篇linux核心協定棧-初始化流程分析,在上一篇中主要分析了了linux核心協定棧涉及到的關鍵初始化函數,在這一篇文章中将分析協定棧的bsd socket和到傳輸層的流程。采取的方式是分析socket相關的主要系統調用。針對不同的系統調用,其到達的協定層深度可能不同,有的基本隻到sock層就夠了,但是有些可能需要會涉及到比如tcp的具體細節和更底層的細節。本文基本追溯到傳輸層的開始,再深入的細節後續文章分析。

1.準備

協定的基本分層:

(a代表socket的某個系統調用)

bsd socket system calls a => proto_ops->a => sock->a => tcp_prot => a

bsd socket層和具體協定族某個類型的聯系是通過struct proto_ops,在include/linux/net.h中定義了不同協定族如af_inet,af_unix等的通用操作函數指針的結構體struct proto_ops,具體的定義有各個協定族的某個類型的子子產品自己完成。比如ipv4/af_inet.c中定義的af_inet family的tcp/udp等相應的struct proto_ops。

由于對于每個family的不同類型,其針對socket的某些需求可能不同,是以抽了一層struct sock出來,sock->sk_prot挂接到具體tcp/udp等傳輸層的struct proto上(具體定義在ipv4/tcp_ipv4.c,ipv4/udp.c)

另外,由于内容比較多,這一篇主要分析socket,bind,listen,accept幾個系統調用,下一篇會涉及connect,send,recv等的分析

同時附上其他幾個關鍵結構體:

2.開始

主要追溯幾個典型的socket相關的系統調用,如socket,bind,listen,accept等等

socket

socketpair

bind

listen

listen所做的事情也比較簡單,從系統調用的listen(fd, backlog)到proto_ops 的inet_listen與前面類似,這裡分析下inet_listen中的核心函數inet_csk_listen_start(位于ipv4/inet_connection_sock.c中)。

accept

上面socket, socketpair, bind基本隻涉及到bsd socket, sock層相關的,過程比較簡單,而accept層在sock層和tcp層互動稍微複雜,下面詳細分析

繼續閱讀