天天看點

TCP/IP協定簡介産生與發展分層模型TCP/IP與OSI封包格式三次握手與四次揮手

簡介

含義

Transmission Control Protocol/Internet Protocol,中譯名為傳輸控制協定/網際網路互聯協定,又名網絡通訊協定。它是一個協定族。

作用

TCP/IP 定義了電子裝置如何連入網際網路,以及資料如何在它們之間傳輸的标準。通俗地說,IP是給網際網路的每一台聯網裝置規定一個位址。TCP負責發現傳輸的問題,一有問題就發出信号,要求重新傳輸,直到所有資料安全正确地傳輸到目的地。

工作流程

  • 在源主機上,應用層将應用資料流傳送給傳輸層。
  • 傳輸層将應用層的資料流截成分組,并加上TCP報頭形成TCP段,送交網絡層。
  • 在網絡層給TCP段加上包括源、目的主機IP位址的IP報頭,生成一個IP資料包,并将IP資料包送交鍊路層。
  • 鍊路層在其MAC幀的資料部分裝上IP資料包,再加上源、目的主機的MAC位址和幀頭,并根據其目的MAC位址,将MAC幀發往目的主機或IP路由器。
  • 在目的主機,鍊路層将MAC幀的幀頭去掉,并将IP資料包送交網絡層。
  • 網絡層檢查IP報頭,如果報頭中校驗和與計算結果不一緻,則丢棄該IP資料包;若校驗和與計算結果一緻,則去掉IP報頭,将TCP段送交傳輸層。
  • 傳輸層檢查順序号,判斷是否是正确的TCP分組,然後檢查TCP報頭資料。若正确,則向源主機發确認資訊;若不正确或丢包,則向源主機要求重發資訊。
  • 在目的主機,傳輸層去掉TCP報頭,将排好順序的分組組成應用資料流送給應用程式。這樣目的主機接收到的來自源主機的位元組流,就像是直接接收來自源主機的位元組流一樣。

産生與發展

背景

在阿帕網(ARPA)産生運作之初,大部分電腦互相有一個大弊病:不能共享資源。

為了讓這些電腦能夠實作資源共享,就得在這些系統的标準之上,建立一種大家共同都必須遵守的标準,這樣才能讓不同的電腦按照一定的規則進行“談判”,并且在談判之後能“握手”。

重要人物

瑟夫(Vinton G.Cerf)和卡恩

産生

待補充

發展

待補充

分層模型

TCP/IP由四個層次組成:網絡接口層、網絡層、傳輸層、應用層。在TCP/IP參考模型中,去掉了OSI參考模型中的會話層和表示層(這兩層的功能被合并到應用層實作)。同時将OSI參考模型中的資料鍊路層和實體層合并為主機到網絡層。

網絡接口層(Network Access Layer)

網絡通路層在TCP/IP參考模型中并沒有較長的描述,隻是指出主機必須使用某種協定與網絡相連。

作用

實體層作用

實體層定義實體媒體的各種特性

機械特性

電子特性

功能特性

規程特性

資料鍊路層作用

資料鍊路層是負責接收IP資料包并通過網絡發送,或者從網絡上接收實體幀,抽出IP資料包,交給IP層。

常見的接口層協定

Ethernet 802.3、Token Ring 802.5、X.25、Frame relay、HDLC、PPP ATM等。

網絡層(Internet Layer)

網際網路層是整個體系結構的關鍵部分,其功能是使主機可以把分組發往任何網絡,并使分組獨立地傳向目标。同時,為了盡快地發送分組,可能需要沿不同的路徑同時進行分組傳遞。是以,分組到達的順序和發送的順序可能不同,這就需要上層必須對分組進行排序。網際網路層使用網際網路協定(IP,Internet Protocol)。TCP/IP參考模型的網際網路層和OSI參考模型的網絡層在功能上非常相似。

作用

負責相鄰計算機之間的通信。其功能包括三方面。

- 處理來自傳輸層的分組發送請求,收到請求後,将分組裝入IP資料報,填充報頭,選擇去往信宿機的路徑,然後将資料報發往适當的網絡接口。

- 處理輸入資料報:首先檢查其合法性,然後進行尋徑–假如該資料報已到達信宿機,則去掉報頭,将剩下部分交給适當的傳輸協定;假如該資料報尚未到達信宿,則轉發該資料報。

- 處理路徑、流控、擁塞等問題。

常見的網絡層協定

網絡層包括:IP(Internet Protocol)協定、ICMP(Internet Control Message Protocol)網際控制封包協定、ARP(Address Resolution Protocol)位址轉換協定、RARP(Reverse ARP)反向位址轉換協定。

