您好,登錄后才能下訂單哦!
一、網絡互聯模型
因特網在剛面世時,只有同一制造商生產的計算機才能彼此通信,制定網絡互聯模型的目的就是為異種的計算機互連提供一個共同的基礎和標準框架,并為保持相關標準的一致性和兼容性提供共同的參考。
互聯參考模型:
OSI七層模型(Open System Interconnect):應用層、表示層、會話層、傳輸層、網絡層、數據鏈路層、物理層
DoD四層模型:是OSI七層模型的濃縮版,包括 進程/應用層、主機到主機層、因特網層、網絡接入層
以上兩種模型是層次型的,分層模型的優點主要在于:
①將網絡通信過程劃分為更小、更簡單的組件,這有助于組件的開發、設計和故障的排除
②定義了模型每層執行的功能,從而鼓勵了行業標準化
③讓不同類型的網絡硬件和軟件能夠彼此通信
④避免對一層的修改而影響其它層
二、傳輸層協議
目前主流的傳輸層協議有TCP和UDP。SCTP是TCP的改進版,DCCP是一個用來取代UDP的新的非可靠傳輸協議
1、UDP(User Data Protocol,用戶數據報協議):一種無連接的協議,提供面向事務的簡單不可靠信息傳送服務,不建立會話,不對數據分段,不編號不排序,也就是說,當報文發送之后,是無法得知其是否安全完整到達的。但正因為UDP協議的控制選項較少,在數據傳輸過程中延遲小、數據傳輸效率高,適合對可靠性要求不高的應用程序,或者可以保障可靠性的應用程序
常用的UDP端口號有:DNS 53,TFTP 69,SNMP 161
2、TCP(Transmission Control Protocol,傳輸控制協議):一種面向連接的、可靠的、基于字節流的傳輸層通信協議。
TCP實現可靠性的機制:
①以通信雙方之間建立連接
②TCP把數據流分割為適當長度的報文段(通常受該計算機連接的網絡的數據鏈路層的最大傳輸單元(MTU)的限制)。
③TCP為了保證不發生丟包,就給每個報文段一個序號,同時序號也保證了接收端的按序接收。TCP報文段的到達也可能會失序,如有必要,TCP將對收到的報文段進行重新排序,將收到的數據以正確的順序交給應用層
④接收端對已成功收到的包發回一個相應的確認(ACK);如果發送端在合理的往返時延(RTT)內未收到確認,那么對應的數據包就被假設為已丟失將會被進行重傳。
⑤TCP用校驗和函數來檢驗報文段是否有錯誤,在發送和接收時都要計算校驗和,接收端若發現校驗和有差錯,將丟棄這個報文段和不確認收到此報文段。
⑥TCP還能提供流量控制:緩沖區(發送緩沖區、接收緩沖區)和滑動窗口
⑦在擁塞控制上,采用慢啟動和擁塞避免算法
▲TCP在正式傳輸數據前需要經過三次握手建立連接,其過程如下:
①客戶端發送SYN(SEQ=x)報文給服務器端,進入SYN_SEND狀態。
②服務器端收到SYN報文,回應一個SYN(SEQ=y)ACK(ACK=x+1)報文,進入SYN_RECV狀態。
③客戶端收到服務器端的SYN報文,回應一個ACK(ACK=y+1)報文,進入Established狀態。
▲在數據傳輸完畢后需要經過四次握手終止連接,其過程如下:
①某個應用進程首先調用close(),稱該端執行“主動關閉”(active close)。該端的TCP于是發送一個FIN分節(文件結束符),表示數據發送完畢。
②接收到這個FIN的對端執行 “被動關閉”(passive close),這個FIN由TCP確認。
注意:FIN的接收也作為一個文件結束符(end-of-file)傳遞給接收端應用進程,放在已排隊等候該應用進程接收的任何其他數據之后,因為,FIN的接收意味著接收端應用進程在相應連接上再無額外數據可接收。
③一段時間后,接收到這個文件結束符的應用進程將調用close關閉它的套接字,這導致它的TCP也發送一個FIN。
④接收這個最終FIN的原發送端TCP(即執行主動關閉的那一端)確認這個FIN。
▲TCP協議通過tcp狀態來標記當前處于通信過程的哪個階段:
CLOSED, LISTEN, SYN_SENT(主動打開), SYN_RECV, ESTABLISHED, FIN_WAIT1, CLOSE_WAIT, FIN_WAIT2, LAST_ACK, TIME_WAIT, CLOSED
三、套接字
1、套接字(socket):應用層通過傳輸層進行數據通信時,TCP和UDP會遇到同時會多個應用程序進程提供并發服務的問題。區分不同的應用程序進程間的網絡通信和連接,主要有三個參數:通信的目標IP地址、使用的傳輸層協議(TCP或UDP)、目標端口號,這種組合稱為套接字。
session:ip:port<==>ip:port
端口分類:
眾所周知的端口:0~1023,管理員才有權限使用,永久地分配給某應用使用;
注冊端口:1024~41951:只有一部分被注冊,分配原則上非特別嚴格;
動態端口或私有端口:41952+
/proc/sys/net/ipv4/ip_local_port_range:定義兩個數字,表示可以做為臨時端口的起始數字和結束數字
2、套接字類型:
tcp socket(流式)
udp socket(數據報式)
raw socket(不使用TCP或UDP協議,應用層的應用程序直接通達IP層)
3、socket通信在domain中實現,不同domain的socket地址格式不同,在unix domain中是一個文件路徑名,在ipv4 domain中是ipv4地址加端口號,在ipv6 domain中是ipv6地址加端口號
domain:
Unix domain:基于socket機制實現同一主機不同進程間通信的一種方式;AF_UNIX,AF_LOCAL
IPv4 domain:AF_INET,基于socket機制借助于ipv4協議實現不同主機(也可是同一主機)上的進程間的通信
IPv6 domain:AF_INET6
▲雖然IPv4 domain能實現不同或同一主機進程間通信,但是對于同一主機進程間的通信應盡量使用Unix domain,socket在Unix domain中實現通信的方式就是在內存中創建一個可讀寫的文件作為進程間交互的中介,這種方式繞過了網絡協議棧,節省了系統資源,提高了通信效率。
4、tcp socket通信相關的系統調用
socket():創建一個新的socket
bind():綁定于一個套接字地址上(服務器端會用到)
listen():監聽套接字
accept():接收連接請求
connect():發起連接請求
close():關閉連接
read()和write():recv(), send(), recvfrom(), sendto()
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。