文章目錄
深入理解TCP/IP協議
1、TCP/IP協議的概念
先看看百度的定義:
TCP/IP(Transmission Control Protocol/Internet Protocol,傳輸控制協議/網際協議)
是指能夠在多個不同網絡間實現信息傳輸的協議簇。TCP/IP協議不僅僅指的是TCP 和IP兩個協議,而是指一個由FTP、SMTP、TCP、UDP、IP等協議構成的協議簇, 只是因爲在TCP/IP協議中TCP協議和IP協議最具代表性,所以被稱爲TCP/IP協議
。
TCP/IP 協議是互聯網相關各類協議族的總稱。那麼TCP/IP 協議具體包括了哪些協議呢?
協議名 | 全名 | 含義 |
---|---|---|
TCP | 傳輸控制協議(Transmission Control Protocol) | TCP 用於從應用程序到網絡的數據傳輸控制。TCP 負責在數據傳送之前將它們分割爲 IP 包,然後在它們到達的時候將它們重組。(分割、重組) |
IP | 網際協議(Internet Protocol) | IP 負責計算機之間的通信。IP 負責在因特網上發送和接收數據包。 |
HTTP | 超文本傳輸協議(Hyper Text Transfer Protocol) | HTTP 負責 web 服務器與 web 瀏覽器之間的通信。HTTP 用於從 web 客戶端(瀏覽器)向 web 服務器發送請求,並從 web 服務器向 web 客戶端返回內容(網頁)。 |
HTTPS | 安全的 HTTP(Secure HTTP) | HTTPS 負責在 web 服務器和 web 瀏覽器之間的安全通信。作爲有代表性的應用,HTTPS 會用於處理信用卡交易和其他的敏感數據。 |
SSL | 安全套接字層(Secure Sockets Layer) | SSL 協議用於爲安全數據傳輸加密數據。 |
SMTP | 簡易郵件傳輸協議(Simple Mail Transfer Protocol) | SMTP 用於電子郵件的傳輸。 |
MIME | 多用途因特網郵件擴展(Multi-purpose Internet Mail Extensions) | MIME 協議使 SMTP 有能力通過 TCP/IP 網絡傳輸多媒體文件,包括聲音、視頻和二進制數據。 |
IMAP | 因特網消息訪問協議(Internet Message Access Protocol) | IMAP 用於存儲和取回電子郵件。 |
POP | 郵局協議(Post Office Protocol) | POP 用於從電子郵件服務器向個人電腦下載電子郵件。 |
FTP | 文件傳輸協議(File Transfer Protocol) | FTP 負責計算機之間的文件傳輸。 |
NTP | 網絡時間協議(Network Time Protocol) | NTP 用於在計算機之間同步時間(鍾)。 |
DHCP | 簡單網絡管理協議(Simple Network Management Protocol) | DHCP 用於向網絡中的計算機分配動態 IP 地址。 |
SNMP | 簡單網絡管理協議(Simple Network Management Protocol) | SNMP 用於計算機網絡的管理。 |
LDAP | 輕量級的目錄訪問協議(Lightweight Directory Access Protocol) | LDAP 用於從因特網蒐集關於用戶和電子郵件地址的信息。 |
ICMP | 因特網消息控制協議(Internet Control Message Protocol) | ICMP 負責網絡中的錯誤處理。 |
ARP | 地址解析協議(Address Resolution Protocol) | ARP - 用於通過 IP 來查找基於 IP 地址的計算機網卡的硬件地址。(IP-MAC) |
RARP | 反向地址轉換協議(Reverse Address Resolution Protocol) | RARP 用於通過 IP 查找基於硬件地址的計算機網卡的 IP 地址。(MAC-IP) |
BOOTP | 自舉協議(Boot Protocol) | BOOTP 用於從網絡啓動計算機。 |
PPTP | 點對點隧道協議(Point to Point Tunneling Protocol) | PPTP 用於私人網絡之間的連接(隧道)。 |
2、TCP/IP的分層管理
TCP/IP協議裏最重要的一點就是分層。TCP/IP協議族按層次分別爲 ,物理層、數據鏈路層、網絡層、傳輸層、應用層(從下到上)。當然也有按不同的模型分爲4層或者7層的。採用分層結構,有利於對應用程序的設計和修改。
1. 物理層
電腦要組網,就必須通過光纜、電纜、雙絞線、無線電波等方式將電腦連起來。這一操作就是物理層的主要任務。它主要規定了網絡的一些電氣特性,作用是負責傳送0和1的電信號。
2. 數據鏈路層
物理層是負責傳送0和1的電信號,那電信號要怎麼傳呢?總不能一個一個傳吧,各個廠家都有自己的一套方法,而其中佔據主導的是以太網電信號分組方式。
以太網規定,一組電信號構成一個數據包,叫做"幀"(Frame)。每一幀分成兩個部分:標頭(Head)和數據(Data)。
①"標頭"包含數據包的一些說明項,比如發送者、接收者、數據類型等等;"標頭"的長度,固定爲18字節。
②"數據"則是數據包的具體內容。"數據"的長度,最短爲46字節,最長爲1500字節。
因此,整個"幀"最短爲64字節,最長爲1518字節。如果數據很長,就必須分割成多個幀進行發送。
MAC地址
發送者和接收者是如何知道對方就是對的人?難道也確認過眼神?
以太網規定,連入網絡的所有設備,都必須具有"網卡"接口。數據包必須是從一塊網卡,傳送到另一塊網卡。網卡的地址,就是數據包的發送地址和接收地址,這叫做MAC地址。
每塊網卡出廠的時候,都有一個全世界獨一無二的MAC地址,長度是48個二進制位,通常用12個十六進制數表示。
前6個十六進制數是廠商編號,後6個是該廠商的網卡流水號。有了MAC地址,就可以定位網卡和數據包的路徑了。
有了網卡地址,那發送者也不知道接收者的網卡地址是多少,那要怎麼發送呢?這就要用到廣播的方式了。
廣播
一塊網卡是不知道另一塊網卡的MAC地址的,但是以太網數據包必須知道接收方的MAC地址,然後才能發送。
有了MAC地址,系統怎樣才能把數據包準確送到接收方?
以太網採用了一種很"原始"的方式,它不是把數據包準確送到接收方,而是向本網絡內(子網內)所有計算機發送,讓每臺計算機自己判斷,是否爲接收方。
1號計算機向2號計算機發送一個數據包,同一個子網絡的3號、4號、5號計算機都會收到這個包。它們讀取這個包的"標頭",找到接收方的MAC地址,然後與自身的MAC地址相比較,如果兩者相同,就接受這個包,做進一步處理,否則就丟棄這個包。這種發送方式就叫做"廣播"(broadcasting)。
有了數據包的定義、網卡的MAC地址、廣播的發送方式,數據包就可以準確的在鏈路層上進行多臺計算機之間的傳輸了。
3. 網絡層
廣播的對象是同一個子網內的所有主機。如果兩臺計算機不在同一個子網絡,廣播是傳不過去的。但是互聯網是無數子網絡共同組成的一個巨型網絡,必須找到一種方法,能夠區分哪些MAC地址屬於同一個子網絡,哪些不是。如果是同一個子網絡,就採用廣播方式發送,否則就採用"路由"方式發送。
網絡層的作用是引進一套新的地址,使得我們能夠區分不同的計算機是否屬於同一個子網絡。這套地址就叫做"網絡地址",簡稱"網址"。
"網絡層"出現以後,每臺計算機有了兩種地址,一種是MAC地址,另一種是網絡地址(IP地址)。
網絡地址幫助我們確定計算機所在的子網絡,MAC地址則將數據包送到該子網絡中的目標網卡。
必定是先處理網絡地址,然後再處理MAC地址。【先判斷是不是同一個子網絡,是的話再發送廣播數據包】
IP協議
規定網絡地址的協議,叫做IP協議
。它所定義的地址,就被稱爲IP地址
。
目前,廣泛採用的是IP協議第四版,簡稱IPv4
。這個版本規定,網絡地址由32個二進制位(8個二進制轉成一個十進制(0~255),即4個十進制數)組成。
4. 傳輸層
IP地址能判斷兩臺主機是不是處於同一個子網,MAC地址能保證處於同一子網的不同主機進行數據傳輸。也就是有了MAC地址和IP地址,我們就可以在互聯網上任意兩臺主機上建立通信。
同一臺主機上有許多程序都需要用到網絡,比如,你一邊瀏覽網頁,一邊與朋友在線聊天。當一個數據包從互聯網上發來的時候,你怎麼知道,它是表示網頁的內容,還是表示在線聊天的內容?
這時,就需要加入一位小夥伴,即端口(port),表示這個數據包到底供哪個程序(進程)使用
每個數據包都發到主機的特定端口,所以不同的程序就能取到自己所需要的數據。
端口是0
到65535
之間的一個整數,正好16個二進制位。**0到1023的端口被系統佔用,用戶只能選用大於1023的端口。**不管是瀏覽網頁還是在線聊天,應用程序會隨機選用一個端口,用來接收從互聯網上發來的包。
傳輸層的功能,就是建立"端口到端口"的通信。網絡層的功能是建立"主機到主機"的通信。只要確定主機和端口,我們就能實現程序之間的交流。
Unix系統把主機+端口,叫做"套接字"(socket)
UDP協議
爲了在數據包中加入端口信息,就需要新的協議,制定關於端口的協議。
UDP協議,它的格式幾乎就是在數據前面,加上端口號。
UDP數據包,也是由"標頭"和"數據"兩部分組成。
"標頭"部分主要定義了發送端口和接收端口,"數據"部分就是具體的內容。
把整個UDP數據包放入IP數據包的"數據"部分,再把IP數據包放在以太網數據包之中的,所以整個以太網數據包現在變成了下面這樣:
UDP數據包非常簡單,"標頭"部分一共只有8個字節,總長度不超過65535字節,正好放進一個IP數據包。
TCP協議
UDP協議的優點是比較簡單,容易實現。缺點是可靠性較差,一旦數據包發出,無法知道對方是否收到。而TCP協議可以看作是有確認機制的UDP協議
每發出一個數據包都要求確認,如果有一個數據包遺失,就收不到確認,發出方就知道有必要重發這個數據包了。(沒說收到就再發一次)
TCP協議能夠確保數據不會遺失。它的缺點是過程複雜、實現困難、消耗較多的資源。
5. 應用層(會話層、表示層、應用層)
在7層模型中,應用層包括會話層、表示層、應用層。
應用程序收到傳輸層的數據,就要對其解讀。應用層的作用,就是規定應用程序的數據格式。
TCP協議可以爲各種各樣的程序傳遞數據,比如Email、WWW、FTP等等。那麼,必須有不同協議規定電子郵件、網頁、FTP數據的格式,這些應用程序協議就構成了應用層。
這是最高的一層,直接面對用戶。它的數據就放在TCP數據包的數據部分。
3、從用戶角度理解TCP/IP的分層管理
**總的來說,網絡通信就是交換數據包。**電腦A向電腦B發送一個數據包,後者收到了,回覆一個數據包,從而實現兩臺電腦之間的通信。
發送一個數據包,必須要對方的MAC地址、 對方的IP地址,有了這兩個地址,數據包才能準確送到接收者手中。
MAC地址有侷限性,如果兩臺電腦不在同一個子網絡,就無法知道對方的MAC地址,必須通過網關(gateway)轉發。
1號電腦要向4號電腦發送一個數據包,它先判斷4號電腦是否在同一個子網絡,結果發現不是,於是就把這個數據包發到網關A。網關A通過路由協議,發現4號電腦位於子網絡B,又把數據包發給網關B,網關B再轉發到4號電腦。而1號電腦把數據包發到網關A,必須知道網關A的MAC地址,由於1號電腦和網關A是屬於同一個子網的,故可以通過廣播的方式將數據包準確發送到網關A。
發送數據包之前,電腦必須根據IP地址判斷對方是否在同一個子網絡,然後選擇相應的MAC地址。
1. 配置靜態IP地址(專業用戶)
配置靜態IP地址必須要知道:本機IP地址、子網掩碼、網關地址的IP地址、DNS的IP地址,缺一不可。
2. 配置動態IP地址(普通用戶)
動態IP地址,指計算機開機後,會自動分配到一個IP地址,不用人爲設定。它使用的協議叫做DHCP協議。
這個協議規定,每一個子網絡中,有一臺計算機負責管理本網絡的所有IP地址,它叫做"DHCP服務器"。新的計算機加入網絡,必須向"DHCP服務器"發送一個"DHCP請求"數據包,申請IP地址和相關的網絡參數。
如果兩臺計算機在同一個子網絡,必須知道對方的MAC地址和IP地址,才能發送數據包。但是,新加入的計算機不知道這兩個地址,怎麼發送數據包呢?
DHCP協議
DHCP協議是一種應用層協議,建立在UDP協議之上。
請求:新加入子網的計算機向"DHCP服務器"發送一個"DHCP請求"數據包
1、最前面的"以太網標頭",設置發送方(本機)的MAC地址和接收方(DHCP服務器)的MAC地址。本機的MAC地址是已知的,DHCP服務器的MAC地址不知道,先用廣播地址:FF-FF-FF-FF-FF-FF代替。
2、後面的"IP標頭",設置發送方的IP地址和接收方的IP地址。對於本機而言,兩個都不知道,故先設置發送方的IP地址就爲0.0.0.0,接收方的IP地址爲255.255.255.255。
3、最後的"UDP標頭",設置本機的的端口和DHCP服務器的端口。這一部分是DHCP協議規定好的,本機是68端口,DHCP服務器是67端口。
由上述規則可以看出,數據包是由本機MAC地址+0.0.0.0+68發送到FF-FF-FF-FF-FF-FF+255.255.255.255+67。
由於以太網是廣播發送,同一個子網絡的每臺計算機都收到了這個包。因爲接收方的MAC地址是FF-FF-FF-FF-FF-FF`,看不出是發給誰的,所以每臺收到這個包的計算機,還必須分析這個包的IP地址,才能確定是不是發給自己的。當看到發出方IP地址是0.0.0.0,接收方是255.255.255.255,於是DHCP服務器知道"這個包是發給我的",而其他計算機就可以丟棄這個包。
應答:DHCP服務器在收到"DHCP請求"後,發送一個"DHCP響應"給新入網的計算機。
DHCP服務器讀出這個包的數據內容,分配好IP地址,發送回去一個"DHCP響應"數據包。這個響應包的結構也是類似的,以太網標頭的MAC地址是雙方的網卡地址,IP標頭的IP地址是DHCP服務器的IP地址(發送方)和255.255.255.255(接收方),UDP標頭的端口是67(發送方)和68(接收方),分配給請求端的IP地址和本網絡的具體參數則包含在Data部分。
新加入的計算機收到這個響應包,於是就知道了自己的IP地址、子網掩碼、網關地址、DNS服務器等等參數。
DNS協議
發送數據包,必須要知道對方的IP地址。若只知道網址www.baidu.com
,不知道它的IP地址,DNS協議可以幫助我們,將這個網址轉換成IP地址。【域名轉換爲IP地址,也叫正向解析】
4、TCP與UDP的區別
TCP和UDP 都是傳輸層協議
面向報文:應用層交給UDP多長的報文,UDP就發送多長的報文,即一次發送一個報文。因此,應用程序必須選擇合適大小的報文。【來多少發多少】
面向字節流:雖然應用程序和TCP的交互是一次一個數據塊(大小不等),但TCP把應用程序看成是一連串的無結構的字節流。TCP有一個緩衝,當應用程序傳送的數據塊太長,TCP就可以把它劃分短一些再傳送。【來太多,分開發】
5、TCP的三次握手與四次揮手
客戶端和服務端之間的通信
如果有大量的連接,每次在連接,關閉都要經歷三次握手、四次揮手,這顯然會造成性能低下。因此。http 有一種叫做長連接(keepalive connections)
的機制。它可以在傳輸數據後仍保持連接,當客戶端需要再次獲取數據時,直接使用剛剛空閒下來的連接而無需再次握手。
6、常見問題解答:
在理解以下問答時,可結合三次握手和四次揮手的表格理解。
6.1爲什麼要三次握手,而不是兩次握手?
答:爲了防止失效的連接請求被服務端接收到,導致服務端回覆一個ack確認報文段,由於是兩次握手,客戶端和服務端此時已經建立連接,且客戶端確認了服務端能收到數據包,就一直髮送數據包給服務端。但是服務端未收到來自客戶端的ack確認報文段,就會忽略客戶端發送的數據包,一直等待客戶端發送ack報文段。這就浪費了服務端的連接。
通俗一點理解三次握手和兩次握手: 場景:A和B微信聊天
三次握手:
①A:你好,有空嗎?
②B:有空,你有空嘛?
③A:我也有空。
到目前爲止兩個人都確認了對方現在有空,所以就巴拉巴拉的講事情(通信)。
兩次握手:
①A:你好,有空嗎?
②B:有空。
這時,只能確定B有空,而A不一定有空。此時A和B也巴拉巴拉的講事情。
這就會存在一個問題,如果A發第一條信息,信號不好,B沒收到,然後A發第二條信息,這時B回覆收到了。由於是兩次握手,這時就已經建立了連接,然後A和B講完事情就沒聯繫了。這時,之前延遲的A的信息,終於發到B的微信上了,這時B回覆收到,那麼就會再次建立連接,但是問題來了,此時A不在線,那麼B就一直等,B的連接資源就浪費了。
6.2 爲什麼要四次揮手?三次揮手行不行?
答:在關閉連接時,若只有三次揮手,即當服務器發送fin報文段給客戶端時,服務端就關閉了連接。若該fin報文段在網絡中丟失,服務端不能重發fin報文段,而此時客戶端又處於FIN_WAIT_1狀態,客戶端沒收到服務端的關閉請求,就一直等,導致客戶端無法關閉連接。故需要四次握手,讓客戶端能確認服務端也沒數據包要發送了,確認服務端發送了關閉請求過來,這時服務端關閉後,客戶端才關閉。
6.3 爲什麼要處於TIME-WAIT狀態,等待 2MSL?
答:因爲當客戶端收到服務端發來的fin報文段,客戶端回覆了服務端後就直接進入CLOSED狀態,而不是TIME-WAIT狀態。此時若該回復丟失,那麼服務端就會再次發來fin報文段,但是由於客戶端已經關閉,那服務端就永遠都關閉不了了。