http,socket,tcp/ip 網(wǎng)絡傳輸與通訊
TCP的全稱為傳輸控制協(xié)議。這種協(xié)議可以提供面向連接的、可靠的、點到點的通信。
UDP全稱為用戶數(shù)據(jù)報協(xié)議,它可以提供非連接的不可靠的點到多點的通信。
使用TCP還是UDP,那要看你的程序注重哪一個方面,可靠(tcp)還是快速(udp)。
1.TCP是面向鏈接的,TCP的三次握手在最低限度上保證了連接的可靠性;而UDP不是面向連接的,UDP傳送數(shù)據(jù)前并不與對方建立連接,對接收到的數(shù)據(jù)也不發(fā)送確認信號,發(fā)送端不知道數(shù)據(jù)是否會正確接收,當然也不用重發(fā),所以說UDP是無連接的、不可靠的一種數(shù)據(jù)傳輸協(xié)議。
2.也正由于1所說的特點,使得UDP的開銷更小數(shù)據(jù)傳輸速率更高,因為不必進行收發(fā)數(shù)據(jù)的確認,所以UDP的實時性更好。
TCP/IP建立連接的過程 TCP連接需要經(jīng)過 三次握手
第一次握手:客戶端發(fā)送syn包(syn=j)到服務器,并進入SYN_SEND狀態(tài),等待服務器確認;
第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發(fā)送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態(tài);
第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發(fā)送確認包ACK(ack=k+1),此包發(fā)送完畢,客戶端和服務器進入ESTABLISHED狀態(tài),完成三次握手。
所謂的三次握手就是要有三次連接信息的發(fā)送/接收過程。握手過程中傳送的包里不包含數(shù)據(jù),三次握手完畢后,客戶端與服務器才正式開始傳送數(shù)據(jù)
三次握手實質上就相當于是下列的對話:
-客戶機:服務器,我想要和你建立連接,你同意嗎?(SYN=1)
-服務器:客戶機,我同意和你建立連接(ACK=1);我也想和你建立連接,你同意嗎?(SYN=1)
-客戶機:服務器,我同意和你建立連接。(ACK=1)
四次揮手實質上就相當于是下列的對話:
-客戶機:服務器,我想和你斷開連接,你同意嗎?(FIN=1)
-服務器:我同意(ACK=1)(在此期間,服務器可能還會向客戶機發(fā)送數(shù)據(jù),但是客戶機卻不能再向服務器發(fā)送數(shù)據(jù))
-服務器:客戶機,我想要和你斷開連接,你同意嗎?(FIN=1)
-客戶機:我同意。(ACK=1)
HTTP連接
HTTP協(xié)議即超文本傳送協(xié)議(Hypertext Transfer Protocol ),是Web聯(lián)網(wǎng)的基礎,也是手機聯(lián)網(wǎng)常用的協(xié)議之一,HTTP協(xié)議是建立在TCP協(xié)議之上的一種應用。
HTTP連接最顯著的特點是客戶端發(fā)送的每次請求都需要服務器回送響應,在請求結束后,會主動釋放連接。從建立連接到關閉連接的過程稱為“一次連接”
SOCKET原理
套接字(SOCKET)概念
socket是通信的基石,是支持TCP/IP協(xié)議的網(wǎng)絡通信的基本操作單元。它包含進行網(wǎng)絡通信必須的五種信息:連接使用的協(xié)議,本地主機的IP地址,本地進程的協(xié)議端口,遠地主機的IP地址,遠地進程的協(xié)議端口。
應用層通過傳輸層進行數(shù)據(jù)通信時,TCP會遇到同時為多個應用程序進程提供并發(fā)服務的問題。多個TCP連接或多個應用程序進程可能需要通過同一個 TCP協(xié)議端口傳輸數(shù)據(jù)。為了區(qū)別不同的應用程序進程和連接,許多計算機操作系統(tǒng)為應用程序與TCP/IP協(xié)議交互提供了套接字(Socket)接口。應用層可以和傳輸層通過Socket接口,區(qū)分來自不同應用程序進程或網(wǎng)絡連接的通信,實現(xiàn)數(shù)據(jù)傳輸?shù)牟l(fā)服務。
socket的出現(xiàn)只是可以更方便的使用TCP/IP協(xié)議棧而已,其對TCP/IP進行了抽象
建立SOCKET連接
建立Socket連接至少需要一對套接字,其中一個運行于客戶端,稱為ClientSocket ,另一個運行于服務器端,稱為ServerSocket 。
套接字之間的連接過程分為三個步驟:服務器監(jiān)聽,客戶端請求,連接確認。
1.)服務器監(jiān)聽:服務器端套接字并不定位具體的客戶端套接字,而是處于等待連接的狀態(tài),實時監(jiān)控網(wǎng)絡狀態(tài),等待客戶端的連接請求。
2.)客戶端請求:指客戶端的套接字提出連接請求,要連接的目標是服務器端的套接字。為此,客戶端的套接字必須首先描述它要連接的服務器的套接字,指出服務器端套接字的地址和端口號,然后就向服務器端套接字提出連接請求。
3.)連接確認:當服務器端套接字監(jiān)聽到或者說接收到客戶端套接字的連接請求時,就響應客戶端套接字的請求,建立一個新的線程,把服務器端套接字的描述發(fā)給客戶端,一旦客戶端確認了此描述,雙方就正式建立連接。而服務器端套接字繼續(xù)處于監(jiān)聽狀態(tài),繼續(xù)接收其他客戶端套接字的連接請求。
SOCKET連接與TCP/IP連接
創(chuàng)建Socket連接時,可以指定使用的傳輸層協(xié)議,Socket可以支持不同的傳輸層協(xié)議(TCP或UDP),當使用TCP協(xié)議進行連接時,該Socket連接就是一個TCP連接。
SOCKET連接與HTTP連接
由于通常情況下Socket連接就是TCP連接,因此Socket連接一旦建立,通信雙方即可開始相互發(fā)送數(shù)據(jù)內容,直到雙方連接斷開。但在實際網(wǎng)絡應用中,客戶端到服務器之間的通信往往需要穿越多個中間節(jié)點,例如路由器、網(wǎng)關、防火墻等,大部分防火墻默認會關閉長時間處于非活躍狀態(tài)的連接而導致 Socket 連接斷連,因此需要通過輪詢告訴網(wǎng)絡,該連接處于活躍狀態(tài)。
而HTTP連接使用的是“請求—響應”的方式,不僅在請求時需要先建立連接,而且需要客戶端向服務器發(fā)出請求后,服務器端才能回復數(shù)據(jù)。
很多情況下,需要服務器端主動向客戶端推送數(shù)據(jù),保持客戶端與服務器數(shù)據(jù)的實時與同步。
若雙方建立的是Socket連接,服務器就可以直接將數(shù)據(jù)傳送給客戶端;
若雙方建立的是HTTP連接,則服務器需要等到客戶端發(fā)送一次請求后才能將數(shù)據(jù)傳回給客戶端。
因此,客戶端定時向服務器端發(fā)送連接請求,不僅可以保持在線,同時也是在“詢問”服務器是否有新的數(shù)據(jù),如果有就將數(shù)據(jù)傳給客戶端。
傳輸層的TCP是基于網(wǎng)絡層的IP協(xié)議的,而應用層的HTTP協(xié)議又是基于傳輸層的TCP協(xié)議的,而Socket本身不算是協(xié)議,就像上面所說,它只是提供了一個針對TCP或者UDP編程的接口。
TCP/IP的工作原理:TCP/IP協(xié)議采用4層結構,分別是應用層、傳輸層、網(wǎng)絡層和鏈路層
物理介質:常見的有光纖、雙絞線,以及無線電波,網(wǎng)絡通訊信的橋梁
網(wǎng)絡通信就是把有特定意義的數(shù)據(jù)通過物理介質傳送給對方,單純的發(fā)送0和1是沒有意義的,因此就需要對0和1進行分組,并且要標識好每一組電信號的信息特征,然后按照分組的順序依次發(fā)送。
鏈路層:以太網(wǎng)協(xié)議:電信號數(shù)據(jù)包傳遞即為一幀包括MAC地址,類型;數(shù)據(jù);數(shù)據(jù)幀校驗序列。有了MAC地址以后,以太網(wǎng)采用廣播形式,把數(shù)據(jù)包發(fā)給該子網(wǎng)內所有主機,子網(wǎng)內每臺主機在接收到這個包以后,讀取首部里的目標MAC地址和自己的MAC地址匹配,相同處理,不同丟棄。
網(wǎng)絡層:IP協(xié)議 :MAC地址只與廠商有關,與所處的網(wǎng)絡無關,所以無法通過MAC地址來判斷兩臺主機是否屬于同一個子網(wǎng)。因此,網(wǎng)絡層引入了IP協(xié)議,制定了一套新地址做區(qū)分。也就是所謂的IP地址,為了判斷IP地址中的網(wǎng)絡地址,IP協(xié)議還引入了子網(wǎng)掩碼,通過子網(wǎng)掩碼對兩個IP地址進行AND運算后就能夠判斷雙方是否在同一個子網(wǎng)了。
網(wǎng)絡層的主要工作是定義網(wǎng)絡地址,區(qū)分網(wǎng)段,子網(wǎng)內MAC尋址,對于不同子網(wǎng)的數(shù)據(jù)包進行路由。
傳輸層:鏈路層定義了主機的身份,即MAC地址, 而網(wǎng)絡層定義了IP地址,明確了主機所在的網(wǎng)段,有了這兩個地址,數(shù)據(jù)包就從可以從一個主機發(fā)送到另一臺主機。但實際上數(shù)據(jù)包是從一個主機的某個應用程序發(fā)出,然后由對方主機的應用程序接收。怎么接收呢?個主機上的每個應用程序都需要指定唯一的端口號,并且規(guī)定網(wǎng)絡中傳輸?shù)臄?shù)據(jù)包必須加上端口信息,根據(jù)端口號可以找到對應的應用程序(socket擴展)。 為了保證傳輸?shù)目煽啃?,TCP協(xié)議建立了三次對話的確認機制,也就是說,在正式收發(fā)數(shù)據(jù)前,必須和對方建立可靠的連接。
總結一下,傳輸層的主要工作是定義端口,標識應用程序身份,實現(xiàn)端口到端口的通信,TCP協(xié)議可以保證數(shù)據(jù)傳輸?shù)目煽啃浴?/p>
應用層:有了以上三層協(xié)議的支持,數(shù)據(jù)已經(jīng)可以從一個主機上的應用程序傳輸?shù)搅硪慌_主機的應用程序了,但此時傳過來的數(shù)據(jù)是字節(jié)流,不能很好的被程序識別,操作性差。因此,應用層定義了各種各樣的協(xié)議來規(guī)范數(shù)據(jù)格式,常見的有http,ftp,smtp等,http是一種比較常用的應用層協(xié)議 。在請求Header中,分別定義了請求數(shù)據(jù)格式Accept 和 響應數(shù)據(jù)格式Content-Type,有了這個規(guī)范以后,當對方接收到請求以后就知道該用什么格式來解析,然后對請求進行處理就可以看到接收的數(shù)據(jù)信息。
首先我們梳理一下每層模型的職責:
?鏈路層:對0和1進行分組,定義數(shù)據(jù)幀,確認主機的物理地址,傳輸數(shù)據(jù);
?網(wǎng)絡層:定義IP地址,確認主機所在的網(wǎng)絡位置,并通過IP進行MAC尋址,對外網(wǎng)數(shù)據(jù)包進行路由轉發(fā);
?傳輸層:定義端口,確認主機上應用程序的身份,并將數(shù)據(jù)包交給對應的應用程序;
?應用層:定義數(shù)據(jù)格式,并按照對應的格式解讀數(shù)據(jù)。