1.1理解tcp基礎
? ? tcp/ip = {protocol1, protocol2,……,protocoln}
? ? Internet是在共享的線路上發送數據的:
? ? ? ? 在計算機上同時運行的程序通過一條單一的Modem或DSL線路連接互聯網。(有點像電腦只是插了一根網線的感覺)
? ? ? ? ==換句話說==> 程序共享這條線路
? ? ? ? ==如何實現共享==> (相當于要運送一個大部件,通常派送員會選擇將這個大部件拆分成各個小零件,寄到了家之后再通過說明書將其組裝起來【購買的踏步機】)大部件就相當于需要發送的“數據流”,派送員就相當于“tcp”,各個小零件就是“信息包”,快遞運輸線就好比“Internet”,寄到了家就是信息包到了”接收者“這里,合起來就是 ==>?tcp把要發送的數據流分解成很多小信息包在Internet上傳輸(或許還伴有其他程序的信息包),而這些信息包到了接收者的地方會再次重新合成在一起。
? ? ? ? ==這樣的好處==> 通過分解成小的信息包,Internet連接就會用很少的時間來發送數據的每一個比特(bit),而其他程序的信息包也可以同時被傳送。
? ? 使用地方:
? ? ? ? 1)你需要一個可靠的數據傳輸,以確保你的數據完整無缺地到達目的地;
? ? ? ?2)你的協議需要不止一個請求和服務器的回答;
? ? ? ?3)你要發送較多的數據;
? ? ? ?4)初始連接出現短暫的延遲是可以容忍的。
(1)尋址(為了實現信息包計劃,tcp需要做的事情)
? ? ? ?1)tcp需要識別遠程的機器:基于tcp/ip的網絡,每臺機器都有一個唯一的ip地址,識別機器就是知道了接受者機器的ip地址;
? ? ? ? ? ? ==>要知道讓人類記住一串諸如192.168.1.1這樣的數字是很困難的,所以有了DNS:
? ? ? ? ? ? 當你要和一個遠程機器建立連接的時候,先申請連接該機器ip地址相對應的dns,例如:www.google.com,dns就會提供一個ip地址,接下來就可以建立連接了。(python在程序中常常隱藏dns層,所以很多時候都不需要直到它的存在,第四仗中會詳細介紹dns)
? ? ? ?2)tcp需要知道是與遠程機器上運行的哪個程序通信(例如,你想給在北京的ann的機器發送信息,而她的機器上正運行著兩個聊天客戶端和一個web瀏覽器,她的機器需要直到哪個程序應該接收你傳過來的數據。):tcp使用端口號。每個程序使用一個唯一的端口號。這些端口號有時事先知道,有時隨機指定。
? ? ? ? ? ? ==>每個tcp連接的端點是由一個ip地址和一個端口號來唯一標識的。
(2)可靠性
? ? ? ? ? ?在Internet上傳輸數據有很多意外:Modem改變了數據的幾個字節、某個路由器或許丟失了一個信息包、系統或許收到了順序錯誤的信息包、一個信息包或許收到了兩次、一個主要的網絡電纜被鋤頭切斷了等等。
? ? ? ? ? ?tcp可靠:除非整個網絡出現問題,數據將被完好地按原樣正確地傳送到另外一端。
? ? ? ? ? ?==怎樣實現的?==>
? ? ? ? ? ?1)每個信息包都包含一個“校驗碼”:保證信息包在傳輸過程中沒有被更改的代碼。當信息包到達目的地的時候,接收方會比對校驗碼和收到的信息中的數據,若校驗碼不對,該信息包將被省略(drop)。
? ? ? ? ? ?2)反饋:防止信息包丟失,tcp要求接收方每收到一個信息包都反饋一下。如果接收方沒有反饋,發送方會自動重發一次。tcp會一直發送信息包直到接收者收到位置,或者tcp判斷出網絡連接斷了,在程序中返回一個錯誤提示。
? ? ? ? ? ?3)序號:為了防止信息包重復或順序錯誤,tcp每傳送一個信息包都會傳送一個序號。接收方會檢查這個序號,確保收到該信息包,并把全部信息包按順序重新合并。同時,若果接收方看到了一個已經看過的序號,則該信息包會被丟棄。
(3)路由
? ? ? ? ?信息包在傳遞過程中會經由許多不同網絡,比如:先通過你的DSL到達電話公司,接著到達你所在城市的一個Internet提供商,然后經過北京、上海等到達最終目的地。(dsl數字用戶線路)在此期間的每一站,來自其他成千上萬計算機的信息包也在一起被傳輸。在Internet上負責接收信息包并決定如何把它們傳輸到目的地的設備叫“路由器”。
(4)安全
? ? ? ? ?ssl(secure sockets layer):在tcp連接之上,與程序代碼混合在一層。提供服務器的認證(所以你知道你現在在和誰通話)、加密(所以其他人不能看到你的通信)和數據完整性(所以在沒有察覺時,傳輸途中的信息包沒有人能夠修改)。
? ? ? ? ?tls(transport layer security):與ssl相似,只包含在協議堆棧(protocol stack)中。
1.2使用客戶/服務器模式?
在客戶/服務器下,服務器一直在聽來自客戶端的請求,有請求后,就建立連接處理它們。
例如:當你打開一個瀏覽器并訪問www.google.como,瀏覽器會連接www.google.com的服務器,并請求訪問“/”頁(這個“/”頁表示該站點的首頁。服務器按順序找到這一頁,并把它傳送回你的客戶端,接著你的瀏覽器就能按照一定的格式顯示出來。
關鍵問題:客戶端總是最開始申請連接的一端,服務器則是等待客戶端連接的一端。
1)服務器端端口號:
在客戶/服務器模式中,服務器通常是聽一個大家都知道的端口號。例如:web服務器聽80端口,所以,web瀏覽器知道連接www.google.com的80端口來獲得信息。
(在www.iana.org上有一份由國際因特網地址分配委員會IANA維護的官方已分配的端口列表,在linux中,可在/etc/services下找到這個列表)
如果你編寫了一個服務器,它的服務不在這個列表上,就選擇一個比“1024”大,而且在你的機器上沒有被占用的端口號,這樣可以盡量避免和其他服務沖突(端口號最大可為65535)。
在linux上,只有系統管理員能請求訪問一個小于1024的端口。
2)客戶端端口號
客戶端端口號不是很重要,通常,客戶端會由操作系統隨機挑選一個保證沒有被使用的,被稱為“短命”的端口號,當服務器收到一個連接請求的時候,請求中帶有客戶端的端口號,數據會被傳輸到該端口上。
1.3理解udp
用處:從一個系統向其他系統傳送非常短的消息。
提供的保證:你收到的數據是完整的。它不能保證數據是否能被收到,也不能保證數據是不是只接收一次,還不能保證收到的信息次序是否和發送時候一樣。
優點:因為不需要提供那些保證,所以要比tcp低級,而tcp建立和關閉連接要花費時間,而udp對連接沒概念,所以不存在花費時間建立和關閉連接的問題。
實例:1)通常udp會用在客戶端向服務器申請一個bit的信息,如果沒有收到答復就會繼續申請。用得最廣的udp應用軟件是dns系統。2)udp還常被用在流式的音頻和視頻應用軟件,因為udp只是偶爾丟棄一個信息包,而tcp會過于嚴格地取出那些被丟棄的信息包,這樣音頻效果就會差很多。
使用地方:
1)不關心信息包是否到達或者不在意信息包到達的順序是否正確,再或者你可以自己察覺這些問題且自己解決;
2)你的協議只包括基本請求和回答;
3)你需要盡快建立網絡回話;
4)只傳送很少一部分數據。udp的限制是一個信息包不超過64KB的數據,通常人們只用udp傳送1KB以下的數據。
1.4理解物理傳輸和以太網
可在不同物理網絡硬件間傳送數據:以太網、端對端(PPP,Peer-Peer Protocol)撥號連接、令牌環連接、DSL連接、cable modems連接的網絡、人造衛星連接、移動電話以及T1專線連接==>TCP/IP
以太網:可向本地網絡所有的工作站廣播信息包。==>可用來給一個服務做廣告、向那些設計好的終端廣播、向所有人的PC廣播警告信息。
一個通過tcp/ip連接以太網的計算機有一個和該網絡接口相關的ip地址。它與本網絡的機器通信時,只要直接向該計算機發送消息就可以。如果要和網外的、在Internet上的其他機器通信,就必須把信息先發送到一個本地網絡上的路由器,然后由路由器決定信息包該發向哪里。
為了知道哪些機器是本地的,哪些是遠程的,網絡軟件會檢查源計算機和目的計算機ip地址的頭幾位(最有效部分)是不是相同的。每個網絡接口上都有網絡掩碼表明需要比較幾位。如果比較失敗了,說明開始的幾位是不同的,那么信息包必須經過路由器。其他在范圍之內的計算機利用廣播或直接傳輸則可以直接到達。