1. 程式人生 > >“ping”命令的原理就是向對方主機發送UDP數據包,HTTP在每次請求結束後都會主動釋放連接,因此HTTP連接是一種“短連接”

“ping”命令的原理就是向對方主機發送UDP數據包,HTTP在每次請求結束後都會主動釋放連接,因此HTTP連接是一種“短連接”

文件服務 AC 原因 情況 TE idt tran ans 數據傳輸

Socket 是一套建立在TCP/IP協議上的接口不是一個協議

應用層: HTTP FTP SMTP Web

傳輸層: 在兩個應用程序之間提供了邏輯而不是物理的通信(TCP UDP)

TCP 可靠的 面向連接的服務

UDP 不可靠的 無連接的服務

只要底層實現TCP IP協議 都可以用socket進行通信


1、TCP和UDP

1.1 TCP連接

TCP協議能為應用程序提供可靠的通信連接,使一臺計算機發出的字節流無差錯地發往網絡上的其他計算機,對可靠性要求高的數據通信系統往往使用TCP協議傳輸數據。

手機能夠使用聯網功能是因為手機底層實現了TCP/IP協議,可以使手機終端通過無線網絡建立TCP連接。TCP協議可以對上層網絡提供接口,使上層網絡數據的傳輸建立在“無差別”的網絡之上。


建立起一個TCP連接需要經過“三次握手”:

第一次握手:客戶端發送syn包(syn=j)到服務器,並進入SYN_SEND狀態,等待服務器確認;

(即,發出連接請求數據包 :“我想給你發數據,可以嗎?”)


第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態;
(即,發送同意連接和要求同步(同步就是兩臺主機一個在發送,一個在接收,協調工作)的數據包:“可以,你什麽時候發?”)

第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手。
(即,發出一個數據包確認要求同步:“我現在就發,你接著吧!”)


握手過程中傳送的包裏不包含數據,三次握手完畢後,客戶端與服務器才正式開始傳送數據。理想狀態下,TCP連接一旦建立,在通信雙方中的任何一方主動關閉連接之前,TCP 連接都將被一直保持下去。斷開連接時服務器和客戶端均可以主動發起斷開TCP連接的請求,斷開過程需要經過“四次握手”(過程就不細寫了,就是服務器和客戶端交互,最終確定斷開)

TCP在數據包接收無序、丟失或在交付期間被破壞時,負責數據恢復。它通過為其發送的每個數據包提供一個序號來完成此恢復。記住,較低的網絡層會將每個數據包視為一個獨立的單元,因此,數據包可以沿完全不同的路徑發送,即使它們都是同一消息的組成部分。這種路由與網絡層處理分段和重新組裝數據包的方式非常相似,只是級別更高而已。

為確保正確地接收數據,TCP要求在目標計算機成功收到數據時發回一個確認(即 ACK)。如果在某個時限內未收到相應的 ACK,將重新傳送數據包。如果網絡擁塞,這種重新傳送將導致發送的數據包重復。但是,接收計算機可使用數據包的序號來確定它是否為重復數據包,並在必要時丟棄它。

1.2 UDP

UDP(User Data Protocol,用戶數據報協議)是與TCP相對應的協議。它是面向非連接的協議,它不與對方建立連接,而是直接就把數據包發送過去!

“面向非連接”就是在正式通信前不必與對方先建立連接,不管對方狀態就直接發送。這與現在風行的手機短信非常相似:你在發短信的時候,只需要輸入對方手機號就OK了。

UDP適用於一次只傳送少量數據、對可靠性要求不高的應用環境。比如,我們經常使用“ping”命令來測試兩臺主機之間TCP/IP通信是否正常,其實“ping”命令的原理就是向對方主機發送UDP數據包,然後對方主機確認收到數據包,如果數據包是否到達的消息及時反饋回來,那麽網絡就是通的。例如,在默認狀態下,一次“ping”操作發送4個數據包(如圖2所示)。大家可以看到,發送的數據包數量是4包,收到的也是4包(因為對方主機收到後會發回一個確認收到的數據包)。這充分說明了UDP協議是面向非連接的協議,沒有建立連接的過程。正因為UDP協議沒有連接的過程,所以它的通信效果高;但也正因為如此,它的可靠性不如TCP協議高。QQ就使用UDP發消息,因此有時會出現收不到消息的情況。

