重學 TCP/IP 協議

2021-02-15 奇舞精選

前言

最近剛看完電影 「無敵破壞王2:大鬧網際網路」,覺得裡面有些動畫蠻有意思的,於是想起前不久看的《圖解HTTP》和 TCP/IP相關的文章。嗯,是時候展示真正的技術了。

如果你還對各類協議歸屬、作用也都傻傻分不清,那麼你有必要詳盡了解下 TCP/IP。

1. TCP/IP協議族

網際網路協議套件(英語:Internet Protocol Suite,縮寫 IPS)是一個網絡通訊模型,以及一整個網絡傳輸協議家族,為網際網絡的基礎通訊架構。它常被通稱為TCP/IP協議族(英語:TCP/IPProtocolSuite,或 TCP/IPProtocols),簡稱 TCP/IP。因為該協定家族的兩個核心協定:TCP(傳輸控制協議)和IP(網際協議),為該家族中最早通過的標準。

敲重點:

1.1 TCP/IP拆家分層

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

 TCP/IP分層管理是有好處的,假如網際網路只有一個協議統籌,某一個地方改變設計時,就需要把所有部分都替換掉,而分層只需要把變動的層替換掉即可。

而且分層管理,設計也相對簡單,處於應用層的應用只需要考慮分派自己的任務而不需要考慮對方的傳輸線路是怎樣的,能否保證傳輸送達。

2. 應用層, ApplicationLayer

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

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

HTTP(全球資訊網服務)

FTP(文件傳輸)

SMTP(電子郵件)

SSH(安全遠程登陸)

DNS(名稱<-> IP位址尋找,域名系統)

以及許多其他協議

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

圖中用到HTTP和DNS3. 傳輸層, TransportLayer

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

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


UDPTCP是否連接無連接面向連接是否可靠不可靠傳輸,不使用流量控制和擁塞控制可靠傳輸,使用流量控制和擁塞控制連接對象個數支持一對一,一對多,多對一和多對多交互通信只能是一對一通信傳輸方式面向報文面向字節流首部開銷首部開銷小,僅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 SEQ和 ACK,序列號與確認號

TCP網絡中,為了保障每個連接提供有保證和有序的字節傳遞,使用了 SequenceNumber (,序列號)和 AcknowledgmentNumber (確認號),即 Seq和 Ack。

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

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

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

舉個例子:

序列號為 #2000且長度為 100的數據包,在此連接上包含第 2000-2099個字節。

當接收器接收到包括第 2099位元組在內的所有字節時,它發送一個確認 #2100。

表示它已在第 2100位元組之前接收到該字節。

3.4 SYN,同步序列號

為了避免與先前連線的數據段混淆,當次連線建立時,序列號 並非從 0 開始。

兩端會使用 ISN產生器,產生各自的 初始序列號 ( InitialSequenceNumber,ISN), 通常兩者並不相等。

連線建立時,透過 控制位元 (Control Bits) 中的 SYN,讓兩端的 TCP 必須進行 ISN的交換 (同步)。

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

這就是 TCP連接的建立方式, 且 2 和 3,可以組合為單一訊息。

於是便有下圖:

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

4. 網絡層, NetworkLayer

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

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

流動中的數據包

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

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

IPv4中規定 IP位址長度為32,即有2^32-1個節點(40億)。

我們網絡中已經有超過40億個節點,鑑於此,促成了IPV6發展。

IPv6中 IP位址的長度為128,即有2^128-1個節點(2125億)

如果 IPV6被廣泛應用以後,全世界的每一粒沙子都會有相對應的一個IP位址。

4.1 地址

今天,大多數機器都有 IPv4和 IPv6地址。如果運行 ifconfig,則可以看到計算機的 IPv4和 IPv6地址。

~ 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,則可以在計算機上看到路由表。

它就像 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.鏈路層, LinkLayer

(又名數據鏈路層,網絡接口層)用來處理連接網絡中的硬體部分,硬體上的範圍均在鏈路層中,包含

主機,線路,路由器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的協議可以找到鄰居的 MAC和 IP位址之間的映射。如果在計算機上運行 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. 擴展:運行在傳輸層中的 TCP 和 UDP的協議

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

運行在 TCP協議上的協議:

HTTP(HypertextTransferProtocol,超文本傳輸協議),主要用於普通瀏覽。

HTTPS(HTTP over SSL,安全超文本傳輸協議), HTTP協議的安全版本。

FTP(FileTransferProtocol,文件傳輸協議),用於文件傳輸。

POP3(PostOfficeProtocol,version3,郵局協議),收郵件用。

