linux網路程式設計 TCP/IP簡述
IP協議介紹:
網際層的IP協議是TCP/IP體系中的核心協議,他提供無連線的傳輸服務,不能保證資料報的可靠傳輸。
IP資料報的完整格式如下:
版本:4位 ,如果建立該資料報的IP協議的版本資訊,如果版本是4,對應是IPv4
首部長度:除了IP選型及及相關的填充欄位以外,首部所有欄位的長度都是固定的,當IP的首部長度不是4位元組的整數倍時,必須利用最後一個填充欄位加以填充,當首部不含選項和填充時,長度為20位元組。
總長度:16位,總長度是首部和資料之和的長度,因其16位的限制,所以一個數據報最長為65536(2的16次方)位元組。
標識(16位),標誌(3位),段偏移量(13位)這3個欄位用於控制IP資料報的分片和重組。
壽命(8位) TTL (Time To Live)又稱生存時間,該欄位設定了改資料報文在網際網路系統中允許存在的時間,以秒為單位
協議(8位)指出此資料報攜帶的運輸層資料使用的是何種協議,YCP的保留值為6,UDP的保留值為17,ICMP的保留值為1
首部校驗和(16位)用於保證首部資料的完整性,確保報頭在傳輸過程中不被改變,發現校驗和出錯時,對資料報不做任何處理,立即丟棄
源IP地址(32位),目的IP地址(32位):包含了資料報文的傳送方和接收方的IP地址,資料報文可能經過許多中間路由器,但這2個欄位始終不變,它們指定了源站和目的站的IP地址
資料欄位說明了資料報文的資料區的開始,IP選項欄位的長度是可變的,填充欄位取決於所選的項。
服務型別(8位):用來獲得更好的服務,其中前3個位元表示優先順序,第4個位元表示要求有更低的時延,第5個位元表示有更高的吞吐量,第6個位元要求有更高的可靠性,第7個位元表示選擇費用更廉價的路由,最有一個目前尚未使用
IP地址就是給每個連結在Internet上的主機分配的一個全世界唯一的32位的識別符號,他標識著一個主機的位置
ABC 類的IP地址都是由 網路號和主機號2部分組成,前者表示屬於哪個網路,後者表示哪個主機
子網掩碼:一個網路中的主機很多且分佈在很大的地理範圍的時候,為了便於對主機的管理,可以將一個網路中的主機劃分為若干個子網,用IP地址中的主機號欄位中的前若干位作為“子網號欄位”,後面的仍然作為主機號欄位,TCP/IP體系中規定用一個32位idea子網掩碼來表示子網號欄位的長度
TCP協議介紹:
TCP是TCP/IP體系中的運輸層協議,他可以保證資料的可靠的傳輸。
TCP協議的資料包格式如下:
源埠和目的埠(各佔16位):源主機和目的主機的埠號
序號:用來表示從TCP傳送端想TCP接受端傳送的資料位元組流,負責在資料報的排序重組時起作用
確認號:主機期望收到的對方下一次傳送資料的第一個位元組的序號
首部長度:表示首部總長度
碼元位元:分為6個標誌
分別為:
URG 傳送緊急資料
ACK 指出確認欄位是否有效
PSH 接受方應該儘快將這個報文提交給應用層
RET 重建連線
SYN 同步序號用來請求連線
FIN 用來釋放連線
視窗:用來自定緩衝區大小,通告每次傳送一個 報文段希望接受多少資料。
TCP的連結與終止:
提要:計算機的TCP連結中會引起程序的阻塞,簡單理解就是暫停,所以在執行網路的程式的時候就可以理解listen之後為何accept沒有被立即執行,而是等到客戶端有了連線之後才被執行。
TCP連線的建立:
TCP是面向連線的協議,TCP連線eider建立和釋放是每一個通訊中必不可少的過程,連結的建立需要經過3次資料傳輸,如上圖
具體建立的步驟說明如下:
1:伺服器必須已經準備好接受客戶的連線請求,這通過呼叫socket .bin 和listen函式來完成,客戶端通過呼叫connect函式進行主動開啟,者應期客戶端傳送一個SYN分節到伺服器端
2:伺服器端收到客戶端發來的SYN分節後,必須傳送ACK對其進行確認,同時方一個自己的SYN分節給客戶端,表示接受客戶端建立連線的請求
3:客戶端傳送ACK確認伺服器的SYN,連線建立成功
TCP連線的中止:
具體步驟:
(1)客戶端應用程序呼叫close,呼叫close的結果就是傳送一個FIN分節主動掛壁連線。
(2)服務收到FIN後執行被動關閉,傳送ACK對客戶端的FIN進行確認
(3)當伺服器將待發的資料傳送完後,呼叫close關閉它的套接字,這導致他的TCP傳送一個FIN分節給客戶端
(4)接受到伺服器的FIN分節後,對其傳送一個ACK確認分節,當前的連結被徹底關閉
UDP協議:
使用者資料報協議UDP是面向無連線的服務,提供不可靠的資料服務,一個UDP客戶端可以只建立一個套接字向不同客戶端傳送資料報
埠號:
系統中有很多程序,允許同時存在多條程序使用TCP和UDP協議,而這些呼叫協議的程序都是通過埠號來區別的,當一個客戶端與伺服器通訊的時候,伺服器需要將自己連結到一個埠上等待客戶端的連線