Networking Programming (1) 網絡基礎 上


故事的小黃花,
從我進化成智障那年就飄着~

Additional: 有些IDE可以直接與代碼存儲庫如Git,sourceForge等直接進行通信

TCP/IP存在的意義

不同的操作系統,不同的底層物理結構,計算機通過使用共同的一組協議來實現通信(協議:一組明確的規則,比如數據的格式,數據怎麼分包等)

分層

網絡中的每臺機器都稱爲node,擁有全部功能的計算機稱爲host。每個網絡節點都有來唯一標識節點的一組字節序列(地址)。Internet是最大的基於IP網絡,沒連入Internet的IP網絡稱爲internet,比如Intranet。

字節序:大於一個字節類型的數據在內存中的存放順序,不同種類的CPU採用不同的字節序
1. big endian
低字節存放在內存的高地址,數據在網絡上的傳輸和JAVA虛擬機中多字節類型數據的存放也採用這種字節序
2. little endian

不同的網絡以不同的方式給節點分配地址,而以太網Ethernet則通過產商來確保計算機的硬件地址,ISP(Internet Service Provider) 從四個區域的Internet註冊機構獲取IP地址並分配

將網絡分層,可以修改實現而不動接口,每一層負責不同的通信功能,便於管理維護,每一層只與其上下層直接通信,實現解耦

d1

d2

  • 物理層(bits)

數據 -》在不同物理介質上傳播的模擬信號(電磁波,光脈衝,無線電波等)

  • 鏈路層(frames)

職責:數據封裝,檢錯,尋址(ARP)

鏈路層有很多協議,如Ethernet,無線,PPP和loopback等,路由器爲不同的物理網絡提供連接。OS中設備驅動器+network interface card處理物理接口細節

d5

串行通信:在一條數據線上,將數據一位一位的依次傳送
1. 同步,接收方和發送方必須時間同步
2. 異步,不需要時間同步,接收方根據電壓來判斷是否有數據發送

並行通信:數據在多條數據線上傳送

Ethernet

幀:以太網數據幀的長度必須在46~1500字節之間(不包括CRC,起始符,源MAC,目的MAC等),一個幀往往包括幀起始符和結束符(MAC幀無結束符,因爲兩個幀間隔9.6us,而且只要少於64字節就丟棄,而PPP幀連續發送,需要結束符判斷是否結束一個幀),SOH(start of head),EOT(end of tail)出現在數據中時,則要用轉義字符

Q1:爲什麼幀必須不小於64字節??
保證NIC有足夠的時間精確檢測到衝突,這一最小的時間由可支持的最長電纜長度和電纜傳播速度決定,如果節點收到衝突信號時,數據已經全部發送到目的地,則不重傳,最遠兩臺機器之間的round-trip time要小於512bits時間,512bits/8 = 64bytes,所以如果發送的幀小於64字節,就需要填充,但是不算入數據字段的長度。

CSMA/CD:在發數據前節點需要監聽網線上的載波,如果9.6us之內沒有檢測到載波(使剛剛收到數據幀的節點來得及清理接收緩存,爲下一個接收做準備),節點就可以發送一幀數據。如果兩個節點同時檢測到空閒發送數據,檢測到衝突的節點會發送“衝突增強(32個1)”信號給介質上的每個介質。節點需要等待一段隨機時間再發送數據。幀之前有64bits的前導序列,前7字節是同步碼,最後一個字節是起始符。802.3與Ethernet V2規定的MTU不同,38~1492,同時支持以太網和IEEE802.3的NIC會根據長度區分。

Ethernet V2:
目的MAC+源MAC+長度+類型+CRC (6+6+2+46~1500+4)

PPP

在串行鏈路上封裝IP數據報的方法,點對點

d8

轉義字符:0x7D
1.同步傳輸
零填充,連續5個1加0,這樣就不會出現0x7E,接收端收到5個1就刪除後面的0

2.異步傳輸
0x7E用0x7D, 0x5E表示
0x7D用0x7D, 0x5D表示
如果有控制字符,則前面加0x7D,後面也要做相應的改變

PPPoE:
現在用戶牽寬帶,自己在家裏組局域網,幾臺電腦一起共享寬帶。所以,PPP幀也需要裝到以太網MAC幀中

環回接口:
允許運行在同一臺主機上的客戶程序和服務器程序通過TCP/IP進行通信。127網段的IP地址被預留給環回接口,一般使用127.0.0.1,被稱爲localhost。一個傳給環回接口的IP數據報不能出現在任何網絡上,當IP數據報離開網絡層就被及時的返回。傳給廣播地址或多播地址也要傳一份給自己,傳給主機IP的報文都要傳給自己(都是考慮從自己那裏發出去的包)

ping127.0.0.1 VS ping 主機ip
前者測試服務器(TCP/IP協議)是否正常,後者測試網卡是否正常

d9

串行線路吞吐量:
線路速率9600b/s,一個字節8bits,加上一個起始比特和一個停止比特,那麼線路的速率就是960B/s,那麼速率傳送一個1024字節分組需要1066ms

ARP: IP->MAC地址
高速緩存(一般20分鐘過期,除了綁定的情況下)
例:A->B(192.168.85.100)
查詢ARP緩存,如果沒有,A發一個ARP廣播請求,目的MAC爲FF-FF-FF-FF-FF-FF-FF-FF,目的IP爲192.168.85.100,加上自己的源IP和源MAC。同一個網段內的所有計算機都會收到這個廣播,如果IP和自己不一樣,則捨棄;一樣則更新自己的高速緩存(記下A的IP和MAC),並且單獨恢復一個ARP應答給A(將源MAC,IP變爲目的MAC,IP,用自己的MAC, IP替換源),A更新自己的緩存。
arp -a

  • 網絡層(datagram)

