網絡協議的簡單梳理--socket、http、https、tcp、ip

一、socket

1、socket套接字是通信的基石,是支持TCP/IP協議的基本操作單元,包含進行網絡通信的五種信息

       1> 鏈接使用的協議

      2> 本地主機的IP地址

      3> 本地進程的協議端口

     4> 遠地主機的IP地址

     5> 遠地進程的協議端口

      多個TCP鏈接或者多個應用程序進程可能需要通過同一個TCP端口傳輸數據,操作系統爲應用程序與TCP/IP提供了socket套接字來區分,實現數據傳輸的併發服務

2、socket套接字的鏈接

   首先需要一對套接字,其中一個運行於客戶端---clientSocket,另一個在服務器端serverSocket,套接字的鏈接需要三步

    1》服務器監聽    2》客戶端請求   3》確定鏈接  他可以接受不同的傳輸協議:TCP或者UDP

    客戶端與服務器建立鏈接的流程圖

創建socket套接字

socket(af,type,protocol)    建立地址和套接字的聯繫

bind(socket,local,addr,addrlen)      服務器監聽客戶端的請求

listen(socket,quenlen)      建立服務器和客戶端的鏈接面向TCP

客戶端請求鏈接

connect(socket,sestaddr,addrlen)       服務器等待從XXX編號的socket上接受客戶的請求

newSocket = accept (sockid,clientaddr,paddrlen)     發送數據接收

面向鏈接

send(socket,buff,bufflen)

釋放套接字

close(socketed) 

在iOS中。以NSStream數據流來發送和接收數據,可以設置流的代理,對流的狀態做出相應的動作------建立鏈接、收到鏈接、鏈接關閉

NSStream繼承自CoreFoundation,NSInputStream是用於讀取輸入,是NSStream的子類

socket編程步驟  c語言版

1、導入<arpa/inet.h>,<netdb.h>

2、創建socket

int socketFileDescriptor = socket(AF_INET, SOCK_STREAM, 0);

if (-1 == socketFileDescriptor) {    

NSLog(@"創建失敗");  

   return; }

3、獲取IP地址

struct hostent * remoteHostEnt = gethostbyname([host UTF8String]);

if (NULL == remoteHostEnt){

      close(socketFileDescriptor);

      NSLog(@"%@",@"無法解析服務器的主機名");

      return;

}

4、設置參數

struct in_addr * remoteInAddr = (struct in_addr *)remoteHostEnt->h_addr_list[0];

struct sockaddr_in socketParameters;

socketParameters.sin_family = AF_INET;

socketParameters.sin_addr = *remoteInAddr;

socketParameters.sin_port = htons([port intValue]);

 

5、鏈接socket

int ret = connect(socketFileDescriptor, (struct sockaddr *) &socketParameters, sizeof(socketParameters));

if (-1 == ret) {

      close(socketFileDescriptor);

      NSLog(@"連接失敗");

      return;

}

NSLog(@"連接成功"); }

 

在實際開發中一般用CocoaAsynCocket是一個開源的庫支持TCP和UMP

1、與服務器通過三次握手建立鏈接

……..關於CocoaAnynSocket專門寫帖子

與服務器建立鏈接的原理

1、網絡的七層協議

HTTP是應用層的網絡協議,TCP是傳輸層的協議,IP是網絡協議,TCP/IP是傳輸層協議,主要解決數據如何在網絡中傳輸,HTTP解決如何包裝數據的,而socket是應用層與TCP/IP協議之間的抽象層,是他的一組接口

TCP/IP的五層模型

應用層,傳輸層,網絡層(路由器),數據鏈路層(交換機、網卡、以太網),物理層(雙絞線)

TCP/IP是傳輸層協議,HTTP是應用層協議,基於TCP/IP協議,在傳輸數據的時候可以只有引用層,但無法識別數據的類容,如果想要傳輸的數據有意義,那麼就必須使用應用層的協議:HTTP、FTP、等協議

