網(wǎng)絡(luò)七層由下往上分別為物理層鳍贾、數(shù)據(jù)鏈路層鞍匾、網(wǎng)絡(luò)層、傳輸層骑科、會話層橡淑、表示層和應(yīng)用層。
http協(xié)議對應(yīng)于應(yīng)用層
tcp協(xié)議對應(yīng)于傳輸層
ip協(xié)議對應(yīng)于網(wǎng)絡(luò)層
三者本質(zhì)上沒有可比性咆爽。 何況HTTP協(xié)議是基于TCP連接的梁棠。
1.Socket簡介
首先讓我們通過一張圖知道socket在哪里置森?
Socket是應(yīng)用層與TCP/IP協(xié)議族通信的中間軟件抽象層,它是一組接口掰茶。
2.TCP和UDP的區(qū)別
在這里就必須講一下udp和tcp的區(qū)別了
TCP:面向連接暇藏、傳輸可靠(保證數(shù)據(jù)正確性,保證數(shù)據(jù)順序)、用于傳輸大量數(shù)據(jù)(流模式)濒蒋、速度慢盐碱,建立連接需要開銷較多(時(shí)間,系統(tǒng)資源)沪伙。
UDP:面向非連接瓮顽、傳輸不可靠、用于傳輸少量數(shù)據(jù)(數(shù)據(jù)包模式)围橡、速度快暖混。
關(guān)于TCP是一種流模式的協(xié)議,UDP是一種數(shù)據(jù)報(bào)模式的協(xié)議翁授,這里要說明一 下拣播,TCP是面向連接的,也就是說收擦,在連接持續(xù)的過程中贮配,socket中收到的數(shù)據(jù)都是由同一臺主機(jī)發(fā)出的(劫持什么的不考慮),因此塞赂,知道保證數(shù)據(jù)是有 序的到達(dá)就行了泪勒,至于每次讀取多少數(shù)據(jù)自己看著辦。
而UDP是無連接的協(xié)議宴猾,也就是說圆存,只要知道接收端的IP和端口,且網(wǎng)絡(luò)是可達(dá)的仇哆,任何主機(jī)都可以向接收端發(fā)送數(shù)據(jù)沦辙。這時(shí)候,如果一次能讀取超過一 個(gè)報(bào)文的數(shù)據(jù)讹剔,則會亂套油讯。比如,主機(jī)A向發(fā)送了報(bào)文P1辟拷,主機(jī)B發(fā)送了報(bào)文P2,如果能夠讀取超過一個(gè)報(bào)文的數(shù)據(jù)阐斜,那么就會將P1和P2的數(shù)據(jù)合并在了一 起衫冻,這樣的數(shù)據(jù)是沒有意義的。
3.TCP三次握手和四次揮手
相對于SOCKET開發(fā)者谒出,TCP創(chuàng)建過程和連接拆除過程是由TCP/IP協(xié)議棧自動創(chuàng)建的隅俘。因此開發(fā)者并不需要控制這個(gè)過程邻奠。但是對于理解TCP底層運(yùn)作機(jī)制,相當(dāng)有幫助为居。
因此在這里詳細(xì)解釋一下這兩個(gè)過程碌宴。
TCP三次握手
所謂三次握手(Three-way Handshake),是指建立一個(gè)TCP連接時(shí)蒙畴,需要客戶端和服務(wù)器總共發(fā)送3個(gè)包贰镣。
三次握手的目的是連接服務(wù)器指定端口,建立TCP連接,并同步連接雙方的序列號和確認(rèn)號并交換 TCP 窗口大小信息.在socket編程中膳凝,客戶端執(zhí)行connect()時(shí)碑隆。將觸發(fā)三次握手
首先了解一下幾個(gè)標(biāo)志,SYN(synchronous)蹬音,同步標(biāo)志上煤,ACK (Acknowledgement),即確認(rèn)標(biāo)志著淆,seq應(yīng)該是Sequence Number劫狠,序列號的意思,另外還有四次握手的fin永部,應(yīng)該是final独泞,表示結(jié)束標(biāo)志。
第一次握手:客戶端發(fā)送一個(gè)TCP的SYN標(biāo)志位置1的包指明客戶打算連接的服務(wù)器的端口扬舒,以及初始序號X,保存在包頭的序列號(Sequence Number)字段里阐肤。
第二次握手:服務(wù)器發(fā)回確認(rèn)包(ACK)應(yīng)答。即SYN標(biāo)志位和ACK標(biāo)志位均為1同時(shí)讲坎,將確認(rèn)序號(Acknowledgement Number)設(shè)置為客戶的序列號加1以孕惜,即X+1。
第三次握手:客戶端再次發(fā)送確認(rèn)包(ACK) SYN標(biāo)志位為0晨炕,ACK標(biāo)志位為1衫画。并且把服務(wù)器發(fā)來ACK的序號字段+1,放在確定字段中發(fā)送給對方.并且在數(shù)據(jù)段放寫序列號的+1瓮栗。
TCP四次揮手
TCP的連接的拆除需要發(fā)送四個(gè)包削罩,因此稱為四次揮手(four-way handshake)》鸭椋客戶端或服務(wù)器均可主動發(fā)起揮手動作弥激,在socket編程中,任何一方執(zhí)行close()操作即可產(chǎn)生揮手操作愿阐。
其實(shí)有個(gè)問題微服,為什么連接的時(shí)候是三次握手,關(guān)閉的時(shí)候卻是四次揮手缨历?
因?yàn)楫?dāng)Server端收到Client端的SYN連接請求報(bào)文后以蕴,可以直接發(fā)送SYN+ACK報(bào)文糙麦。其中ACK報(bào)文是用來應(yīng)答的,SYN報(bào)文是用來 同步的丛肮。但是關(guān)閉連接時(shí)赡磅,當(dāng)Server端收到FIN報(bào)文時(shí),很可能并不會立即關(guān)閉SOCKET宝与,所以只能先回復(fù)一個(gè)ACK報(bào)文焚廊,告訴Client端," 你發(fā)的FIN報(bào)文我收到了"伴鳖。只有等到我Server端所有的報(bào)文都發(fā)送完了饶氏,我才能發(fā)送FIN報(bào)文讥脐,因此不能一起發(fā)送。故需要四步握手。
TCPsocket和UDPsocket的具體實(shí)現(xiàn)
講了這么久嗡呼,終于要開始講socket的具體實(shí)現(xiàn)了源祈,iOS提供了Socket網(wǎng)絡(luò)編程的接口CFSocket虫溜,不過這里使用BSD Socket合敦。
tcp和udp的socket是有區(qū)別的,這里給出這兩種的設(shè)計(jì)框架
基本TCP客戶—服務(wù)器程序設(shè)計(jì)基本框架
基本UDP客戶—服務(wù)器程序設(shè)計(jì)基本框架流程圖
常用的Socket類型有兩種:流式Socket(SOCK_STREAM) 和數(shù)據(jù)報(bào)式Socket(SOCK_DGRAM)豌汇。流式是一種面向連接的Socket幢炸,針對于面向連接的TCP服務(wù)應(yīng)用;數(shù)據(jù)報(bào)式Socket是一種無連 接的Socket拒贱,對應(yīng)于無連接的UDP服務(wù)應(yīng)用宛徊。
socket調(diào)用庫函數(shù)主要有:
創(chuàng)建套接字
Socket(af,type,protocol)
建立地址和套接字的聯(lián)系
bind(sockid, local addr, addrlen)
服務(wù)器端偵聽客戶端的請求
listen( Sockid ,quenlen)
建立服務(wù)器/客戶端的連接 (面向連接TCP)
客戶端請求連接:
Connect(sockid, destaddr, addrlen)
服務(wù)器端等待從編號為Sockid的Socket上接收客戶連接請求
newsockid=accept(Sockid,Clientaddr, paddrlen)
發(fā)送/接收數(shù)據(jù)
面向連接:
send(sockid, buff, bufflen)
recv( )
面向無連接:
sendto(sockid,buff,…,addrlen)
recvfrom( )
釋放套接字:
close(sockid)
socket(套接字)是通信的基石逻澳,是支持TCP/IP協(xié)議的網(wǎng)絡(luò)通信的基本操作單元闸天,包含進(jìn)行網(wǎng)絡(luò)通信必須的五種信息:連接使用的協(xié)議,本地主機(jī)的IP地址斜做,本地進(jìn)程的協(xié)議端口苞氮,遠(yuǎn)地主機(jī)的IP地址,遠(yuǎn)地進(jìn)程的協(xié)議端口瓤逼。
多個(gè)TCP連接或多個(gè)應(yīng)用程序進(jìn)程可能需要通過同一個(gè)TCP協(xié)議端口傳輸數(shù)據(jù)笼吟。為了區(qū)別不同的應(yīng)用程序進(jìn)程和連接,計(jì)算機(jī)操作系統(tǒng)為應(yīng)用程序與TCP/IP協(xié)議交互提供了套接字(Socket)接口霸旗。應(yīng)用層可以和傳輸層通過Socket接口贷帮,區(qū)分來自不同應(yīng)用程序進(jìn)程或網(wǎng)絡(luò)連接的通信,實(shí)現(xiàn)數(shù)據(jù)傳輸?shù)牟l(fā)服務(wù)诱告。
建立Socket連接至少需要一對套接字撵枢,其中一個(gè)運(yùn)行于客戶端,稱為ClientSocket,另一個(gè)運(yùn)行于服務(wù)器端诲侮,稱為ServerSocket。套接字之間的連接過程分為三個(gè)步驟:服務(wù)器監(jiān)聽箱蟆,客戶端請求沟绪,連接確認(rèn)。
HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進(jìn)行加密傳輸空猜、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議要比http協(xié)議安全绽慈。
HTTPS(Secure Hypertext Transfer Protocol)安全超文本傳輸協(xié)議它是一個(gè)安全通信通道,它基于HTTP開發(fā)辈毯,用于在客戶計(jì)算機(jī)和服務(wù)器之間交換信息坝疼。它使用安全套接字層(SSL)進(jìn)行信息交換,簡單來說它是HTTP的安全版谆沃。
HTTPS和HTTP的區(qū)別:
(1)HTTP 是超文本傳輸協(xié)議钝凶,屬于明文傳輸協(xié)議,HTTPS 則是具有安全性的基于ssl加密的傳輸協(xié)議
(2)HTTP 和 HTTPS 使用的是連接方式不同唁影,而且用的端口也不一樣,前者是80,后者是443耕陷。
(3)HTTP 是簡單的無狀態(tài)的連接。HTTPS 協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進(jìn)行加密傳輸据沈、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議 要比 HTTP 協(xié)議安全
(4)HTTPS 內(nèi)容經(jīng)過對稱加密哟沫,每個(gè)連接生成一個(gè)唯一的加密密鑰(對稱秘鑰:對稱密鑰加密又叫專用密鑰加密,即發(fā)送和接收數(shù)據(jù)的雙方必使用相同的密鑰對明文進(jìn)行加密和解密運(yùn)算锌介。)
(5)HTTPS 內(nèi)容傳輸經(jīng)過完整性校驗(yàn)
(6)https協(xié)議需要到ca申請證書嗜诀,一般免費(fèi)證書很少,需要交費(fèi)孔祸,費(fèi)用大概與.COM域名差不多隆敢,每年需要交大約幾十元的費(fèi)用。而常見的http協(xié)議則沒有這一項(xiàng)融击;