Linux網路編程的API流程【轉載】,linux網路編程api
原文:http://blog.chinaunix.net/uid-23069658-id-3300460.html Linux網路編程資料收發的API流程分析 只要把資料在協議棧中的流動線路和脈絡弄清楚了,關於協議棧的實現部分,理解起來就輕鬆多了。在網路編程章節的資料接收過程中,我們主要介紹過read()、recv()、recvfrom()還有一個recvmsg()沒介紹到,今天我們就來看一下這幾個API函數到底有什麼差別。 資料接收 在接收資料的過程,主要分兩個階段:BOTTOM-HALF和TOP-HALF。 BOTTOM-HALF: 當從網卡驅動收到資料包後即進入BOTTOM-HALF階段,在這裡要根據以太幀頭部中的類型欄位來確定上層承載的具體協議類型,如IP,或ARP、RARP等。IP報文的處理函數通常交付給ip_recv()函數來處理,然後資料進入網路層,具體流程: 如果該資料包是發給原生一般調用ip_local_deliver()函數,如果是需要本機轉寄給出去的,並且本機也開啟了轉寄功能,那麼就會調用ip_forward()函數。 在這裡我們看到了Netfilter的身影,好久沒看到它了,還是有些親切。大家可以結合這幅圖回頭再理解一下Netfilter和協議棧的關係。 BOTTOM-HALF最後將收到的skb填充到socket通訊端的接收隊列裡,參見。 TOP-HALF: 緊承BOTTOM-HALF階段,該階段的主要任務就是從接收隊列裡拿出一個skb然後將其傳遞到使用者空間去,如下: 可以看出,這幾個函數的內部最終都統一到了一起:__sock_recvmsg()。 資料發送 同樣的,資料發送也分兩個階段,對照接收的情況,發送資料時肯定也存在一個發送隊列,這樣想就對了。前面關於發送資料包時我們介紹過的API有write()、send()、sendto()還有一個sendmsg()沒介紹到。 TOP-HALF如下: BOTTOM-HALF如下所示: 經過這麼一份探索,我們對這幾個資料收發的API至少理解的要比別人深刻些了吧。至於不同函數之間的回調、調用關係是如何搭建的,我們在協議棧分析章節再做進一步討論。最後來一張全家福: 完。