socket是在應用層和傳輸層之間的長鏈接接口,是對TCP/IP協議的封裝,本身並不是協議,但只有通過socket才能使用傳輸協議。網絡層的通信就是socket之間的通信,HTTP、XMPP等的實質就是socket之間的通信

TCP:傳輸控制協議

1、TCP可以對上層網絡提供接口,通過三次握手建立鏈接,形成數據傳輸通道,在客戶端與服務器端進行大量的數據傳輸,是點到點的通信

2、TCP的連接:三次握手

1>客戶端發送syn包(syn = j)到服務器,進入syn_send狀態,等待確認

2>服務器接受到syn包,確認客端的syn(ack = j+1)包,同時給自己發送一個syn包,進入syn_recv,等待狀態

3>客戶端收到服務器的syn+ack包,向服務器發送確認包ACK,此包發送完畢,客戶端和服務器端進入鏈接狀態,完成三次握手

注意++

三次握手過程中傳送的包裏是沒有數據的,三次握手完畢客戶端與服務器才正式開始傳輸數據。理想狀態下TCP一旦建立鏈接,在通信雙方任何一方主動關閉之前,tcp都會保持下去,客戶端和服務器端都可以主動斷開鏈接,斷開鏈接需要四次握手

UDP:用戶數據包協議

主要將數據及目的源封裝成數據包,不需要建立鏈接,每個數據包的大小爲64k,是點到點的通信,比如發送音頻、視頻,少一幀都沒關係

HTTP超文本傳輸協議

HTTP是建立在TCP/IP協議之上的應用層協議,是客戶端發起請求,服務器做出響應,在做出響應之後服務器主動斷開,從建立到關閉的過程一次鏈接,所以是短連接,如果要保持客戶端一直在線狀態就需要不斷的向服務器發送請求

HTTPS:是安全的HTTP,在HTTP下加了SSL層,安全基礎是SSL,因此加密的詳細內容就需要SSL,HTTP是以明文的方式發送內容,HTTPS需要ca證書,是和HTTP完全不同的鏈接方式,端口也是不一樣的,HTTP是80端口,而HTTPS是443端口

HTTPS的鏈接過程:客戶端發起HTTPS鏈接,服務器返回一個證書的公鑰,客戶端隨機產生一個對稱祕鑰,使公鑰對對稱祕鑰加密,發送加密後的對稱祕鑰,通過對稱祕鑰加密的密文通信

HTTP的請求方式:post、get、put、head、options、

一個URL描述一個網絡上的資源,一般post提交數據,get獲取數據,但其實get也能提交數據

在HTTP頭部有兩個報文:請求報文和響應報文

請求報文由:請求行、請求頭部、空行、請求數據組成

響應報文由:狀態行、消息報頭部、響應正文組成

請求行:是請求的路徑

請求頭部:對客戶端的描述;比如是ios或者android

空行和請求數據只有post用來提交數據

響應報文狀態行:對HTTP協議版本和狀態碼的迴應,比如404

消息頭部:對服務器的描述

響應正文:給客戶端的具體數據

GET:是在一個URL後邊直接拼接參數,不適合大量的數據,長度有限,一般爲1024個字節,oc默認的是get請求。將請求的數據放在協議的頭部,以‘ ?’隔開,多個參數用&連接,英文原樣發送,空格轉成十進制

POST:它請求的數據是在請求體重,比較安全,大小理論上沒有限制。

get:向特定的資源發出請求,他本質就是發送一個請求來取得服務器上的某一資源,通過一組HTTP頭和呈現數據,get請求中永遠不會包含成數據

post:向指定資源提交數據進行處理請求,數據被包含在請求體中,post請求可能會導致新的資源的建立或已有資源的修改

put:向指定資源位置上傳最新的內容

head:向服務器索取與get請求一致,只不過響應體不會返回,這一方法可以在不必傳輸整個響應內容的情況下,就能獲取包含在響應小消息頭中的元信息。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章