SMTP(SimpleMailTransferProtocol,簡單郵件傳輸協議),用來發送電子郵件。

TELNET(Teletypeover theNetwork,網絡電傳),通過一個 終端(terminal)登陸到網絡。

SSH(SecureShell,用於替代安全性差的TELNET),用於加密安全登陸用。

運行在 UDP協議上的協議:

BOOTP(BootProtocol,啟動協議),應用於無盤設備。

NTP(NetworkTimeProtocol,網絡時間協議),用於網絡同步。

DHCP(DynamicHostConfigurationProtocol,動態主機配置協議),動態配置IP位址。

運行在 TCP和 UDP協議上:

求一份深圳的內推

好了,又水完一篇,入正題:

 

目前本人在(又)準備跳槽,希望各位大佬和HR小姐姐可以內推一份靠譜的深圳前端崗位!996.ICU 就算了。

微信:huab119

郵箱:454274033@qq.com

作者掘金文章總集

相關焦點

  • 《圖解TCP/IP(第5版)》
    /ip1.3  協議1.3.1  隨處可見的協議1.3.2  協議的必要性1.3.3  協議如同人與人的對話1.3.4  計算機中的協議1.3.5  分組交換協議1.4  協議由誰規定1.4.1  計算機通信的誕生及其標準化1.4.2  協議的標準化1.5  協議分層與osi參考模型1.5.1  協議的分層
  • Linux TCP/IP協議棧,數據發送接收流程,TCP協議特點
    Linux TCP/IP協議棧,數據發送接收流程,TCP協議特點 可以毫不誇張的說現如今的網際網路是基於TCP/IP構建起來的網絡。弄懂協議棧的原理,無論對調試網絡IO性能還是解決網絡問題都是有很大幫助的。本片文章就帶領大家來看看內核是如何控制網絡數據流的。
  • 從源碼看tcp三次握手(上)
    閱讀本文需要對level-ip的整體架構有所了解,如果讀者尚未接觸過level-ip,請先閱讀下面文章:分享一款Linux平臺下的tcp協議棧!Linux系統中間件的巧妙實現--以用戶空間的tcp協議棧為例請根據上述文章中的指引獲取leve-ip的全部源碼,並且嘗試在任意Linux發行版本上編譯運行。
  • 通俗易懂網絡協議(TCP/IP概述)
    所以我想嘗試一下把TCP/IP講清楚,藉此讓自己學明白,順便幫助一下讀者。雖然《TCP/IP詳解卷1》是一本關於網際網路協議族很嚴謹詳盡的書,但在我看來,它稍微有點晦澀,可能需要讀幾遍,才能心領神會。雖然我沒有能力把這個問題說的更好,但因為我經歷過從稀裡糊塗到稍有所悟的過程,這可能是大師不可比的,我將儘量用通俗易懂的語言把TCP/IP相關的知識講清楚。
  • 解Bug之路-NAT引發的性能瓶頸|埠|tcp|nginx|ip|ack_網易訂閱
    合作方的多臺機器用NAT將多個源ip映射成同一個出口ip 20.1.1.1,而我們內網將多個Nginx映射成同一個目的ip 30.1.1.1。  短連接-HTTP1.0由於對方是採用短連接和Nginx進行交互的,而且採用的協議是HTTP-1.0。
  • Linux 內核 TCP MSS 機制詳細分析
    -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 48# 刪除$ sudo iptables -D OUTPUT -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 48# 查看路由信息$ route -ne$ ip route
  • TCP長連接和心跳那些事
    KeepAlive 並不是 TCP 協議的一部分,但是大多數作業系統都實現了這個機制。KeepAlive 機制開啟後,在一定時間內(一般時間為 7200s,參數 tcp_keepalive_time)在鏈路上沒有數據傳送的情況下,TCP 層將發送相應的KeepAlive探針以確定連接可用性,探測失敗後重試 10(參數 tcp_keepalive_probes)次,每次間隔時間 75s(參數 tcp_keepalive_intvl
  • Ripple 20:Treck TCP/IP協議漏洞技術分析
    Ripple20是一系列影響數億臺設備的0day(19個),是JSOF研究實驗室在Treck TCP/IP協議棧中發現的【1】,該協議棧廣泛應用於嵌入式和物聯網設備。而由於這些漏洞很底層,並且流傳版本很廣(6.0.1.67以下),通過供應鏈的傳播,使得這些漏洞影響十分廣泛和深遠。
  • 深入原理學習之–TCP長連接與心跳保活
    >  }  public class NettyServer extends AbstractServer implements Server {  private Map<String, Channel> channels; // <ip:port, channel>  } 在 Dubbo 中,客戶端和服務端都使用ip:port維護了端對端的長連接,
  • 總結的23 個 TCP高頻面試問題
    起初我在學計算機網絡的時候就有非常非常多的疑問,腦子裡簡直充滿了十萬個為什麼,而網絡又非常的複雜,發展了這麼多年東西真的太多了,今天我就大致的淺顯地說一說我對 TCP 這些要點的理解。 好了,廢話不多說,開始上正菜。 TCP 是用來解決什麼問題?
  • python筆記28(TCP,UDP,socket協議)
    1、TCP協議協議的特點:三次握手,四次揮手;2、UDP協議3、OSI七層模型:每層的物理設備,每一層協議。4、代碼部分:①介紹socket;②使用socket完成tcp協議的web通信;③使用socket完成udp協議的web通信。
  • 重學TCP/IP協議和三次握手四次揮手
    應用層協議定義的是應用進程(進程:主機中正在運行的程序)間的通信和交互的規則。對於不同的網絡應用需要不同的應用層協議。在網際網路中應用層協議很多,如域名系統 DNS,支持全球資訊網應用的 HTTP 協議,支持電子郵件的 SMTP 協議等等。
  • Tcptraceroute:基於TCP數據包的路由跟蹤器
    通過發送TCP SYN數據包來代替UDP或者ICMP應答數據包,tcptraceroute可以穿透大多數防火牆。[root@soft tcptraceroute-1.5beta7]# . /bin/  [root@soft bin]# tcptraceroute --help   tcptraceroute 1.5beta7  Copyright (c) 2001-2006 Michael C.
  • TCP/IP協議知識整理
    例如:網際網路協議(IP)等。傳輸層(Transport Layer)把傳輸表頭(TH)加至數據以形成數據包。傳輸表頭包含了所使用的協議等發送信息。例如:傳輸控制協議(TCP)等。會話層(Session Layer)負責在數據傳輸中設置和維護計算機網絡中兩臺計算機之間的通信連接。
  • TCP和UDP區別
    看一下TCP和UDP 協議頭的源碼文件頭在include/uapi/linux/tcp.h(unsigned short ==__be16 == __u16 == __sum16)(unsigned int == __be32)TCP頭UDP頭字節數差別點__be16 source
  • 25、大話HTTP協議-用Wireshark研究一個完整的TCP連接
    學習了HTTP協議的報文結構,相信看這個請求報文就很明朗了!我可以在篩選條件中輸入:http || dns這是我經常用的一個篩選條件,是為了篩選出HTTP協議和DNS協議的兩種協議類型的報文,因為我比較關注應用層的報文,而我打開這個網站,最基本的步驟應該是先DNS解析域名拿到IP位址,然後跟此IP位址進行後續的TCP三次握手建立連接,連接建立完成後即可進行
  • 如何手動更改IP位址及DNS
    那麼在區域網或者在公司或校園網中如何手動配置ip地址呢?或者說網卡無法自動獲取的時候如何通過手動修改呢?手動更改ip地址有兩個地方,一是右下角的小電腦和網上鄰居右鍵屬性後點擊查看網絡連接;有些朋友可能沒有顯示在狀態欄上,那麼我們還是從網上鄰居來修改吧!
  • 史上最簡單的 Wireshark 和 TCP 入門指南
    記得大學的時候就學習過TCP的三次握手協議,那時候只是知道,雖然在書上看過很多TCP和UDP的資料,但是從來沒有真正見過這些數據包, 老是感覺在雲上飄一樣,學得不踏實。有了wireshark就能截獲這些網絡數據包,可以清晰的看到數據包中的每一個欄位。更能加深我們對網絡協議的理解。對我而言, wireshark 是學習網絡協議最好的工具。
  • 網絡報文分析工具的使用 - 跟小智一起學網絡(4)
    :  ip、tcp、udp、icmp、arp、ipv6;埠過濾:  port、src port(源埠)、dst port(目的埠);邏輯表達式:and(且)、or(或)、not(非);例如 tcpdump -i enss33 host 192.168.1.2 and tcp,表示抓取IP位址為192.168.1.2同時是tcp協議的報文;Wireshark的安裝
  • Wireshark 基本介紹和學習 TCP 三次握手
    記得大學的時候就學習過TCP的三次握手協議,那時候只是知道,雖然在書上看過很多TCP和UDP的資料,但是從來沒有真正見過這些數據包, 老是感覺在雲上飄一樣,學得不踏實。有了wireshark就能截獲這些網絡數據包,可以清晰的看到數據包中的每一個欄位。更能加深我們對網絡協議的理解。對我而言, wireshark 是學習網絡協議最好的工具。