一、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請求一致,只不過響應體不會返回,這一方法可以在不必傳輸整個響應內容的情況下,就能獲取包含在響應小消息頭中的元信息。