職責:分包路由
數據報:20~60字節的頭部 {首部長度4位,所以首部最大爲60個字節(2^4-1)*4,TOS表示服務類型(如最小時延,最大吞吐,最高可靠性和最小費用,只能置其中一個服務,全爲0時,是一般服務)。總長度是數據長度(最大2^16-1),是必要字段,因爲幀會填充。一般主機要求不超過576字節,所以有賴TCP分割數據。標識字段用來標識主機發送的每一個報文。TTL(time-to-live)規定了數據報最多可以經歷過多少路由器(最多255,默認32或64),當值爲0,捨棄報文,併發送ICMP報文通知源主機。協議標誌是指哪個協議向IP發數據,如ICMP。檢驗和是根據IP首部計算的檢驗字段(先把檢驗字段設爲0,對首部每16位進行反碼,再求和,接收方收到數據包時,根據首部計算檢驗和,如果沒有錯誤,結果和檢驗和同或返回全是1,如果不是,丟棄,並不發錯誤報告,由上層負責重傳)。因爲路由過程中TTL不斷減1,所以只需要在檢驗和加1就好了,不需要對IP整個首部進行重新進行。}

d11

IPV4 - 32位,4個無符號字節(0~255)以“.”隔開
IPV6 - 128位,8個16bits以”:”隔開, 連續0區塊可以不寫或者用0代替

127.0.0.1 loopback
主機名 localhost
IPV6的回送地址是::1

所有以0.開頭的IPV4地址都指向同一個本地網絡上的一個主機。255.255.255.255廣播地址,發送到這個地址,則本地網絡上的所有節點都會收到(不能超越本地網絡)

私網地址:
10.
172.16
172.31
192.168

NAT(network access translation): 外網<->私網

d6

A-》B,若B路由器的緩存用完了,IP的處理方式是發送ICMP給A,然後由上層如TCP來完成可靠性

ICMP:爲IP層通信提供一個維護,診斷和測試的框架,用於判斷網絡通不通,主機是否可達,路由器是否可用等。Ping過程實際上就是ICMP協議工作的工作,首先建立通道,然後發送包,對方接受後返回,還有網絡命令和跟蹤路由也是基於ICMP協議的。使用原始IP數據報在主機之間傳遞錯誤消息,JAVA不支持(only TCP/UDP),只能通過鏈接到原生代碼來實現。

路由器2發現路由器4不可達,則發送一個ICMP給A

d12

IP路由:
1. 如果TTL是0,就丟包
2. 搜索路由表,優先匹配主機
3. 搜索路由表,匹配子網
4. 搜索路由表,匹配網號
5. 發給默認路由
6. 同一個網絡,建立緩存表,數據報被送往以太網驅動程序
7. 以上都失敗了,就丟棄這個包,併產生ICMP錯誤包

路由器的內存中有一個路由表,收到一份數據報,搜索該表:
- 目的IP地址
- 下一站
- 標誌(表明目的或者下一站是路由器還是直接接口)

子網尋址:
網絡地址不夠用(比如A類只有2^24-2),子網應運而生,子網掩碼用來區分子網號和主機號:

d13

d14

掩碼變長:彙總,減少佔用路由表的空間

netstat:提供系統接口上的信息
主機也有路由器

  • 傳輸層(segment)

職責: 爲兩臺主機的應用程序提供端到端的通信,reliability(順序,完整性)
TCP:可靠,超時重傳,可以將應用程序提交的數據分成合適的小塊交給網絡層,確認收到分組或者設置發送最後確認分組超時時鐘等
UDP:不可靠,但是比較快

端口號:16bits,每一個端口監聽一個服務
1-1023 保留給已知端口(服務器)
1024-5000 臨時端口(客戶端口,確保是本機唯一就可以啦)

d3

d15

  • 應用層

APP-KERNEL-NETWORK

d4

WEB瀏覽器向WEB服務器發送獲取網頁的請求時,瀏覽器只能與本地客戶機的傳輸層對話,傳輸層將請求分解成TCP片,添加序列號和校驗和,然後將請求傳遞給本地網絡層,網絡層將TCP片分成IP數據報,並路由(IP),ARP(IP-》MAC),數據編碼成特定物理介質的模擬信號

常見服務和應用

DNS: 一個分佈的數據庫,由它來提供IP地址和主機名之間的映射信息。一個地址可以有多個名字,一個名字可以指示多個不同的地址(DNS負載均衡)

DHCP:IP地址有可能在程序運行時改變,所以每次需要時要檢查當前的IP地址,而不是將其緩存。一個計算機啓動時,它會發送請求給255.255.255.255,然後找到DHCP服務器

防火牆(網絡層):檢查傳入或者傳出網絡接口的各個包,根據一組規則接受或者拒絕包。過濾一般是根據網絡地址和端口的。

Proxy server(應用層):如果防火牆阻止某主機訪問外界網絡,此時向本地代理服務器(支持local caching)發送請求,然後代理去請求WEB服務器頁面,將回應轉發給主機。Socket代理服務器是作用在傳輸層,可以代理所有的TCP/UDP。公司可以使用代理服務器來跟蹤員工的web使用情況。

代理器目前不能應對所有協議,通常已有的協議有HTTP,FTP等,可以通過HTTP來接入他們的協議,最著名的是SOAP

Reference

  1. JAVA 網絡編程
  2. TCP/IP詳解 卷1
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章