一、TCP/IP的層次結構



1、應用層:為用戶的應用程序提供接口,使用戶可以訪問網絡。(IE瀏覽器就處於應用層)
HTTP、TFTP、FTP、NFS等屬於應用層的協議 。是用戶客戶端程序或軟件之間使用的協議。
HTTP 超文本傳輸協議(瀏覽網頁服務)
TFTP 文件傳輸協議(較快,但是不可靠)
FTP 文件傳輸協議(提供文件上傳,文件下載服務,較慢但是可靠)
NFS 網絡文件系統(Unix和Linux系統之間共享文件)
SMTP 簡單郵件傳輸協議(郵件的發送和轉發)
POP3 接收郵件(由服務器下載到本地)
Talnet (遠程登錄功能(配置交換機、路由器))
SNMP 簡單網絡管理協議(通過網管軟件來管理網絡)
DNS 域名系統,將域名解析為IP地址(將百度的域名轉換為服務器的IP地址)
2、傳輸層(運輸層):提供端到端的通信(兩台計算機上的軟件間的連接),對信息流具有調節作用。
TCP、UDP屬於運輸層的協議。在TCP/IP協議族中,網絡層IP提供的是一種不可靠的服務,,它盡可能的把分組從源節點送到目的節點,但是並不提供任何可靠保證。而TCP在不可靠的IP層上提供了一個可靠的運輸層(參見TCP三次握手),為了提供這種可靠的服務,TCP采用了超時重傳,發送和接收的端到端的確認分組等機制。
TCP 傳輸控制協議 面向連接(打電話) 可靠服務
在通信之前要先建立連接 需要同時在線
UDP 用戶數據報協議 非面向連接(發快遞)不可靠 不穩定 但速度更快

源端口(Source Port) 目的端口(Desination Port)
序列號(Sequence Number)【數據包的序號】
確認號(Acknowledgment Number)(序列號+1)【用於指示下一個數據包序號】
報頭的長度(HLEN):以32字節為單位的報頭長度
保留域(Reserved):設置為0
編碼位(Code Bits):用於控制段的傳輸(如會話的建立和終止)
包括:URG、ACK、PSH、RST、SYN、FIN 6個位
SYN(synchronous):請求建立TCP連接
FIN:斷開TCP連接
RST:重置TCP連接
ACK:確認、反饋連接情況
PSH:將數據立刻送到應用層進行處理的命令
URG:判斷緊急指針是否有效的命令
窗口大小(Windows):接收方能夠繼續接收的字節數【控制發送的速度】
校驗和(Checksum):baokuo TCP報頭和數據在內的校驗和【判斷數據傳輸是否出錯】
緊急指針(Urgent Pointer):當前序列號到緊急位置的偏移量
選項(Option):廠商根據需要自定義的內容
MAC地址
數據(Data):上層協議數據

HTTP:80
端口范圍是:0-6535(1 --- 255 之間一般是知名的端口號;256 --- 1023的端口號,通常是由Unix系統占用(系統占用);1024 ---5000 是大多數TCP、IP實現的臨時分配;大於5000的一般是給其他服務預留的(Internet上並不常用的服務))