IP(Internet Protocol)

IP是網絡層的核心,通過路由選擇将下一條IP封裝後交給接口層。IP資料報是無連接配接服務。

ICMP(Internet Control Message Protocol)

網際控制封包協定。ICMP是網絡層的補充,可以回送封包。用來檢測網絡是否通暢。

Ping指令就是發送ICMP的echo包,通過回送的echo relay進行網絡測試。

作用

為了提高 IP 資料報傳遞成功的機會

ARP(Address Resolution Protocol)

位址轉換協定。ARP 每一個主機都設有一個ARP高速緩存(ARP cache),裡面有所在的區域網路上的各主機和路由器的IP位址到硬體位址的映射表。

作用

通過IP位址得知其實體位址

工作原理

1. 首先,每台主機都會在自己的ARP緩沖區 (ARP Cache)中建立一個 ARP清單,以表示IP位址和MAC位址的對應關系。

2. 當源主機需要将一個資料包要發送到目的主機時,會首先檢查自己 ARP清單中是否存在該 IP位址對應的MAC位址,

如果有,就直接将資料包發送到這個MAC位址;

如果沒有,就向本地網段發起一個ARP請求的廣播包,查詢此目的主機對應的MAC位址。此ARP請求資料包裡包括源主機的IP位址、硬體位址、以及目的主機的IP位址。

3. 網絡中所有的主機收到這個ARP請求後,會檢查資料包中的目的IP是否和自己的IP位址一緻。

如果不相同就忽略此資料包;

如果相同,該主機首先将發送端的MAC位址和IP位址添加到自己的ARP清單中,如果ARP表中已經存在該IP的資訊,則将其覆寫,然後給源主機發送一個 ARP響應資料包,告訴對方自己是它需要查找的MAC位址;

4.源主機收到這個ARP響應資料包後,将得到的目的主機的IP位址和MAC位址添加到自己的ARP清單中,并利用此資訊開始資料的傳輸。如果源主機一直沒有收到ARP響應資料包,表示ARP查詢失敗。

RARP(Reverse ARP)

反向位址轉換協定。

作用

使隻知道自己硬體位址的主機能夠知道其IP位址

傳輸層(Tramsport Layer)

作用

傳輸層使源端和目的端機器上的對等實體可以進行會話。

常見的傳輸層協定

傳輸層協定主要是:傳輸控制協定TCP(Transmission Control Protocol)和使用者資料報協定UDP(User Datagram protocol)。

TCP

TCP是面向連接配接的協定,它提供可靠的封包傳輸和對上層應用的連接配接服務。為此,除了基本的資料傳輸外,它還有可靠性保證、流量控制、多路複用、優先權和安全性控制等功能。

UDP

UDP是面向無連接配接的不可靠傳輸的協定,主要用于不需要TCP的排序和流量控制等功能的應用程式。

應用層

作用

向使用者提供一組常用的應用程式,比如虛拟終端協定(TELNET,TELecommunications NETwork)、檔案傳輸協定(FTP,File Transfer Protocol)、電子郵件傳輸協定(SMTP,Simple Mail Transfer Protocol)、域名服務(DNS,Domain Name Service)、網上新聞傳輸協定(NNTP,Net News Transfer Protocol)和超文本傳送協定(HTTP,HyperText Transfer Protocol)等。

常見的應用層協定

應用層協定主要包括如下幾個:FTP、TELNET、DNS、SMTP、NFS、HTTP。

- FTP(File Transfer Protocol)是檔案傳輸協定,一般上傳下載下傳用FTP服務,資料端口是20H,控制端口是21H。

- Telnet服務是使用者遠端登入服務,使用23H端口,使用明碼傳送,保密性差、簡單友善。

- DNS(Domain Name Service)是域名解析服務,提供域名到IP位址之間的轉換,使用端口53。

- SMTP(Simple Mail Transfer Protocol)是簡單郵件傳輸協定,用來控制信件的發送、中轉,使用端口25。

- NFS(Network File System)是網絡檔案系統,用于網絡中不同主機間的檔案共享。

- HTTP(Hypertext Transfer Protocol)是超文本傳輸協定,用于實作網際網路中的WWW服務,使用端口80。

DNS

DNS(Domain Name Service)是域名解析服務,提供域名到IP位址之間的轉換,使用端口53。

工作原理

當 DNS 客戶機需要查詢程式中使用的名稱時,它會查詢 DNS 伺服器來解析該名稱。

客戶機發送的每條查詢消息都包括3條資訊,以指定伺服器應回答的問題。

  • 指定的 DNS 域名,表示為完全合格的域名 (FQDN) 。
  • 指定的查詢類型,它可根據類型指定資源記錄,或作為查詢操作的專門類型。
  • DNS域名的指定類别。

