「真香警告」重學 TCP/IP 協議 與三次握手

前言

最近剛看完電影「無敵破壞王2:大鬧互聯網」,以爲裏面有些動畫蠻有意思的,因而想起前不久看的《圖解HTTP》和TCP/IP相關的文章。嗯,是時候展現真正的技術了。前端

若是你還對各種協議歸屬、做用也都傻傻分不清,那麼你有必要詳盡瞭解下TCP/IPvue

本文目錄

1. TCP/IP協議族

互聯網協議套件(英語:Internet Protocol Suite,縮寫IPS)是一個網絡通信模型,以及一整個網絡傳輸協議家族,爲網際網絡的基礎通信架構。它常被通稱爲TCP/IP協議族(英語:TCP/IP Protocol Suite,或TCP/IP Protocols),簡稱TCP/IP。由於該協定家族的兩個核心協定:TCP(傳輸控制協議)和IP(網際協議),爲該家族中最先經過的標準。web

敲重點:面試

  • TCP(傳輸控制協議)和IP(網際協議 是最早定義的兩個核心協議,因此才統稱爲TCP/IP協議族

1.1 TCP/IP拆家分層

TCP/IP協議族中有一個很重要一點就是分層管理,依次爲如下四層,應用層,傳輸層,網絡層,數據鏈路層。vue-cli

TCP/IP分層管理是有好處的,假如互聯網只有一個協議統籌,某一個地方改變設計時,就須要把全部部分都替換掉,而分層只須要把變更的層替換掉便可。

並且分層管理,設計也相對簡單,處於應用層的應用只須要考慮分派本身的任務而不須要考慮對方的傳輸線路是怎樣的,可否保證傳輸送達。後端

2. 應用層, Application Layer

應用層是大多數普通與網絡相關的程序爲了經過網絡與其餘程序通訊所使用的層。這個層的處理過程是應用特有的;數據從網絡相關的程序以這種應用內部使用的格式進行傳送,而後被編碼成標準協議的格式。設計模式

應用層決定了向用戶提供的應用服務時的通訊活動:安全

  • HTTP(萬維網服務)
  • FTP(文件傳輸)
  • SMTP(電子郵件)
  • SSH(安全遠程登錄)
  • DNS(名稱<-> IP地址尋找,域名系統)
  • 以及許多其餘協議

一旦從應用程序來的數據被編碼成一個標準的應用層協議,它將被傳送到IP棧的下一層。 bash

圖中用到HTTP和DNS

3. 傳輸層,Transport Layer

傳輸層位於應用層的下層,提供位於網絡鏈接中的兩臺計算機之間的數據傳輸,傳輸層中有兩種性質不一樣的協議網絡

敲重點:每個應用層協議通常都會使用到兩個傳輸層協議之一

  • TCP:面向鏈接的Transmisson Control Protocol傳輸控制協議
  • UDP : 無鏈接的包傳輸User DataProtocol用戶數據報協議
UDP TCP
是否鏈接 無鏈接 面向鏈接
是否可靠 不可靠傳輸,不使用流量控制和擁塞控制 可靠傳輸,使用流量控制和擁塞控制
鏈接對象個數 支持一對一,一對多,多對一和多對多交互通訊 只能是一對一通訊
傳輸方式 面向報文 面向字節流
首部開銷 首部開銷小,僅8字節 首部最小20字節,最大60字節
場景 適用於實時應用(IP電話、視頻會議、直播等) 適用於要求可靠傳輸的應用,例如文件傳輸

摘自:TCP和UDP比較

3.1 傳輸層的意義

網絡層的功能使咱們可以將數據包從一臺機器傳送到網絡上的另外一臺機器,但這還不足以編寫網絡應用程序,由於:

  • 機器能夠運行多個應用程序,咱們須要知道哪一個應用程序應該接收數據包。
  • 網絡層能夠丟棄或從新排序數據包。另外一方面,應用程序一般須要保證(即,無損耗)和按順序傳輸字節。

3.2 何爲「四元組」?

TCP經過定義端口號解決了第一個問題:

端口號本質上是標識符,有助於TCP區分機器上運行的應用。

換句話說,計算機上的每一個端口號都由該計算機上的應用擁有。

端口號是2字節整數,端口0不可用。所以,咱們能夠在一臺機器上擁有多達65536個端口。

TCP經過端口號來定義「鏈接」。

TCP鏈接由源和目標IP地址(來自網絡層)以及源和目標端口號標識。這也稱爲四元組:

// 源IP地址、目的IP地址、源端口、目的端口
(src ip,dst ip,src port,dst port)
複製代碼

3.3 SEQACK,序列號與確認號

TCP網絡中,爲了保障每一個鏈接提供有保證和有序的字節傳遞,使用了Sequence Number (,序列號)和 Acknowledgment Number (確認號),即SeqAck

TCP 每次發送與接受的單位爲: TCP頭部 + 數據, TCP數據段 (TCP Segment);

每一個數據段的大小不盡相同,有可能數百~數萬。

SEQ,序列號,表示每次傳輸中字節的偏移量 ACK,確認號,指出下一個指望接收的SEQ(接受完畢)

舉個例子:

  1. 序列號爲#2000且長度爲100的數據包,在此鏈接上包含第2000-2099個字節。
  2. 當接收器接收到包括第2099字節在內的全部字節時,它發送一個確認#2100
  3. 表示它已在第2100字節以前接收到該字節。

3.4 SYN,同步序列號

  • 爲了不與先前連線的數據段混淆,當次連線創建時,序列號 並不是從 0 開始。
  • 兩端會使用 ISN產生器,產生各自的 初始序列號 (Initial Sequence Number, ISN), 一般二者並不相等。
  • 連線創建時,透過 控制位元 (Control Bits) 中的 SYN,讓兩端的 TCP 必須進行 ISN的交換 (同步)。

好吧,說人話。就是TCP三次握手

這就是 TCP鏈接的創建方式, 且 23,能夠組合爲單一訊息。

因而便有下圖:

且第三次握手中 (Client — — > Server), 其 SEQ為 第一段的值 + 1 (ISN + 1)。

4. 網絡層, Network Layer

網絡層用來處理在網絡上流動的數據包(數據包:網絡上傳輸的最小數據單位)。

網絡層規定在衆多選項中經過怎樣的路徑(傳輸線路)到達對方的計算機,把數據包傳輸給對方。

流動中的數據包

該層中最突出的協議是Internet協議(IP),所以該層也稱爲IP層。IP的核心是兩個主要功能:地址和路由

IP的原始版本是 IPV4,後來擴展了 IPV6

  • IPv4中規定IP地址長度爲32,即有2^32-1個節點(40億)。
  • 咱們網絡中已經有超過40億個節點,鑑於此,促成了IPV6發展。
  • IPv6IP地址的長度爲128,即有2^128-1個節點(2125億)
  • 若是IPV6被普遍應用之後,全世界的每一粒沙子都會有相對應的一個IP地址。

4.1 地址

今天,大多數機器都有IPv4IPv6地址。若是運行ifconfig,則能夠看到計算機的IPv4IPv6地址。

~ ifconfig
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
	options=1203<RXCSUM,TXCSUM,TXSTATUS,SW_TIMESTAMP>
	inet 127.0.0.1 netmask 0xff000000
	inet6 ::1 prefixlen 128
	inet6 fe80::1809:1%lo0 prefixlen 64 scopeid 0x1
	nd6 options=201<PERFORMNUD,DAD>
	media: autoselect
	status: active
複製代碼

4.2 路由

IP路由基於使用地址前綴的規則構構建。 若是在計算機上運行 netstat -rn,則能夠在計算機上看到路由表。

  • 例如,個人路由表說任何匹配10.31.10/24的IP數據包應該發送到link#8
  • 若是仔細觀察,能夠看到「默認」行。該行是一項特殊規則,表示任何與其餘規則不匹配的數據包都應使用此規則進行路由尋址。

它就像switch / case語句中的default

% netstat -rn
Routing tables
Internet:
Destination        Gateway            Flags        Refs      Use   Netif 
default            10.31.10.222       UGSc           54        0     en0
default            link#17 UCSI 0 0 bridge1 !
10.31.10/24        link#8 UCS 9 0 en8 !
Internet6:
Destination   Gateway       Flags         Netif Expire
fe80::%lo0/64 fe80::1%lo0   UcI           lo0
複製代碼

互聯網上的全部節點都有這些路由表,這就是IP數據包路由到達目的地的方式。

若是您想了解如何在網絡中將數據包路由到掘金juejin.im,請運行如下命令:

traceroute juejin.im
複製代碼

就會獲得下圖:

5.鏈路層,Link Layer

(又名數據鏈路層,網絡接口層)

用來處理鏈接網絡中的硬件部分,硬件上的範圍均在鏈路層中,包含

  • 操做系統
  • 硬件設備驅動
  • NIC(Network interface Card 網絡適配器:網卡 )
  • 光纖等物理可見部分

主機,線路,路由器

5.1 ifconfig: 查看MAC地址

在任何網絡中,每一個節點都具備 「鄰居」。鏈路層協議提供經過鏈路直接鏈接的「鄰居」之間通訊所需的功能(例如,像CAT5電纜的物理鏈路,或WiFi中的無線電鏈路)。

最着名的鏈路層協議是以太網。在以太網中,每一個接口都有一個惟一的48位(6字節)地址,稱爲媒體訪問控制(MAC)地址。

若是在計算機上運行ifconfig,您將看到網絡接口的名稱及其MAC地址。

~  ifconfig
...
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
 ether 88:e9:fe:4c:83:5b
 inet6 fe80::1809:d41a:a9a:d664%en0 prefixlen 64 secured scopeid 0x8
 inet 192.168.1.8 netmask 0xffffff00 broadcast 192.168.1.255
 nd6 options=201<PERFORMNUD,DAD>
 media: autoselect
 status: active
複製代碼

如你所見,MAC地址中的每一個字節都由十六進制值表示,並以冒號分隔。

經過以太網鏈路發送的網絡數據包具備源和目標MAC地址。爲了發現它的鄰居,以太網使用廣播查詢和通知。使用這些廣播機制,另外一種稱爲ARP的協議能夠找到鄰居的MACIP地址之間的映射。若是在計算機上運行arp,則能夠看到此映射。

~ arp -a -n 
? (10.31.xx.xx) at 98:28:xx:2a:cc:xx on en8 ifscope [ethernet]
? (10.31.xx.xx) at f4:8e:xx38:f5:b5:xx on en8 ifscope [ethernet]
? (10.31.xx.xx) at 54:ee:xx:e1:33:xx on en8 ifscope [ethernet]
....
複製代碼

如今咱們已經知道MAC和IP地址之間的映射關係。

6. TCP/IP 通訊傳輸流

TCP/IP 經過分層管理進行網絡通訊,發送端從應用層往下走,接收端則往應用層上層走。

而後便一層層包裹,解析。

  • 發送端,每通過一層會打上該層所屬的首部信息。
  • 接收端,每通過一層會把對應的首部信息解析。

7. 擴展:運行在傳輸層中的 TCPUDP的協議

每個應用層(TCP/IP參考模型的最高層)協議通常都會使用到兩個傳輸層協議之一:

運行在TCP協議上的協議:

  • HTTP(Hypertext Transfer Protocol,超文本傳輸協議),主要用於普通瀏覽。
  • HTTPS(HTTP over SSL,安全超文本傳輸協議),HTTP協議的安全版本。
  • FTP(File Transfer Protocol,文件傳輸協議),用於文件傳輸。
  • POP3(Post Office Protocol, version 3,郵局協議),收郵件用。
  • SMTP(Simple Mail Transfer Protocol,簡單郵件傳輸協議),用來發送電子郵件。
  • TELNET(Teletype over the Network,網絡電傳),經過一個終端(terminal)登錄到網絡。
  • SSH(Secure Shell,用於替代安全性差的TELNET),用於加密安全登錄用。

運行在UDP協議上的協議:

  • BOOTP(Boot Protocol,啓動協議),應用於無盤設備。
  • NTP(Network Time Protocol,網絡時間協議),用於網絡同步。
  • DHCP(Dynamic Host Configuration Protocol,動態主機配置協議),動態配置IP地址。

運行在TCPUDP協議上:

  • DNS(Domain Name Service,域名服務),用於完成地址查找,郵件轉發等工做。

免責聲明

逛國外社區看到這篇,以爲挺簡潔明瞭的。

只是以爲好玩就簡單總結一下,有說錯的地方多擔待。

意思就是寫得略粗糙,別噴我。。。

❤️ 看完三件事

若是你以爲這篇內容對你挺有啓發,我想邀請你幫我三個小忙:

  1. 點贊,讓更多的人也能看到這篇內容(收藏不點贊,都是耍流氓 -_-)
  2. 關注公衆號「前端勸退師」,不按期分享原創知識。
  3. 也看看其它文章

相關文章
相關標籤/搜索