TCP/IP模型中的傳輸層主要負責端到端通信,和資料鍊路層類似,資料鍊路層負責點到點的通信。TCP/IP模型的傳輸層主要協定有TCP (Transmission Control Protocol,傳輸控制協定)和UDP(User Data Protocol,使用者資料報協定)。
比如:應用程式A和 B 利用TCP通信:
TCP 把A的資料分成多個段,把段傳送給網絡層,網絡層把資料封裝為IP資料包,發給B。
B的網絡層将IP資料包分段交給B的傳輸層,傳輸層将分段重組還原成原始資料,傳送給B的應用層。
如果沒有傳輸層,IP 協定把分組送給B後還停留在B的網絡層而不能傳遞給應用程序。而要實作這個功能,就需要使用傳輸層的功能,需要在傳輸層間提供一條邏輯信道完成通信。傳輸層的“複用”和“分用”功能,通過不同的端口将封包傳遞給對應得應用程序。上面的這條邏輯信道因不同的協定TCP 或UDP 表現差異很大,TCP邏輯信道相當于一條全雙工的可靠信道,UDP是一條不可靠的信道。
UDP: 是面向無連接配接的協定,通信前不需要建立連接配接,直接發資料過去,通信效果高,可靠性不強。例如:ping 指令就是使用發送UDP資料包來判斷網絡是否連通。
TCP:是面向連接配接的、可靠的基于位元組流的傳輸層協定。通信前需要建立連接配接,通信後需要拆除連接配接。顯然,TCP 需要更多的協定資料單元頭部,占用許多主機資源。
上圖為TCP包的結構:
例如1:确認序号:期望收到的下一個封包的首部序号字段的值。簡單了解為:序号+資料長度,比如正确收到了一個封包段,其序号字段值是501,資料長度200,表明序号在501~700之間的資料均已正确收到。是以,确認序号值為701.
2:首部長度(TCP偏移量):指定了段頭的長度。段頭的長度取決與段頭選項字段中設定的選項;
占4位,1111 二進制的10進制為15,首部 長度的機關是4位元組。15*4=60位元組,是以資料偏移的最大值(TCP首部的最大長度)是60位元組;
3:視窗:指定關于發送端能傳輸的下一段的大小的指令,根據接收端的接收能力來定;
端口:傳送層收到網絡層交上來的TCP資料段或UDP資料報時,根據協定裡的端口号決定應當通過哪個端口上交給應用程序。
套接字(Socket):TCP 或UDP 可能被要求同時為多個應用程式程序提供并發服務。為了差別不同的應用程式程序和連接配接。作業系統為應用程式與TCP/IP互動提供了稱為Socket的接口。
程式中的Socket 是什麼:引用百度百科的一段來學習下:在網絡應用程式設計時,由于TCP/IP的核心内容被封裝在作業系統中,如果應用程式要使用TCP/IP,可以通過系統提供的TCP/IP的程式設計接口來實作。在Windows環境下,網絡應用程式程式設計接口稱作Windows Socket。為了支援使用者開發面向應用的通信程式,大部分系統都提供了一組基于TCP或者UDP的應用程式程式設計接口(API),該接口通常以一組函數的形式出現,也稱為套接字(Socket)
在C#.NET中 Socket類就是提供這個功能的API。
個人感悟:做網絡程式設計,資料通訊久了自然會想到一些底層原理上的問題。看理論若幹遍還不如實際動手操作一番,加深了解和記憶。比如路由器和交換機的差別,看了不少百度百科,百度知道,也能回答出他們的差別:如交換機工作在資料鍊路層、路由器工作在網絡層。交換機基于MAC位址轉發資料,而路由器基于IP位址轉發資料。不帶路由功能的交換機隻能分割沖突域,無法分割廣播域,而路由器可以分割廣播域。如果隻是學習下計算機網絡基礎知識死記硬背,絕對沒有什麼深刻的體會,但如果利用Cisco的PT模拟器實際動手操作一番,理論和實踐結合,相信會有另外一番領悟。
軟體工程師必須要懂計算機網絡基礎知識,有企業對招聘也提到懂TCP/IP協定,懂路由和交換技術優先的原因。不關心底層發生了什麼,熟練應用程式設計也沒有關系,知道點底層對自己也是有一種幫助的。