❶ linux TCP/IP協議棧數據包處理流程及代碼實現分析
好吧復,我來回答吧,首先制是網卡驅動程序捕獲到數據包,做檢驗無誤後,和DMA以及CPU交互,然後由DMA和驅動程序創建BD表,然後分配skbuf(LINUX下)數據結構保存獲得的數據幀,內核通過協議棧處理這個skbuf,通常是層層剝離每個層的首部,然後傳到上一層,細節就是一個變數做偏移量,每次做一個首部偏移讀取首部數據,識別本層協議類型以及下一層協議類型,具體過程就是這個網路原理的過程,請參考《TCP/IP詳解卷一》《linux設備驅動程序》《understanding linux network internals》《Unix網路編程卷一》等。
❷ linux 中sock是什麼意思
你所說的 sock 不就是socket嘛~~,你把你所說的上面那段話中sock 全部替換成socket 就一下都讀明白了。 至於linux中sock,它一般是指通過shell編程後形成的套介面文件,通過ls -l 後,第一個顯示的文件類型為:s 。
至於socket ,你應該已經很明白了吧,說白了就是一個通信管道。
我擦 ,怎麼都2007年的問題了,居然 在我的最新問題中顯示出來了~~我勒個去
❸ tcp擁塞控制狀態機在linux內核源碼的什麼位置
公平性
公平性是在發生擁塞時各
源端(或同一源端建立的不同TCP連接或UDP數據報)能公平地共享同一網路資源(如帶寬、緩存等)。處於相同級別的源端應該得到相同數量的網路資源。產
生公平性的根本原因在於擁塞發生必然導致數據包丟失,而數據包丟失會導致各數據流之間為爭搶有限的網路資源發生競爭,爭搶能力弱的數據流將受到更多損害。
因此,沒有擁塞,也就沒有公平性問題。
TCP層上的公平性問題表現在兩方面:
(1)
面向連接的TCP和無連接的UDP在擁塞發生時對擁塞指示的不同反應和處理,導致對網路資源的不公平使用問題。在擁塞發生時,有擁塞控制反應機制的TCP
數據流會按擁塞控制步驟進入擁塞避免階段,從而主動減小發送入網路的數據量。但對無連接的數據報UDP,由於沒有端到端的擁塞控制機制,即使網路發出了擁
塞指示(如數據包丟失、收到重復ACK等),UDP也不會像TCP那樣減少向網路發送的數據量。結果遵守擁塞控制的TCP數據流得到的網路資源越來越少,
沒有擁塞控制的UDP則會得到越來越多的網路資源,這就導致了網路資源在各源端分配的嚴重不公平。
網路資源分配的不公平反
過來會加重擁塞,甚至可能導致擁塞崩潰。因此如何判斷在擁塞發生時各個數據流是否嚴格遵守TCP擁塞控制,以及如何「懲罰」不遵守擁塞控制協議的行為,成
了目前研究擁塞控制的一個熱點。在傳輸層解決擁塞控制的公平性問題的根本方法是全面使用端到端的擁塞控制機制。
(2) 一些TCP連接之間也存在公平性問題。產生問題的原因在於一些TCP在擁塞前使用了大窗口尺寸,或者它們的RTT較小,或者數據包比其他TCP大,這樣它們也會多佔帶寬。
RTT不公平性
AIMD擁塞窗口更新策
略也存在一些缺陷,和式增加策略使發送方發送數據流的擁塞窗口在一個往返時延(RTT)內增加了一個數據包的大小,因此,當不同的數據流對網路瓶頸帶寬進
行競爭時,具有較小RTT的TCP數據流的擁塞窗口增加速率將會快於具有大RTT的TCP數據流,從而將會佔有更多的網路帶寬資源。
附加說明
中美之間的線路質量不是很好,rtt較長且時常丟包。TCP協議是成也丟包,敗也丟包;TCP的設計目的是解決不可靠線路上可靠傳輸的問題,即為了解決丟包,但丟包卻使TCP傳輸速度大幅下降。HTTP協議在傳輸層使用的是TCP協議,所以網頁下載的速度就取決於TCP單線程下載的速度(因為網頁就是單線程下載的)。
丟包使得TCP傳輸速度大幅下降的主要原因是丟包重傳機制,控制這一機制的就是TCP擁塞控制演算法。
Linux內核中提供了若干套TCP擁塞控制演算法,已載入進內核的可以通過內核參數net.ipv4.tcp_available_congestion_control看到。
Vegas
1994
年,Brakmo提出了一種新的擁塞控制機制TCP
Vegas,從另外的一個角度來進行擁塞控制。從前面可以看到,TCP的擁塞控制是基於丟包的,一旦出現丟包,於是調整擁塞窗口,然而由於丟包不一定是由
於網路進入了擁塞,但是由於RTT值與網路運行情況有比較密切的關系,於是TCP
Vegas利用RTT值的改變來判斷網路是否擁塞,從而調整擁塞控制窗口。如果發現RTT在增大,Vegas就認為網路正在發生擁塞,於是開始減小擁塞窗
口,如果RTT變小,Vegas認為網路擁塞正在逐步解除,於是再次增加擁塞窗口。由於Vegas不是利用丟包來判斷網路可用帶寬,而是利用RTT變化來判斷,因而可以更精確的探測網路的可用帶寬,從而效率更好。然而Vegas的有一個缺陷,並且可以說致命的,最終影響TCP
Vegas並沒有在互聯網上大規模使用。這個問題就是採用TCP Vegas的流的帶寬競爭力不及未使用TCP Vegas的流,
這是因為網路中路由器只要緩沖了數據,就會造成RTT的變大,如果緩沖區沒有溢出的話,並不會發生擁塞,但是由於緩存數據就會導致處理時延,從而RTT變
大,特別是在帶寬比較小的網路上,只要一開始傳輸數據,RTT就會急劇增大,這個在無線網路上特別明顯。在這種情況下,TCP
Vegas降低自己的擁塞窗口,但是只要沒有丟包的話,從上面看到標準的TCP是不會降低自己的窗口的,於是兩者開始不公平,再這樣循環下去,TCP
Vegas的效率就非常低了。其實如果所有的TCP都採用Vegas擁塞控制方式的話,流之間的公平性會更好,競爭能力並不是Vegas演算法本身的問題。
適用環境:很難在互聯網上大規模適用(帶寬競爭力低)
2. Reno
Reno是目前應用最廣泛且較為成熟的演算法。該演算法所包含的慢啟動、擁塞避免和快速重傳、快速恢復機制,是現有的眾多演算法的基礎。從Reno運行機制中很容易看出,為了維持一個動態平衡,必須周期性地產生一定量的丟失,再加上AIMD機制--減少快,增長慢,尤其是在大窗口環境下,由於一個數據報的丟失所帶來的窗口縮小要花費很長的時間來恢復,這樣,帶寬利用率不可能很高且隨著網路的鏈路帶寬不斷提升,這種弊端將越來越明顯。公平性方面,根據統計數據,Reno的公平性還是得到了相當的肯定,它能夠在較大的網路范圍內理想地維持公平性原則。
Reno演算法以其簡單、有效和魯棒性成為主流,被廣泛的採用。
但是它不能有效的處理多個分組從同一個數據窗口丟失的情況。這一問題在New Reno演算法中得到解決。
基於丟包反饋的協議
近幾年來,隨著高帶寬延時網路(High Bandwidth-Delay proct network)的普及,針對提高TCP帶寬利用率這一點上,又涌現出許多新的基於丟包反饋的TCP協議改進,這其中包括HSTCP、STCP、BIC-TCP、CUBIC和H-TCP。
總的來說,基於丟包反饋
的協議是一種被動式的擁塞控制機制,其依據網路中的丟包事件來做網路擁塞判斷。即便網路中的負載很高時,只要沒有產生擁塞丟包,協議就不會主動降低自己的
發送速度。這種協議可以最大程度的利用網路剩餘帶寬,提高吞吐量。然而,由於基於丟包反饋協議在網路近飽和狀態下所表現出來的侵略性,一方面大大提高了網路的帶寬利用率;但另一方面,對於基於丟包反饋的擁塞控制協議來說,大大提高網路利用率同時意味著下一次擁塞丟包事件為期不遠了,所以這些協議在提高網路帶寬利用率的同時也間接加大了網路的丟包率,造成整個網路的抖動性加劇。
友好性
BIC-TCP、
HSTCP、STCP等基於丟包反饋的協議在大大提高了自身吞吐率的同時,也嚴重影響了Reno流的吞吐率。基於丟包反饋的協議產生如此低劣的TCP友好
性的組要原因在於這些協議演算法本身的侵略性擁塞窗口管理機制,這些協議通常認為網路只要沒有產生丟包就一定存在多餘的帶寬,從而不斷提高自己的發送速率。
其發送速率從時間的宏觀角度上來看呈現出一種凹形的發展趨勢,越接近網路帶寬的峰值發送速率增長得越快。這不僅帶來了大量擁塞丟包,同時也惡意吞並了網路
中其它共存流的帶寬資源,造成整個網路的公平性下降。
3. HSTCP(High Speed TCP)
HSTCP(高速傳輸控制協議)是高速網路中基於AIMD(加性增長和乘性減少)的一種新的擁塞控制演算法,它能在高速度和大時延的網路中更有效地提高網路的吞吐率。它通過對標准TCP擁塞避免演算法的增加和減少參數進行修改,從而實現了窗口的快速增長和慢速減少,使得窗口保持在一個足夠大的范圍,以充分利用帶寬,它在高速網路中能夠獲得比TCP
Reno高得多的帶寬,但是它存在很嚴重的RTT不公平性。公平性指共享同一網路瓶頸的多個流之間佔有的網路資源相等。
TCP發送端通過網路所期望的丟包率來動態調整HSTCP擁塞窗口的增量函數。
擁塞避免時的窗口增長方式: cwnd = cwnd + a(cwnd) / cwnd
丟包後窗口下降方式:cwnd = (1-b(cwnd))*cwnd
其中,a(cwnd)和
b(cwnd)為兩個函數,在標准TCP中,a(cwnd)=1,b(cwnd)=0.5,為了達到TCP的友好性,在窗口較低的情況下,也就是說在非
BDP的網路環境下,HSTCP採用的是和標准TCP相同的a和b來保證兩者之間的友好性。當窗口較大時(臨界值LowWindow=38),採取新的a
和b來達到高吞吐的要求。具體可以看RFC3649文檔。
4. westwood
無線網路中,在大量研究的基礎上發現tcpwestwood是一種較理想的演算法,它的主要思想是通過在發送端持續不斷的檢測ack的到達速率來進行帶寬估計,當擁塞發生時用帶寬估計值來調整擁塞窗口和慢啟動閾值,採用aiad(additive increase and
adaptive decrease)擁塞控制機制。它不僅提高了無線網路的吞吐量,而且具有良好的公平性和與現行網路的互操作性。存在的問題是不能很好的區分傳輸過程中的擁塞丟包和無線丟包,導致擁塞機制頻繁調用。
5. H-TCP
高性能網路中綜合表現比較優秀的演算法是:h-tcp,但它有rtt不公平性和低帶寬不友好性等問題。
6. BIC-TCP
BIC-TCP的缺點:首先就是搶占性較強,BIC-TCP的增長函數在小鏈路帶寬時延短的情況下比起標準的TCP來搶占性強,它在探測階段相當於是重新啟動一個慢啟動演算法,而TCP在處於穩定後窗口就是一直是線性增長的,不會再次執行慢啟動的過程。其次,BIC-TCP的的窗口控制階段分為binary
search increase、max probing,然後還有Smax和Smin的區分,這幾個值增加了演算法上的實現難度,同時也對協議性能的分析模型增加了復雜度。在低RTT網路 和低速環境中,BIC可能會過於「積極」,因而人們對BIC進行了進一步的改進,即CUBIC。是Linux在採用CUBIC之前的默認演算法。
7. CUBIC
CUBIC在設計上簡化了BIC-TCP的窗口調整演算法,
在BIC-TCP的窗口調整中會出現一個凹和凸(這里的凹和凸指的是數學意義上的凹和凸,凹函數/凸函數)的增長曲線,CUBIC使用了一個三次函數(即
一個立方函數),在三次函數曲線中同樣存在一個凹和凸的部分,該曲線形狀和BIC-TCP的曲線圖十分相似,於是該部分取代BIC-TCP的增長曲線。另
外,CUBIC中最關鍵的點在於它的窗口增長函數僅僅取決於連續的兩次擁塞事件的時間間隔值,從而窗口增長完全獨立於網路的時延RTT,之前講述過的HSTCP存在嚴重的RTT不公平性,而CUBIC的RTT獨立性質使得CUBIC能夠在多條共享瓶頸鏈路的TCP連接之間保持良好的RTT公平性。
CUBIC is a congestion control protocol for TCP (transmission control protocol) and thecurrent default TCP algorithm in Linux.
The protocol modifies the linear window
growth function of existing TCP standards to be a cubic function in
order to improve the scalability of TCP over fast and long distance
networks. It also achieves more equitable bandwidth allocations among
flows with different RTTs (round trip times) by making
the window growth to be independent of RTT – thus those flows grow
their congestion window at the same rate. During steady state, CUBIC
increases the window size aggressively when the window is far from the
saturation point, and the slowly when it is close
to the saturation point.This feature allows
CUBIC to be very scalable when the bandwidth and delay proct of the
network is large, and at the same time, be highly stable and also fair
to standard TCP flows.
8. STCP
STCP,Scalable tcp。
STCP演算法是由 Tom Kelly於 2003年提出的 ,通過修改 TCP的窗口增加和減少參數來調整發送窗口大小 ,以適應高速網路的環境。該演算法具有很高的鏈路利用率和穩定性,但該機制窗口增加和 RTT成反比 ,在一定的程度上存在著
RTT不公平現象 ,而且和傳統 TCP流共存時 ,過分佔用帶寬 ,其 TCP友好性也較差。
❹ Linux下實現簡單的TCP伺服器與客戶端通信
一直收的那個就不要寫輸入的代碼了,直接無限讀取就可以。
一直發的那個就不要寫輸出回的代碼答了,直接無限輸入就可以;
當然如果想兩個都想在伺服器和客戶端各種實現,那麼加入多線程吧。一個線程只管輸入,一個線程只管輸出
❺ 一般優化linux的內核,需要優化什麼參數
首先要知道一點所有的TCP/IP的參數修改是臨時的,因為它們都位於/PROC/SYS/NET目錄下,如果想使參數長期保存,可以通過編輯/ETC/SYSCTL.CONF文件來實現,這里不做詳細說明,只針對Linux的TCPIP內核參數優化列舉相關參數:
1、為自動調優定義socket使用的內存
2、默認的TCP數據接收窗口大小(位元組)
3、最大的TCP數據接收窗口
4、默認的TCP發送窗口大小
5、最大的TCP數據發送窗口
6、在每個網路介面接收數據包的速率比內核處理這些包速率快時,允許送到隊列的數據包最大數目
7、定義了系統中每一個埠最大的監聽隊列長度
8、探測消息未獲得相應時,重發該消息的間隔時間
9、在認定tcp連接失效之前,最多發送多少個keepalive探測消息等。
❻ linux 內核怎麼實現tcp nat 轉換的
1.兩個網路介面、一個內,一個外2.NAT轉換(內)操作步驟:1.設置
Linux內核
支持ip數據包的轉回發答:echo
"1"
>
/proc/sys/net/
ipv4
/ip_forward2.載入實現NAT功能必要的內核模塊:modprobe
ip_tablesmodprobe
ip_nat_ftpmodprobe
ip_nat_ircmodprobe...
❼ 如何修改linux tcp
Linux系統的TCP埠范圍是可以修改的,適當的調整TCP埠范圍以滿足個人需求,那麼具體要如何修改TCP埠范圍呢?不妨通過實例來了解下吧。
在啟動自定義服務的時候,希望使用8370埠,卻發現埠已經被nginx或node佔用了,無法啟動。但是lvs又已經申請了,改埠的話比較麻煩。所以可以修改下
/proc/sys/net/ipv4/ip_local_port_range
參數,使tcp協議分配的埠從一個比較大的范圍開始啟用,這樣,node或nginx就不會佔用較小的埠了。
代碼如下
echo 『32768 61000』 》 /proc/sys/net/ipv4/ip_local_port_range
補充:臨時埠范圍調整
你能使用netstat命令來顯示有多少個連接進入這個狀態:[若是生產環境下,最好先進行測試,然後考慮一個埠的合適范圍]
代碼如下
shell》netstat -n | grep TIME_WAIT
shell》cat /proc/sys/net/ipv4/ip_local_port_range
32768 61000
如果需要修改 echo 「start-number
end-number」,start-number和end-number是0-65536埠號范圍內的數,,0-1024最好不要用,通常是熟知埠,如果是專門的代理伺服器的話,很多熟知埠沒有使用,當然可以考慮!
不要忘記將echo命令加到系統啟動腳本中,以使機器每一次重啟後都生效