> 來源:?[酷 殼 – CoolShell.cn](http://coolshell.cn/)?
> 作者: 陳皓
TCP是一個巨復雜的協議,因為他要解決很多問題,而這些問題又帶出了很多子問題和陰暗面。所以學習TCP本身是個比較痛苦的過程,但對于學習的過程卻能讓人有很多收獲。關于TCP這個協議的細節,我還是推薦你去看[W.Richard Stevens](http://www.kohala.com/start/)的《[TCP/IP 詳解 卷1:協議](http://book.douban.com/subject/1088054/)》(當然,你也可以去讀一下[RFC793](http://tools.ietf.org/html/rfc793)以及后面N多的RFC)。另外,本文我會使用英文術語,這樣方便你通過這些英文關鍵詞來查找相關的技術文檔。
之所以想寫這篇文章,目的有三個,
* 一個是想鍛煉一下自己是否可以用簡單的篇幅把這么復雜的TCP協議描清楚的能力。
* 另一個是覺得現在的好多程序員基本上不會認認真真地讀本書,喜歡快餐文化,所以,希望這篇快餐文章可以讓你對TCP這個古典技術有所了解,并能體會到軟件設計中的種種難處。并且你可以從中有一些軟件設計上的收獲。
* 最重要的希望這些基礎知識可以讓你搞清很多以前一些似是而非的東西,并且你能意識到基礎的重要。
所以,本文不會面面俱到,只是對TCP協議、算法和原理的科普。
我本來只想寫一個篇幅的文章的,但是TCP真TMD的復雜,比C++復雜多了,這30多年來,各種優化變種爭論和修改。所以,寫著寫著就發現只有砍成兩篇。
* 上篇中,主要向你介紹TCP協議的定義和丟包時的重傳機制。
* 下篇中,重點介紹TCP的流迭、擁塞處理。
廢話少說,首先,我們需要知道TCP在網絡OSI的七層模型中的第四層——Transport層,IP在第三層——Network層,ARP在第二層——Data Link層,在第二層上的數據,我們叫Frame,在第三層上的數據叫Packet,第四層的數據叫Segment。
首先,我們需要知道,我們程序的數據首先會打到TCP的Segment中,然后TCP的Segment會打到IP的Packet中,然后再打到以太網Ethernet的Frame中,傳到對端后,各個層解析自己的協議,然后把數據交給更高層的協議處理。