TCP/IP與OSI

TCP/IP中的層對應OSI中的層

TCP/IP OSI
應用層 應用層、表示層、會話層
傳輸層 傳輸層
網絡層 網絡層
網絡接口層 資料鍊路層、實體層

OSI中的層對應TCP/IP協定族

OSI中的層 功能 TCP/IP協定族
應用層 檔案傳輸,電子郵件,檔案服務,虛拟終端 TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等
表示層 資料格式化,代碼轉換,資料加密 沒有協定
會話層 解除或建立與别的接點的聯系 沒有協定
傳輸層 提供端對端的接口 TCP,UDP
網絡層 為資料包選擇路由 IP,ICMP,OSPF,EIGRP,IGMP
資料鍊路層 傳輸有位址的幀以及錯誤檢測功能 SLIP,CSLIP,PPP,MTU
實體層 以二進制資料形式在實體媒體上傳輸資料 ISO2110,IEEE802,IEEE802.2

封包格式

IP封包格式

所有的TCP、UDP、ICMP、IGMP資料都被封裝在IP資料報中傳送。

待補充

TCP封包格式

待補充

UDP封包格式

待補充

三次握手與四次揮手

三次握手

TCP是面向連接配接的,無論哪一方向另一方發送資料之前,都必須先在雙方之間建立一條連接配接。連接配接是通過三次握手進行初始化的。

要想了解三次握手,需要對TCP協定封包格式有一定的了解。(圖檔非原創)

TCP/IP協定簡介産生與發展分層模型TCP/IP與OSI封包格式三次握手與四次揮手

需要了解的三個字段:

ACK (Acknowledgement) : ACK為1表示确認号有效,為0表示封包中不包含确認資訊,忽略确認号字段。連接配接建立後所有發送的封包的ACK必須為1

* SYN(SYNchronization) * : 在連接配接建立時用來同步序号。當SYN=1而ACK=0時,表明這是一個連接配接請求封包。對方若同意建立連接配接,則應在響應封包中使SYN=1和ACK=1. 是以, SYN置1就表示這是一個連接配接請求或連接配接接受封包。

* FIN (finis)* :終結的意思, 用來釋放一個連接配接。當 FIN = 1 時,表明此封包段的發送方的資料已經發送完畢,并要求釋放連接配接。

序号:在TCP連接配接中傳送的位元組流中的每一個位元組都按順序編号。首部中的序号值指的是本封包段發送的資料的第一個位元組的序号。比如,一段封包的序号值是100,攜帶的資料一共200個位元組。那就代表着:本段封包的資料的第一個位元組的序号是100,最後一個位元組的序号是300.

三次握手的過程

(圖檔非原創)

TCP/IP協定簡介産生與發展分層模型TCP/IP與OSI封包格式三次握手與四次揮手

第一次握手:建立連接配接。用戶端發送連接配接請求封包段,即 SYN=1,ACK=0 , TCP規定SYN=1時不能攜帶資料,但要消耗一個序号,是以聲明自己的序号是 seq=x;然後,用戶端進入SYN_SEND狀态,等待伺服器的确認;

第二次握手:伺服器收到SYN封包段。伺服器收到用戶端的SYN封包段,需要對這個SYN封包段進行确認,設定ack為x+1(seq+1);同時,自己還要發送SYN請求資訊,将SYN位置為1,seq為y;伺服器端将上述所有資訊放到一個封包段(即SYN+ACK封包段)中,一并發送給用戶端,此時伺服器進入SYN_RECV狀态;

第三次握手:用戶端收到伺服器的SYN+ACK封包段。然後将ACK設定為y+1,向伺服器發送ACK封包段,這個封包段發送完畢以後,用戶端和伺服器端都進入ESTABLISHED狀态,完成TCP三向交握。

完成了三次握手,用戶端和伺服器端就可以開始傳送資料了。

為什麼需要第三次握手

為了防止已經失效的連接配接請求封包段突然傳到了伺服器端,而造成伺服器端的一直等待而浪費資源。

什麼時候會出現“失效的連接配接請求封包段”?

當A發送連接配接請求封包,但是請求封包短時間内沒有到B。于是A又發送了一次連接配接請求,後來B收到了請求,建立了連接配接,傳送完資料後,釋放了連接配接。但是A第一次發送的請求封包并沒有丢失,而是在某個網絡節點長時間滞留了。這本來是已經實效的封包,但B不知道,以為是A又一次發送的連接配接請求,于是向A發送确認封包段,同意建立連接配接。假如,沒有第三次握手,隻要B發出确認,連接配接就建立成功了。但是A這時資料已經發送了,并不需要發送資料,是以不會理睬B的确認。但是B認為新的連接配接已經建立了,并一直等待A發送資料。這樣,很多資源就浪費了。

