溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

TCP及socket通信原理

發(fā)布時間:2020-02-25 10:46:12 來源:網(wǎng)絡(luò) 閱讀:1723 作者:iamwhoiam2013 欄目:系統(tǒng)運(yùn)維

一、網(wǎng)絡(luò)互聯(lián)模型

   因特網(wǎng)在剛面世時,只有同一制造商生產(chǎn)的計算機(jī)才能彼此通信,制定網(wǎng)絡(luò)互聯(lián)模型的目的就是為異種的計算機(jī)互連提供一個共同的基礎(chǔ)和標(biāo)準(zhǔn)框架,并為保持相關(guān)標(biāo)準(zhǔn)的一致性和兼容性提供共同的參考。

   互聯(lián)參考模型:

      OSI七層模型(Open System Interconnect):應(yīng)用層、表示層、會話層、傳輸層、網(wǎng)絡(luò)層、數(shù)據(jù)鏈路層、物理層

      DoD四層模型:是OSI七層模型的濃縮版,包括 進(jìn)程/應(yīng)用層、主機(jī)到主機(jī)層、因特網(wǎng)層、網(wǎng)絡(luò)接入層

TCP及socket通信原理

   以上兩種模型是層次型的,分層模型的優(yōu)點主要在于:

      ①將網(wǎng)絡(luò)通信過程劃分為更小、更簡單的組件,這有助于組件的開發(fā)、設(shè)計和故障的排除

      ②定義了模型每層執(zhí)行的功能,從而鼓勵了行業(yè)標(biāo)準(zhǔn)化

      ③讓不同類型的網(wǎng)絡(luò)硬件和軟件能夠彼此通信

      ④避免對一層的修改而影響其它層


二、傳輸層協(xié)議

   目前主流的傳輸層協(xié)議有TCP和UDP。SCTP是TCP的改進(jìn)版,DCCP是一個用來取代UDP的新的非可靠傳輸協(xié)議

   1、UDP(User Data Protocol,用戶數(shù)據(jù)報協(xié)議):一種無連接的協(xié)議,提供面向事務(wù)的簡單可靠信息傳送服務(wù),不建立會話,不對數(shù)據(jù)分段,不編號不排序,也就是說,當(dāng)報文發(fā)送之后,是無法得知其是否安全完整到達(dá)的。但正因為UDP協(xié)議的控制選項較少,在數(shù)據(jù)傳輸過程中延遲小、數(shù)據(jù)傳輸效率高,適合對可靠性要求不高的應(yīng)用程序,或者可以保障可靠性的應(yīng)用程序

     常用的UDP端口號有:DNS 53,TFTP 69,SNMP 161


   2、TCP(Transmission Control Protocol,傳輸控制協(xié)議):一種面向連接的、可靠、基于字節(jié)流的傳輸層通信協(xié)議。

     TCP實現(xiàn)可靠性的機(jī)制: 

        ①以通信雙方之間建立連接      

        ②TCP把數(shù)據(jù)流分割為適當(dāng)長度的報文段(通常受該計算機(jī)連接的網(wǎng)絡(luò)的數(shù)據(jù)鏈路層的最大傳輸單元(MTU)的限制)。

        ③TCP為了保證不發(fā)生丟包,就給每個報文段一個序號,同時序號也保證了接收端的按序接收。TCP報文段的到達(dá)也可能會失序,如有必要,TCP將對收到的報文段進(jìn)行重新排序,將收到的數(shù)據(jù)以正確的順序交給應(yīng)用層

        ④接收端對已成功收到的包發(fā)回一個相應(yīng)的確認(rèn)(ACK);如果發(fā)送端在合理的往返時延(RTT)內(nèi)未收到確認(rèn),那么對應(yīng)的數(shù)據(jù)包就被假設(shè)為已丟失將會被進(jìn)行重傳

        ⑤TCP用校驗和函數(shù)來檢驗報文段是否有錯誤,在發(fā)送和接收時都要計算校驗和,接收端若發(fā)現(xiàn)校驗和有差錯,將丟棄這個報文段和不確認(rèn)收到此報文段。

        ⑥TCP還能提供流量控制:緩沖區(qū)(發(fā)送緩沖區(qū)、接收緩沖區(qū))滑動窗口

        ⑦在擁塞控制上,采用慢啟動擁塞避免算法