UDP不含擁塞控制機制,因此發送進程能夠以任意速率往UDP套接字發送數據,盡管不能保證所有數據都到達接收套接字,但是會有相當比列的數據到達。實時應用程序的開發人員往往選擇在UDP上運行他們的應用。與TCP類似,UDP也不提供任何延遲保證。

1.3 TCP和UDP區別

TCP UDP
是否連接 面向連接 面向非連接
傳輸可靠性 可靠的 不可靠的
應用場合 傳輸大量的數據 少量數據
速度

TCP協議和UDP協議特性區別總結: 1.TCP協議面向連接,UDP協議面向非連接    (有無鏈接) 2.TCP協議傳輸速度慢,UDP協議傳輸速度快    (傳輸速度) 3.TCP協議保證數據順序,UDP協議不保證    (數據的有序性,在IP層時,數據包會變得無序) 4. TCP協議保證數據正確性,UDP協議可能丟包    (TCP保證數據的可靠性) 5.TCP協議對系統資源要求多,UDP協議要求少 (TCP和UDP占用的資源)

1.4 TCP與UDP的選擇

如果比較UDP包和TCP包的結構,很明顯UDP包不具備TCP包復雜的可靠性與控制機制。與TCP協議相同,UDP的源端口數和目的端口數也都支持一臺主機上的多個應用。一個16位的UDP包包含了一個字節長的頭部和數據的長度,校驗碼域使其可以進行整體校驗。(許多應用只支持UDP,如:多媒體數據流,不產生任何額外的數據,即使知道有破壞的包也不進行重發。)
很明顯,當數據傳輸的性能必須讓位於數據傳輸的完整性、可控制性和可靠性時,TCP協議是當然的選擇。當強調傳輸性能而不是傳輸的完整性時,如:音頻和多媒體應用,UDP是最好的選擇。在數據傳輸時間很短,以至於此前的連接過程成為整個流量主體的情況下,UDP也是一個好的選擇,如:DNS交換。把SNMP建立在UDP上的部分原因是設計者認為當發生網絡阻塞時,UDP較低的開銷使其有更好的機會去傳送管理數據。TCP豐富的功能有時會導致不可預料的性能低下,但是我們相信在不遠的將來,TCP可靠的點對點連接將會用於絕大多數的網絡應用。

應 用

應用層協議

用來支撐的傳輸協議

電子郵件

SMTP(RFC82)

TCP

遠程終端訪問

Telenet

TCP

WEB

HTTP

TCP

文件傳送

FTP

TCP

遠程文件服務器

NFS

TCP或UDP

流多媒體

專屬

UDP或TCP

因特網電話

專屬

一般為UDP


在表中我們看到,電子郵件,遠程終端訪問,WEB和文件傳送都使用TCP協議,這些應用選擇TCP的主要原因是在於TCP提供了可靠的數據傳輸服務,能夠保證所有數據最終到達其目的地。我們還看到,因特網電話一般運行在UDP協議上面,一個因特網電話應用的倆端都得以某個最小速率跨越網絡發送數據;另外,因特網電話可以容忍數據丟失,從這個倆個條件來看,都適合UDP,不需要可靠的TCP傳輸服務。

總的來說,TCP能保證傳遞全部數據,而UDP不能,且他們都不提供延遲保證。他們不提供延遲保證,並不意味著時間敏感的應用不能運行在現在的因特網上,而是應用是通過一些其他的方法來保證這些需要。

2、HTTP連接

HTTP協議即超文本傳送協議(Hypertext Transfer Protocol ),是Web聯網的基礎,也是手機聯網常用的協議之一,HTTP協議是建立在TCP協議之上的一種應用。

HTTP連接最顯著的特點是客戶端發送的每次請求都需要服務器回送響應,在請求結束後,會主動釋放連接。從建立連接到關閉連接的過程稱為“一次連接”。

1)在HTTP 1.0中,客戶端的每次請求都要求建立一次單獨的連接,在處理完本次請求後,就自動釋放連接。

2)在HTTP 1.1中則可以在一次連接中處理多個請求,並且多個請求可以重疊進行,不需要等待一個請求結束後再發送下一個請求。

