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

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

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

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

TCP數(shù)據(jù)包(TCP Datagram):
傳輸控制協(xié)議TCP是一種提供可靠數(shù)據(jù)傳輸?shù)耐ㄐ袇f(xié)議,他在網(wǎng)絡協(xié)議模塊和TCP模塊之間傳輸,TCP數(shù)據(jù)包分TCP包頭和數(shù)據(jù)兩個部分。TCP數(shù)據(jù)是被封裝在IP數(shù)據(jù)包中的,和udp類似,在IP數(shù)據(jù)包的數(shù)據(jù)部分。TCP包頭包含了源端口、目的端口、序列號、確認序列號、頭部長度、碼元比特、窗口、校驗和、緊急指針、可選項、填充位和數(shù)據(jù)區(qū),在發(fā)送數(shù)據(jù)時,應用層數(shù)據(jù)傳輸?shù)絺鬏攲樱由蟃CP的TCP包頭,數(shù)據(jù)就構成了包文。報文式網(wǎng)際層IP的數(shù)據(jù),如果再加上IP首部,就構成了IP數(shù)據(jù)包。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提供了一個完全可靠的、面向連接的、全雙工的(包含兩個獨立且方向相反的連接)流傳輸服務,允許兩個應用程序建立一個連接,并在全雙工方向上發(fā)送數(shù)據(jù),然后終止連接。每一個TCP連接可靠的建立并完善地終止,在終止發(fā)生前,所有數(shù)據(jù)都會被可靠地傳送。

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

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

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

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