TCP及socket通信原理


     ▲TCP在正式傳輸數(shù)據(jù)前需要經(jīng)過三次握手建立連接,其過程如下:        

         ①客戶端發(fā)送SYN(SEQ=x)報文給服務(wù)器端,進(jìn)入SYN_SEND狀態(tài)。

         ②服務(wù)器端收到SYN報文,回應(yīng)一個SYN(SEQ=y)ACK(ACK=x+1)報文,進(jìn)入SYN_RECV狀態(tài)。

         ③客戶端收到服務(wù)器端的SYN報文,回應(yīng)一個ACK(ACK=y+1)報文,進(jìn)入Established狀態(tài)。

     

     ▲在數(shù)據(jù)傳輸完畢后需要經(jīng)過四次握手終止連接,其過程如下:

         ①某個應(yīng)用進(jìn)程首先調(diào)用close(),稱該端執(zhí)行“主動關(guān)閉”(active close)。該端的TCP于是發(fā)送一個FIN分節(jié)(文件結(jié)束符),表示數(shù)據(jù)發(fā)送完畢。

         ②接收到這個FIN的對端執(zhí)行 “被動關(guān)閉”(passive close),這個FIN由TCP確認(rèn)。

         注意:FIN的接收也作為一個文件結(jié)束符(end-of-file)傳遞給接收端應(yīng)用進(jìn)程,放在已排隊等候該應(yīng)用進(jìn)程接收的任何其他數(shù)據(jù)之后,因為,F(xiàn)IN的接收意味著接收端應(yīng)用進(jìn)程在相應(yīng)連接上再無額外數(shù)據(jù)可接收。

         ③一段時間后,接收到這個文件結(jié)束符的應(yīng)用進(jìn)程將調(diào)用close關(guān)閉它的套接字,這導(dǎo)致它的TCP也發(fā)送一個FIN。

         ④接收這個最終FIN的原發(fā)送端TCP(即執(zhí)行主動關(guān)閉的那一端)確認(rèn)這個FIN。

      

      ▲TCP協(xié)議通過tcp狀態(tài)來標(biāo)記當(dāng)前處于通信過程的哪個階段:

         CLOSED, LISTEN, SYN_SENT(主動打開), SYN_RECV, ESTABLISHED, FIN_WAIT1, CLOSE_WAIT, FIN_WAIT2, LAST_ACK, TIME_WAIT, CLOSED


三、套接字

  1、套接字(socket):應(yīng)用層通過傳輸層進(jìn)行數(shù)據(jù)通信時,TCP和UDP會遇到同時會多個應(yīng)用程序進(jìn)程提供并發(fā)服務(wù)的問題。區(qū)分不同的應(yīng)用程序進(jìn)程間的網(wǎng)絡(luò)通信和連接,主要有三個參數(shù):通信的目標(biāo)IP地址、使用的傳輸層協(xié)議(TCP或UDP)、目標(biāo)端口號,這種組合稱為套接字。

       session:ip:port<==>ip:port

       端口分類

          眾所周知的端口:0~1023,管理員才有權(quán)限使用,永久地分配給某應(yīng)用使用;

          注冊端口:1024~41951:只有一部分被注冊,分配原則上非特別嚴(yán)格;

          動態(tài)端口或私有端口:41952+

            /proc/sys/net/ipv4/ip_local_port_range:定義兩個數(shù)字,表示可以做為臨時端口的起始數(shù)字和結(jié)束數(shù)字

  2、套接字類型:

      tcp socket(流式)

      udp socket(數(shù)據(jù)報式)

      raw socket(不使用TCP或UDP協(xié)議,應(yīng)用層的應(yīng)用程序直接通達(dá)IP層)


  3、socket通信在domain中實現(xiàn),不同domain的socket地址格式不同,在unix domain中是一個文件路徑名,在ipv4 domain中是ipv4地址加端口號,在ipv6 domain中是ipv6地址加端口號     

      domain:

         Unix domain:基于socket機(jī)制實現(xiàn)同一主機(jī)不同進(jìn)程間通信的一種方式;AF_UNIX,AF_LOCAL

         IPv4 domain:AF_INET,基于socket機(jī)制借助于ipv4協(xié)議實現(xiàn)不同主機(jī)(也可是同一主機(jī))上的進(jìn)程間的通信

         IPv6 domain:AF_INET6

    ▲雖然IPv4 domain能實現(xiàn)不同或同一主機(jī)進(jìn)程間通信,但是對于同一主機(jī)進(jìn)程間的通信應(yīng)盡量使用Unix domain,socket在Unix domain中實現(xiàn)通信的方式就是在內(nèi)存中創(chuàng)建一個可讀寫的文件作為進(jìn)程間交互的中介,這種方式繞過了網(wǎng)絡(luò)協(xié)議棧,節(jié)省了系統(tǒng)資源,提高了通信效率。


  4、tcp socket通信相關(guān)的系統(tǒng)調(diào)用

TCP及socket通信原理

       socket():創(chuàng)建一個新的socket

       bind():綁定于一個套接字地址上(服務(wù)器端會用到)

       listen():監(jiān)聽套接字

       accept():接收連接請求

       connect():發(fā)起連接請求

       close():關(guān)閉連接

       read()和write():recv(), send(), recvfrom(), sendto()

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI