IP /TCP協議及握手過程和數據包格式中級詳解
IP地址
定義:
IP被稱為網際協議,是Internet上使用的一個關鍵的底層協議。TCP/IP是通用的通信協議,使Internet成為一個允許連接不同類型的計算機和不同操作系統的網絡。
特點:
IP協議具有能適應各種各樣網絡硬件的靈活性,對底層網絡硬件幾乎沒有任何要求,任何一個網絡只要可以從一個地點向另外一個地點傳送二進制數據,記憶可以使用IP協議加入Internet。
要求:
為了通信的需求,連接Internet的每臺計算機上都必須運行IP軟件。,以便時刻準備發送或接收信息。
實質:
IP地址是由IP協議規定的,由32位的二進制數表示(IPv4)。***的IPv6協議將IP地址升為128位,這使得IP地址更加廣泛,能夠很好的解決目前IP地址緊缺的情況。但是IPv6協議距離實際應用還有一段距離,目前多數操作系統和應用軟件都是以32位的IP地址為基準。
組成:
32位的IP地址(IPv4)主要分為兩個部分,即前綴和后綴。前綴表示計算機所屬的物理網絡(網絡號),后綴確定該網絡上的唯一一臺計算機(主機號)。 即 :
IP地址=網絡號+主機號
分類:
在Internet上,每一個物理網絡都有一個唯一的網絡號,根據網絡號的不同,可以將IP地址分為5類,即A類、B類、C類、D類和E類。其中A類、B類和C類屬于基本類,D類用于多播發送,E類屬于保留類。各類IP地址的范圍如下:
網絡地址:
在IP地址中主機地址為0的表示網絡地址。例如:128.111.0.0。
廣播地址(全‘1’地址):
在網絡號后所有為全是1的地址,表示廣播地址。
回送地址:
127.0.0.1表示回送地址,也叫本機地址,用于測試。
全‘0’地址:
對應當前主機。
ABC主要類型地址保留區域:

域名系統(DNS)
域名系統是一個分布的數據庫,它提供將主機名(即網址)轉換成IP地址的服務。
RFC
Request For Comments(RFC),是一系列以編號排定的文件。文件收集了有關互聯網相關信息,以及UNIX和互聯網社區的軟件文件,包括了tcp/ip協議的標準文檔。
端口(port)
端口(Port)包括邏輯端口和物理端口兩種類型。
物理端口指的是物理存在的端口,如ADSL Modem、集線器、交換機、路由器上用于連接其他網絡設備的接口,如RJ-45端口、SC端口等等。
邏輯端口是指邏輯意義上用于區分服務的端口,如TCP/IP協議中的服務端口,端口號的范圍從0到65535,比如用于瀏覽網頁服務的80端口,用于FTP服務的21端口等。

端口號(Port Code)
由于物理端口和邏輯端口數量較多,共(2^16-1)個,為了對端口進行區分,將每個端口進行了編號,這就是端口號。運輸層的端口號分為服務端使用的端口號(0-49151[熟知端口號(0-1023)、登記端口號(1024-49151)])和客戶端使用的端口號(49151-65535)。網絡常用端口號 - 姜亞軻的博客 - CSDN博客
應用編程接口(API,Application Programming Interface)
API是一些預先定義的函數。常用的編程接口有socket和TLI。其功能主要包括:遠程過程調用(RPC)、標準查詢語言(SQL)、文件傳輸和信息交付等。API 可以應用于所有計算機平臺和操作系統。
概要設計文檔的接口部分簡單,一般分為:用戶接口、外部接口和內部接口三個部分。用戶接口只要簡述用戶操作和反饋結果等;外部接口簡述硬件輸入輸出、網絡傳輸協議等;內部接口簡述模塊間傳值、數據傳遞等即可。

數據包格式
TCP/IP協議的每層都會發送不同的數據包,常見的有IP書包,TCP數據包,UDP數據包和ICMP數據包。
IP數據包(IP Datagram):
IP數據包是在IP協議間發送的,主要在以太網與網際協議模塊之間傳輸,提供無鏈接數據博愛傳輸。IP協議不保證數據包的發送,但***限度的發送數據。IP協議提供不可靠無連接的數據報傳輸服務,IP層提供的服務是通過IP層對數據報的封裝與拆封來實現的。IP協議結構定義如下:
- typedef struct HeadIP {
- unsigned char headerlen: 4; //首部長度,占4位
- unsigned char version: 4 ; //版本,占4位
- unsigned char servertype ; //服務類型,占8位,即一個字節
- unsigned short totallen; //總長度,占16位
- unsigned short id ; // 與idoff構成表示,共占16位,前3位是標識,后13位是片偏移
- unsigned short idoff;
- unsigned char ttl ; //生存時間,占 8位
- unsigned char proto ;//協議,占8位
- unsigned short checksum ;// 首部檢驗和,占16位
- unsigned int sourceIP ; // 源IP地址 ,占32位
- unsigned int destIP ;// 目的IP地址,占32 位
- }HeadIP;
注:理論上,IP數據包的***長度時655535字節,這是由IP首部16位總長度字段所限制的。
IP路由選擇過程:

TCP數據包(TCP Datagram):
傳輸控制協議TCP是一種提供可靠數據傳輸的通行協議,他在網絡協議模塊和TCP模塊之間傳輸,TCP數據包分TCP包頭和數據兩個部分。TCP數據是被封裝在IP數據包中的,和udp類似,在IP數據包的數據部分。TCP包頭包含了源端口、目的端口、序列號、確認序列號、頭部長度、碼元比特、窗口、校驗和、緊急指針、可選項、填充位和數據區,在發送數據時,應用層數據傳輸到傳輸層,加上TCP的TCP包頭,數據就構成了包文。報文式網際層IP的數據,如果再加上IP首部,就構成了IP數據包。TCP包頭結構定義如下:
- typedef struct HeadTCP{
- WORD SourcePort ; //16位源端口號
- WORD DePort ;// 16位目的端口號
- DWORD SequenceNo ;//32位序列號
- DWORD ConfirmNo ;// 32位確認序列號
- BYTE HeadLen ; //與Flag為一個組成部分,首部長度,占4位,保留6位,6位表示,共16位
- BYTE Flag;
- WORD WndSize ; //16位窗口大小
- WORD CheckSum ; //16位校驗和
- WORD UrgPrt;// 16位緊急指針
- }HeadTCP;
TCP提供了一個完全可靠的、面向連接的、全雙工的(包含兩個獨立且方向相反的連接)流傳輸服務,允許兩個應用程序建立一個連接,并在全雙工方向上發送數據,然后終止連接。每一個TCP連接可靠的建立并完善地終止,在終止發生前,所有數據都會被可靠地傳送。

TCP比較有名的概念是3次握手,所謂3次握手指通信雙方批次交換3次信息。3次握手是在數據包丟失、重復和延遲的情況下,確保通信雙方信息交換確定性的充分必要條件。
TCP/IP 三次握手建立連接:
***次握手:客戶端--發送----syn包(seq=x)-----服務器--進入SYN_END狀態,等待服務器確認;
第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=x+1),同時自己也發送一個SYN包(seq=x),即SYN+ACK包,此時服務器進入SYN——RECV狀態;
第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=y+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成握手,連接建立。

注:握手時,發送的包不包括數據;連接建立后,才開始正式傳輸數據。在主動關閉連接之前,TCP連接將會被一直保持下去。
數據傳輸機制:
1. 超時重傳:該機制用來保證TCP傳輸的可靠性。
2.快速重輸:發送端在收到連續的丟包信息后,立即啟動重傳,節約等待超時時間。
3.流量控制:TCP滑動窗流量控制。滑動窗可以是提高TCP傳輸效率的一種機制。
4.擁塞控制:基于整個網絡考慮的,擁堵策略算法主要包括:慢啟動,擁塞避免,擁塞發生,快速恢復。
TCP四次握手斷開連接:
***次握手:主斷方發送一個FIN,通知被斷方:我即將關閉數據傳輸通道。此時主斷方還可接收數據。
第二次握手:被斷方收到FIN包后,發送一個ACK給主斷方,確認序號為收到的序號+1(與SNK相同,一個FIN占用一個序號)。
第三次握手:被斷方發送一個FIN,通知主動方:我即將關閉數據傳輸通道。
第四次握手:主斷方收到FIN后,發送一個ACK給被斷方,確認序號為收到的序號+1,通道雙方斷開。四次揮手完成 。

注:可靠傳輸服務軟件都是面向數據流的。
UDP數據包:
用戶數據包協議UDP是一個面向無連接的協議,采用該協議后,兩個應用程序不需要建立連接,他為應用程序提供一次向的數據傳輸服務。UDP協議工作在網際協議模塊與UDP模塊之間,不提供差錯恢復,不能提供數據重傳,所以使用UDP協議的應用程序都比較復雜,例如DNS(域名解析服務)應用程序。UDP數據包包頭結構如下:
- typedef struct HeadUDP {
- WORD SourcePort ;// 16位端口號
- WORD DePort ; //16位目的端口
- WORD Len;//16位UDP長度
- WORD ChkSum;// 16位UDP校驗和
- }HeadUDP;
UDP數據包分為偽首部和首部兩個部分。
首部包含原IP地址、目標IP地址、協議字、UDP長度、源端口、目的端口、包文長度、校驗和、數據區,是為了計算和檢驗而設置的。
偽首部包含IP首部一些字段,其目的是讓UDP兩次檢查數據是否正確到達目的地。使用UDP協議時,協議字為17,包文長度包括頭部和數據區的總長度,最小8個字節。校驗和是以16為單位,各位求補(首位為符號位)將和相加,然后再求補。
現在的大部分系統默認提供了可讀寫大于8192字節的UDP數據包(使用這個默認值是因為8192是NFS讀寫用戶數據的默認值)。因為UDP協議是誤差錯控制的,所以發送過程與IP協議類似,即IP分組,然后用ARP協議來解析物理地址,***發送。
UDP網絡發送和接收數據:

ICMP數據包
ICMP協議被稱為網際控制包文協議。作為IP協議的附屬協議,ICMP協議用來與其他主機或路由器交換錯誤包文和其他重要信息,可以將某個設備的故障信息發送到其他設備上。ICMP數據包包頭結構如下:
- typedef struct HeadICMP {
- BYTE Type ;//8位類型
- BYTE Code; //8位代碼
- WORD ChkSum;// 16位校驗和
- }HeadICMP;