由於HTTP在每次請求結束後都會主動釋放連接,因此HTTP連接是一種“短連接”,要保持客戶端程序的在線狀態,需要不斷地向服務器發起連接請求。通常的做法是即時不需要獲得任何數據,客戶端也保持每隔一段固定的時間向服務器發送一次“保持連接”的請求,服務器在收到該請求後對客戶端進行回復,表明知道客戶端“在線”。若服務器長時間無法收到客戶端的請求,則認為客戶端“下線”,若客戶端長時間無法收到服務器的回復,則認為網絡已經斷開。

3、SOCKET原理


3.1套接字(socket)概念


套接字(socket)是通信的基石,是支持TCP/IP協議的網絡通信的基本操作單元。它是網絡通信過程中端點的抽象表示,包含進行網絡通信必須的五種信息:

連接使用的協議,

本地主機的IP地址,

本地進程的協議端口,

遠地主機的IP地址,

遠地進程的協議端口。

應用層通過傳輸層進行數據通信時,TCP會遇到同時為多個應用程序進程提供並發服務的問題。多個TCP連接或多個應用程序進程可能需要通過同一個 TCP協議端口傳輸數據。為了區別不同的應用程序進程和連接,許多計算機操作系統為應用程序與TCP/IP協議交互提供了套接字(Socket)接口。應用層可以和傳輸層通過Socket接口,區分來自不同應用程序進程或網絡連接的通信,實現數據傳輸的並發服務。



3.2 建立socket連接

建立Socket連接至少需要一對套接字,其中一個運行於客戶端,稱為ClientSocket ,另一個運行於服務器端,稱為ServerSocket 。

套接字之間的連接過程分為三個步驟:

服務器監聽,

客戶端請求,

連接確認。

服務器監聽:服務器端套接字並不定位具體的客戶端套接字,而是處於等待連接的狀態,實時監控網絡狀態,等待客戶端的連接請求。

客戶端請求:指客戶端的套接字提出連接請求,要連接的目標是服務器端的套接字。為此,客戶端的套接字必須首先描述它要連接的服務器的套接字,指出服務器端套接字的地址和端口號,然後就向服務器端套接字提出連接請求。

連接確認:當服務器端套接字監聽到或者說接收到客戶端套接字的連接請求時,就響應客戶端套接字的請求,建立一個新的線程,把服務器端套接字的描述發給客戶端,一旦客戶端確認了此描述,雙方就正式建立連接。而服務器端套接字繼續處於監聽狀態,繼續接收其他客戶端套接字的連接請求。



4、SOCKET連接與TCP連接

創建Socket連接時,可以指定使用的傳輸層協議,Socket可以支持不同的傳輸層協議(TCP或UDP),當使用TCP協議進行連接時,該Socket連接就是一個TCP連接。



5、Socket連接與HTTP連接

由於通常情況下Socket連接就是TCP連接,因此Socket連接一旦建立,通信雙方即可開始相互發送數據內容,直到雙方連接斷開。但在實際網絡應用中,客戶端到服務器之間的通信往往需要穿越多個中間節點,例如路由器、網關、防火墻等,大部分防火墻默認會關閉長時間處於非活躍狀態的連接而導致 Socket 連接斷連,因此需要通過輪詢告訴網絡,該連接處於活躍狀態。

而HTTP連接使用的是“請求—響應”的方式,不僅在請求時需要先建立連接,而且需要客戶端向服務器發出請求後,服務器端才能回復數據。

很多情況下,需要服務器端主動向客戶端推送數據,保持客戶端與服務器數據的實時與同步。此時若雙方建立的是Socket連接,服務器就可以直接將數據傳送給客戶端;若雙方建立的是HTTP連接,則服務器需要等到客戶端發送一次請求後才能將數據傳回給客戶端,因此,客戶端定時向服務器端發送連接請求,不僅可以保持在線,同時也是在“詢問”服務器是否有新的數據,如果有就將數據傳給客戶端

版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/wwmusic/article/details/8875748

“ping”命令的原理就是向對方主機發送UDP數據包,HTTP在每次請求結束後都會主動釋放連接,因此HTTP連接是一種“短連接”