溫習tcp知識

myownstars發表於2013-04-03

 

什麼是TCP

TCP是一種面向連線(連線導向)的、可靠的、基於位元組流的運輸層(Transport layer)通訊協議;

在簡化的計算機網路OSI模型中,它完成第四層傳輸層所指定的功能,UDP是同一層內另一個重要的傳輸協議

全雙工模式

telnet/ssh/ftp/http都建立在TCP

 

三次握手協議

建立連線

連線方 SYNà  接收方

   ßSYN|ACK

     ACK à

 

關閉連線

連線方 FINà 接收方

   ßFIN|ACK

    FIN|ACK à 接收方關閉

  Time_wait後連線方自動關閉

 

 

MTU

IP包分片,,通常與通訊介面有關;

乙太網最大MTU1500jumboFrames支援最大支援9000

 

round  trip time(RTT):一個資料包從傳送到確認被接收所需時間

retransmission timeout(RTO):等待ACK超時重新傳輸資料包,最小200ms 

TCP Receive Window(RWIN):—接收端在通知傳送者之前可接收的資料包大小;

視窗大小取決於接收端為此TCP連線分配的記憶體大小,同時傳送端也需相應設定,因為被髮送的資料在被確認接收前,一直快取在sender的記憶體中,以便接收失敗時重新傳送;

bandwidth-delay product(BDP):即在傳送和接收端之間正在傳輸的資料最大bit;高效能的網路都有很大的BDP,假定某鏈路頻寬10 Gbit/s,延遲RTT0.5s,則其BDP= 0.5 * 10G bit= 5G bit= 625 MB;


效能限制

使用TCP通訊協議的鏈路,其吞吐量除了頻寬外,還受TCP視窗和網路延遲的影響;

根據木桶原理,任何一點都可能成為鏈路的瓶頸;

例如,某鏈路頻寬為1G,網路延遲為30ms,預設的TCP視窗為64KB

則其實際吞吐量= min(band width, window size/round trip time) = min(1G, 65536/0.03) = min(1G, 17.4M) = 17.4M

為了提高頻寬利用率,需要提升window size或降低RTT,但是後者遠比前者困難的多;

提升window size需要用到TCP window scale option,可以讓TCP接收視窗超過65535位元組上限,Linux 2.6.8預設開啟此功能tcp_window_scaling

根據上述公式可反推出TCP window size = bandwidth * RTT = 1 000 000 000 bps * 0.03 s= 30 000 000 bits/8 = 3 750 000 Bytes

 

注:這些buffer必須位於記憶體中,不可swap;而且傳送端也需要設定同樣大小的視窗,因為在確認接收前必須將其保留於記憶體中,以便傳送失敗時重發;

另外,任何的包丟失都會導致整個視窗所有包重新傳輸(除非使用了selective acknowledgement)

http://bradhedlund.com/2008/12/19/how-to-calculate-tcp-throughput-for-long-distance-links/

 

相應引數

 

[oracle@justin ipv4]$ pwd

/proc/sys/net/ipv4

tcp_window_scaling

啟用window scale,將視窗上限從64K提升為更高

tcp_moderate_rcvbuf

自動調整接收緩衝

[oracle@justin ipv4]$ more tcp_moderate_rcvbuf

1

 

tcp_wmem/tcp_rmem

設定TCP連線接收和傳送快取的大小,依次為min/default/max

[oracle@justin ipv4]$ more tcp_wmem

4096    16384   4194304

[oracle@justin ipv4]$ more  tcp_rmem

4096    87380   4194304

 

tcp_sack

啟用selectivty acknowledgment,一旦發生丟包只需傳送丟失的部分,而不用將整個視窗的包全部重傳

[oracle@justin ipv4]$ more tcp_sack

1

tcp_syn_retries

定義SYN重試次數,可一定程度上防止syn flood攻擊

SYN flood攻擊

向伺服器發起tcp連線請求,在伺服器回發SYN+ACK之前斷線,導致伺服器在一定時間內重發直至超時;

如果惡意攻擊者大量模擬這種操作,伺服器會維護一個非常大的半連線列表從而耗盡CPU資源設定導致堆疊溢位;

[oracle@justin ipv4]$ more tcp_syn_retries

5

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15480802/viewspace-757720/,如需轉載,請註明出處,否則將追究法律責任。

相關文章