收發包過程

物理連接,物理標識,網絡標識,端口標識,數據標識
星形聯結,mac地址,ip地址,服務端口,數據協議

===dns請求爲例

應用層構造DNS包,告訴udp層數據目的8.8.8.8的端口53
udp層構造udp包,數據就是dns包內容,目的端口,源端口,告訴ip層
ip收到請求後,查詢路由表,不在一個子網,找到默認網關,得到源ip,網關ip,構造ip包
arp構造mac地址,獲取網關對應mac
鏈路層構造以太網包,填寫網關mac和目的地址,原地址和源ip
路由器收到數據包,根據目的地址,不再一個子網,查詢路由表,發送到下一個網關
直到最後一個路由器,發現目的地址在一個子網,通過網卡發送
目的地址收到dns包,根據端口,發送給目的進程進行處理
應用層構造應答包,返回請求

===ip轉發與鏈路轉發

1,路由表小很多,差不多萬條級別,ip範圍和生活中地址一樣,不怎麼變化
2,ip在整個網絡拓撲位置不會變化,變化的是設備位置
3,ip不攜帶個人信息,需要mac完成動態分配和解決衝突

    二層轉發
    主機根據ip地址判斷是否在一個網段,一個網段去查詢並更新本地arp表
    arp請求和回覆,更新並老化了交換機的FDB表(FordWarding DateBase):
    即MAC地址映射表,有MAC地址、端口、VLAN ID等信息
    

    三層轉發
    交換機接收包時發現目的IP與源IP不在同一個網段,提交到三層,
    路由表:包含默認路由、RIP等動態路由的路由路徑信息的記錄表。
    路由表中有記錄進行硬件轉發,與或非數字電路,否則進行軟件路由轉發
    數據包緩存於cpu的內存中,實現數據包的循徑,轉發的
    轉發過程中,ip不變,修改mac
    

===數據接收

接收:        數據包從網卡接收,驅動判斷目的地址匹配,非混雜模式直接丟棄
存儲:        dma方式放到內存
通知cpu:    硬件中斷irq通知cpu
中斷處理:    cpu根據中斷表,調用驅動程序相應函數,禁用中斷,啓動軟中斷,返回
數據處理:     ksoftirqd調用數據包處理函數,將內存數據包轉換skb格式,交給協議棧處理
            poll處理完後,啓用網卡的硬件中斷。

協議棧:    協議是通信規則,協議棧是層級結構,協議總和,代碼實現的庫函數

            ip層:根據mac,ip判斷是丟棄並處理,轉發ip-forward,還是直接處理給udp
            
            udp層:根據ip和端口找到服務socket,並判斷該socket上的filter,沒有則丟棄
            將數據包放入socket接收隊列的末尾,通知socket數據包已經準備好
            
            應用層:socket根據阻塞或者select,epoll方式讀取隊列數據

===數據發送

創建socket    初始化socket相應的函數和udp相關函數,分配源端口,sendto發給udp層
協議棧        udp層:構造skb,分配源ip,路由表找到目的地址,初始化ip包頭,分片
            IP層:設置IP報文頭的長度和checksum,snat更新路由信息,獲取下一跳mac
            填寫到skb中,調用dev_queue_xmit
            netdevice:過濾和優先級處理,tcpdump的copy,具體驅動ndo_start_xmit
            driver:skb到隊列,通知網卡發送,完成中斷給cpu,skb清理

===netfliter和iptables

netfilter在協議棧中添加了5個鉤子
iptables是用戶空間的一個程序,通過netlink和內核的netfilter框架打交道,配置回調

hook:
1,接收            NF_IP_PRE_ROUTING
2,進入本地        NF_IP_LOCAL_IN
3,forward        NF_IP_FORWARD
4,發送到ip層    NF_IP_LOCAL_OUT
5,下層發送        NF_IP_POST_ROUTING
    
一個數據包只會經過下面三個路徑中的一個:
本機收到目的IP是本機的數據包: NF_IP_PRE_ROUTING -> NF_IP_LOCAL_IN
本機收到目的IP不是本機的數據包: NF_IP_PRE_ROUTING -> NF_IP_FORWARD -> NF_IP_POST_ROUTING
本機發出去的數據包: NF_IP_LOCAL_OUT -> NF_IP_POST_ROUTING

iptables用表(table)來分類管理它的規則(rule),根據rule的作用分成了好幾個表,
比如用來過濾數據包的rule就會放到filter表中,用於處理地址轉換的rule就會放到nat表中,
其中rule就是應用在netfilter鉤子上的函數,用來修改數據包的內容或過濾數據包

iptables裏面有5個內置的chains,分別對應5個鉤子:

PREROUTING: 數據包經過NF_IP_PRE_ROUTING時會觸發該chain上的rule
INPUT: 數據包經過NF_IP_LOCAL_IN時會觸發該chain上的rule
FORWARD: 數據包經過NF_IP_FORWARD時會觸發該chain上的rule
OUTPUT: 數據包經過NF_IP_LOCAL_OUT時會觸發該chain上的rule
POSTROUTING: 數據包經過NF_IP_POST_ROUTING時會觸發該chain上的rule

 

pts的收發包
#pty(pseudo terminal device)由兩部分構成,ptmx是master端,pts是slave端
請求ptmx創建一個pts,創建成功後,sshd將得到和ptmx關聯的fd,並將該fd和session關聯起來
1,鍵盤收到輸入,根據ssh協議發送給sshd
2,sshd接收到數據,根據管理的session找到fd
3,寫入fd接收到的數據
4,ptmx收到數據後,根據fd找到pts,轉發給pts
5,pts收到數據包後,轉發爲進程組的leader
6,pts上只有shell,所以shell的read收到數據包
7,shell對數據包進行處理,輸出結果,可能沒有結果
8,shell將結果寫入pts
9,pts轉發給ptmx
10,ptmx找到fd,寫入結果
11,sshd收到fd結果,找到session,發送給對應客戶端

總結過程就是ssh-session <--> fd <--> ptmx <--> pts <--> shell

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章