3、網絡層(Internet層):IP包的封裝和路徑的選擇
ICMP、IP、IGMP是網絡層的協議。ICMP(控制報文協議)是IP協議的附屬協議,IP層用它來與其他主機或路由器交換錯誤報文和其他重要信息;ICMP是Internet組管理協議,它用來把一個UDP數據多播到多個主機上。
網絡層的協議
IP數據包的封裝,定義IP地址
ICMP錯誤診斷(用ping測試網絡連通性)
ARP將IP地址解析為MAC地址
RARP將MAC地址轉換為IP地址
IP地址分類:IPV4長32位共4個字節(用點分十進制記法表示),由網絡地址和主機地址組成。網絡地址表示其屬於互聯網的哪一個網絡,主機地址表示其屬於該網絡中的哪一台主機。二者是主從關系;又按字節分成4段,每個字段是一個字節,8位,最大值是255。
IP地址根據網絡號和主機號分為A、B、C三類及特殊地址D、E。 全0和全1的都保留不用。
A類:(1.0.0.0-126.0.0.0)(默認子網掩碼:255.0.0.0或 0xFF000000)第一個字節為網絡號,后三個字節為主機號。該類IP地址的最前面為“0”,所以地址的網絡號取值於1~126之間。一般用於大型網絡。
B類:(128.0.0.0-191.255.0.0)(默認子網掩碼:255.255.0.0或0xFFFF0000)前兩個字節為網絡號,后兩個字節為主機號。該類IP地址的最前面為“10”,所以地址的網絡號取值於128~191之間。一般用於中等規模網絡。
C類:(192.0.0.0-223.255.255.0)(子網掩碼:255.255.255.0或 0xFFFFFF00)前三個字節為網絡號,最后一個字節為主機號。該類IP地址的最前面為“110”,所以地址的網絡號取值於192~223之間。一般用於小型網絡。
D類:是多播地址。該類IP地址的最前面為“1110”,所以地址的網絡號取值於224~239之間。一般用於多路廣播用戶[1] 。
E類:是保留地址。該類IP地址的最前面為“1111”,所以地址的網絡號取值於240~255之間。
在IP地址3種主要類型里,各保留了3個區域作為私有地址,其地址范圍如下:
A類地址:10.0.0.0~10.255.255.255
B類地址:172.16.0.0~172.31.255.255
C類地址:192.168.0.0~192.168.255.255
回送地址:127.0.0.1。 也是本機地址,等效於localhost或本機IP。一般用於測試使用。例如:ping 127.0.0.1來測試本機TCP/IP是否正常。
4、數據鏈路層:為上層提供可靠的數據幀透明傳輸
鏈路管理、幀同步、尋址、流量控制、差錯控制
MAC地址(網卡編號):48位的二進制數。表示為12位的16進制數。分為兩部分:前24位為廠商編號,后24位為網卡的編號(由專門的機構分配)
二、TCP/IP各層數據封裝過程