采用三次握手可以避免上述情況的發生。

四次揮手

當資料傳送完畢,肯定是要斷開TCP連接配接的啊。TCP的連接配接的拆除需要發送四個包,是以稱為四次揮手(four-way handshake)。

四次揮手的過程

(圖檔非原創)

TCP/IP協定簡介産生與發展分層模型TCP/IP與OSI封包格式三次握手與四次揮手

第一次揮手:A設定seq=u,向B發送一個FIN封包段;此時,A進入FIN_WAIT_1狀态;這表示主機1沒有資料要發送給主機2了;

第二次揮手:主機2收到了主機1發送的FIN封包段,向主機1回一個ACK封包段,ACK為seq+1;A進入FIN_WAIT_2狀态;B告訴主機A,我“同意”你的關閉請求;

第三次揮手:B向A發送FIN封包段,請求關閉連接配接,同時B進入LAST_ACK狀态;

第四次揮手:A收到B發送的FIN封包段,向B發送ACK封包段,然後A進入TIME_WAIT狀态;B收到A的ACK封包段以後,就關閉連接配接;此時,A等待2MSL後依然沒有收到回複,則證明Server端已正常關閉,那好,A也可以關閉連接配接了。

為什麼建立連接配接協定是三次握手,而關閉連接配接卻是四次握手呢?

在tcp連接配接握手時為何ACK是和SYN一起發送,這裡ACK卻沒有和FIN一起發送呢?原因是因為tcp是全雙工模式,接收到FIN時意味将沒有資料再發來,但是未必你所有的資料都全部發送給對方了,是以你可以未必會馬上會關閉SOCKET,也即你可能還需要發送一些資料給對方之後,再發送FIN封包給對方來表示你同意現在可以關閉連接配接了,是以它這裡的ACK封包和FIN封包多數情況下都是分開發送的。

為什麼TIME_WAIT狀态還需要等2MSL後才能傳回到CLOSED狀态?

  • 可靠地實作TCP全雙工連接配接的終止

    TCP協定在關閉連接配接的四次握手過程中,最終的ACK是由主動關閉連接配接的一端(後面統稱A端)發出的,如果這個ACK丢失,對方(後面統稱B端)将重發出最終的FIN,是以A端必須維護狀态資訊(TIME_WAIT)允許它重發最終的ACK。如果A端不維持TIME_WAIT狀态,而是處于CLOSED 狀态,那麼A端将響應RST分節,B端收到後将此分節解釋成一個錯誤(在java中會抛出connection reset的SocketException)。

    因而,要實作TCP全雙工連接配接的正常終止,必須處理終止過程中四個分節任何一個分節的丢失情況,主動關閉連接配接的A端必須維持TIME_WAIT狀态

  • 允許老的重複分節在網絡中消逝

    TCP分節可能由于路由器異常而“迷途“,在迷途期間,TCP發送端可能因确認逾時而重發這個分節,迷途的分節在路由器修複後也會被送到最終目的地,這個遲到的迷途分節到達時可能會引起問題。在關閉“前一個連接配接”之後,馬上又重建立立起一個相同的IP和端口之間的“新連接配接”,“前一個連接配接”的迷途重複分組在“前一個連接配接”終止後到達,而被“新連接配接”收到了。為了避免這個情況,TCP協定不允許處于TIME_WAIT狀态的連接配接啟動一個新的可用連接配接,因為TIME_WAIT狀态持續2MSL,就可以保證當成功建立一個新TCP連接配接的時候,來自舊連接配接重複分組已經在網絡中消逝。

大量 TIME_WAIT 産生的原因及解決辦法

原因:對于基于TCP的HTTP協定,關閉TCP連接配接的是Server端,這樣,Server端會進入TIME_WAIT狀态,可想而知,對于通路量大的Web Server,會存在大量的TIME_WAIT狀态。

解決辦法:

開啟socket重用,允許将TIME_WAIT的socket重新用于TCP連接配接

開啟快速回收。

大量CLOSE_WAIT産生的原因及解決辦法

原因:對方關閉連接配接之後伺服器程式自己沒有進一步發出ack信号。換句話說,就是在對方連接配接 關閉之後,程式裡 沒有檢測到,或者程式壓根就忘記了這個時候需要關閉連接配接,于是這個資源就一直被程式占着。

解決辦法:

具體問題具體解決,總結一句話就是在處理資源時一定要記住自己申請的資源要記得主動釋放。

繼續閱讀