UDP數據與TCP數據基本一致,唯一不同的是,UDP傳給IP的信息單元稱為UDP數據包,並且UDP的首部長為8字節。
在上面的TCP、IP的分層結構圖中我們可以看見,用戶程序、TCP、UDP、ICMP等都會向IP傳送數據,因此在IP的首部加入了長度為8bit的標識;1表示ICMP協議,2表示IGMP協議,6表示TCP,17表示UDP協議。
TCP、和UDP在傳送數據的過程中都會用到一個16bit的端口號來表示不同的應用程序TCP和UDP把源端口號和目的端口號分別存入報文首部中。(216= 65536)
網絡接口通常要發送和接收IP、ARP、RARP數據,因此在以太網的首部(及幀的首部)也有一個16bit的標識。
數據封裝過程
三、各層數據包的結構
1、(鏈路層)以太幀結構(http://c.biancheng.net/view/6391.html)
字段 | 含義 |
---|---|
前同步碼 | 用來使接收端的適配器在接收 MAC 幀時能夠迅速調整時鍾頻率,使它和發送端的頻率相同。前同步碼為 7 個字節,1 和 0 交替。 |
幀開始定界符 | 幀的起始符,為 1 個字節。前 6 位 1 和 0 交替,最后的兩個連續的 1 表示告訴接收端適配器:“幀信息要來了,准備接收”。 |
目的地址 | 接收幀的網絡適配器的物理地址(MAC 地址),為 6 個字節(48 比特)。作用是當網卡接收到一個數據幀時,首先會檢查該幀的目的地址,是否與當前適配器的物理地址相同,如果相同,就會進一步處理;如果不同,則直接丟棄。 |
源地址 | 發送幀的網絡適配器的物理地址(MAC 地址),為 6 個字節(48 比特)。 |
類型 | 上層協議的類型。由於上層協議眾多,所以在處理數據的時候必須設置該字段,標識數據交付哪個協議處理。例如,字段為 0x0800 時,表示將數據交付給 IP 協議。 |
數據 | 也稱為效載荷,表示交付給上層的數據。以太網幀數據長度最小為 46 字節,最大為 1500 字節。如果不足 46 字節時,會填充到最小長度。最大值也叫最大傳輸單元(MTU)。 在 Linux 中,使用 ifconfig 命令可以查看該值,通常為 1500。 |
幀檢驗序列 FCS | 檢測該幀是否出現差錯,占 4 個字節(32 比特)。發送方計算幀的循環冗余碼校驗(CRC)值,把這個值寫到幀里。接收方計算機重新計算 CRC,與 FCS 字段的值進行比較。如果兩個值不相同,則表示傳輸過程中發生了數據丟失或改變。這時,就需要重新傳輸這一幀。 |
2、(網絡層)IP數據報結構(https://blog.csdn.net/prsniper/article/details/6762145)
如圖,一個刻度表示1個二進制位(比特)。
1-1.版本4位,表示版本號,目前最廣泛的是4=B1000,即常說的IPv4;相信IPv6以后會廣泛應用,它能給世界上每個紐扣都分配一個IP地址。
1-2.頭長4位,數據包頭部長度。它表示數據包頭部包括多少個32位長整型,也就是多少個4字節的數據。無選項則為5(紅色部分)。
1-3.服務類型,包括8個二進制位,每個位的意義如下:
過程字段:3位,設置了數據包的重要性,取值越大數據越重要,取值范圍為:0(正常)~ 7(網絡控制)
延遲字段:1位,取值:0(正常)、1(期特低的延遲)
流量字段:1位,取值:0(正常)、1(期特高的流量)
可靠性字段:1位,取值:0(正常)、1(期特高的可靠性)
成本字段:1位,取值:0(正常)、1(期特最小成本)
保留字段:1位 ,未使用
1-4.包裹總長16位,當前數據包的總長度,單位是字節。當然最大只能是65535,及64KB。
2-1.重組標識16位,發送主機賦予的標識,以便接收方進行分片重組。
2-2.標志3位,他們各自的意義如下:
保留段位(2):1位,未使用
不分段位(1):1位,取值:0(允許數據報分段)、1(數據報不能分段)
更多段位(0):1位,取值:0(數據包后面沒有包,該包為最后的包)、1(數據包后面有更多的包)
2-3.段偏移量13位,與更多段位組合,幫助接收方組合分段的報文,以字節為單位。
3-1.生存時間8位,經常ping命令看到的TTL(Time To Live)就是這個,每經過一個路由器,該值就減一,到零丟棄。
3-2.協議代碼8位,表明使用該包裹的上層協議,如TCP=6,ICMP=1,UDP=17等。
3-3.頭檢驗和16位,是IPv4數據包頭部的校驗和。
4-1.源始地址,32位4字節,我們常看到的IP是將每個字節用點(.)分開,如此而已。
5-1.目的地址,32位,同上。
6-1.可選選項,主要是給一些特殊的情況使用,往往安全路由會當作攻擊而過濾掉,普聯(TP_LINK)的TL-ER5110路由就能這么做。
7-1.用戶數據。
3、(傳輸層)tcp數據包結構(https://blog.csdn.net/prsniper/article/details/6762145)
1-1.源始端口16位,范圍當然是0-65535啦。
1-2.目的端口,同上。
2-1.數據序號32位,TCP為發送的每個字節都編一個號碼,這里存儲當前數據包數據第一個字節的序號。
3-1.確認序號32位,為了安全,TCP告訴接受者希望他下次接到數據包的第一個字節的序號。
4-1.偏移4位,類似IP,表明數據距包頭有多少個32位。
4-2.保留6位,未使用,應置零。
4-3.緊急比特URG—當URG=1時,表明緊急指針字段有效。它告訴系統此報文段中有緊急數據,應盡快傳送(相當於高優先級的數據)。
4-3.確認比特ACK—只有當ACK=1時確認號字段才有效。當ACK=0時,確認號無效。參考TCP三次握手
4-4.復位比特RST(Reset) —當RST=1時,表明TCP連接中出現嚴重差錯(如由於主機崩潰或其他原因),必須釋放連接,然后再重新建立運輸連接。參考TCP三次握手
4-5.同步比特SYN—同步比特SYN置為1,就表示這是一個連接請求或連接接受報文。參考TCP三次握手
4-6.終止比特FIN(FINal)—用來釋放一個連接。當FIN=1時,表明此報文段的發送端的數據已發送完畢,並要求釋放運輸連接。
4-7.窗口字段16位,窗口字段用來控制對方發送的數據量,單位為字節。TCP連接的一端根據設置的緩存空間大小確定自己的接收窗口 大小,然后通知對方以確定對方的發送窗口的上限。
5-1.包校驗和16位,包括首部和數據這兩部分。在計算檢驗和時,要在TCP報文段的前面加上12字節的偽首部。
5-2.緊急指針16位,緊急指針指出在本報文段中的緊急數據的最后一個字節的序號。
6-1.可選選項24位,類似IP,是可選選項。
6-2.填充8位,使選項湊足32位。
7-1.用戶數據