計(jì)算機(jī)網(wǎng)絡(luò)的結(jié)構(gòu)是分層的遂黍,每層都有各種協(xié)議來規(guī)范俐填,關(guān)于互聯(lián)網(wǎng)的分層以及每一層的協(xié)議介紹請(qǐng)參考我的另外一篇文章:現(xiàn)代巴別塔(互聯(lián)網(wǎng))是怎么建成的安接。而TCP/IP是其中最重要的一個(gè)協(xié)議族,除了包括位于傳輸層的TCP/UDP協(xié)議和網(wǎng)絡(luò)接口層的IP/ARP協(xié)議之外英融,默認(rèn)還包括位于應(yīng)用層的http/Ftp/Telnet等協(xié)議盏檐。
TCP
1. TCP協(xié)議的定義
TCP(Transmission Control Protocol)協(xié)議是構(gòu)成整個(gè)互聯(lián)網(wǎng)傳輸協(xié)議的重要一部分,它位于網(wǎng)絡(luò)分層結(jié)構(gòu)的傳輸層驶悟。
其實(shí)糯笙,傳輸層的協(xié)議有兩種:TCP和UDP。但是UDP不能保證數(shù)據(jù)被準(zhǔn)確無誤的發(fā)送到目的地撩银,而TCP要求目標(biāo)主機(jī)在收到數(shù)據(jù)后發(fā)回一個(gè)確認(rèn),如果發(fā)送方在一定時(shí)間內(nèi)未收到確認(rèn)信息豺憔,則會(huì)重新發(fā)送數(shù)據(jù)包额获。因此,UDP發(fā)送速度更快恭应,TCP發(fā)送更可靠抄邀。
2. TCP協(xié)議實(shí)現(xiàn)的步驟
2.1 知識(shí)儲(chǔ)備
標(biāo)志位(SYN flag):
緊急指針(URGENT POINTER):立即處理不必排隊(duì)
確認(rèn)(ACKNOWLEDGEMENT):ACK=1表示確認(rèn)數(shù)據(jù)包成功接收
推送PUSH:關(guān)于優(yōu)先級(jí)
復(fù)位(RST)標(biāo)志
同步標(biāo)志(SYNCHRONISATION FLAG):SYN=1表示申請(qǐng)建立連接
FIN 標(biāo)志:拆除上一個(gè)標(biāo)志SYN建立的連接
ack(acknowledge) number:只有ACK=1時(shí)才有效,建立連接后發(fā)送報(bào)文的ACK必須為1.
seq(sequence) number
MSL(Maximum segment lifetime):報(bào)文最大生存時(shí)間
2.2 三次握手
三次握手即客戶端與服務(wù)端傳送的三個(gè)數(shù)據(jù)包
- 第一次握手:
客戶端發(fā)送數(shù)據(jù)包到服務(wù)端,其中將標(biāo)志位SYN置為1昼榛,發(fā)送順序號(hào)seq=x境肾。然后客戶端進(jìn)入SYN_SENT狀態(tài),等待服務(wù)器確認(rèn)
- 第二次握手:
服務(wù)端接收到數(shù)據(jù)包,根據(jù)標(biāo)志位SYN=1知道客戶端請(qǐng)求建立連接奥喻。服務(wù)端發(fā)送確認(rèn)數(shù)據(jù)包到客戶端偶宫,其中將標(biāo)志位ACK,SYN置為1环鲤,ack=x+1纯趋,seq=y。然后服務(wù)器進(jìn)入到SYN_RCVD狀態(tài)冷离。
- 第三次握手:
客戶端接收到來自服務(wù)端的確認(rèn)后吵冒,檢查ack是否為x+1,如果正確西剥,則發(fā)送數(shù)據(jù)包到服務(wù)端痹栖,其中ack=y+1。服務(wù)端檢查ACK是否是y+1,如果正確瞭空,則連接建立成功揪阿,客戶端和服務(wù)端同時(shí)進(jìn)入ESTABLISHED狀態(tài),完成三次握手匙铡。
2.3 數(shù)據(jù)傳輸
客戶端序列號(hào)seq=x+1图甜,ACK=Y+1,發(fā)送數(shù)據(jù)包給服務(wù)端,服務(wù)端收到后,ACK=y+2
2.4 四次揮手
- 第一次揮手:
客戶端發(fā)送一個(gè)數(shù)據(jù)包到服務(wù)器鳖眼,其中標(biāo)志位FIN=1黑毅,初始化序列號(hào)seq=u,同時(shí)客戶端進(jìn)入FIN_WAIT_1狀態(tài)。
- 第二次揮手:
服務(wù)端發(fā)回一個(gè)數(shù)據(jù)包給客戶器钦讳,其中ACK=1,ack number=u+1,序列號(hào)seq=v矿瘦。然后客戶端進(jìn)入FIN_WAIT_2狀態(tài),服務(wù)端進(jìn)入CLOSE_WAIT狀態(tài)愿卒。
- 第三次揮手:
服務(wù)端斷開與客戶端的鏈接缚去,發(fā)回客戶端一個(gè)數(shù)據(jù)包,其中FIN=1,ACK=1,seq=w,和ack number=u+1.服務(wù)器進(jìn)入LAST_ACK狀態(tài)
- 第四次揮手:
客戶端發(fā)送數(shù)據(jù)包到服務(wù)端琼开,其中ACK=1,ack number=w+1.客戶端進(jìn)入TIME_WAIT狀態(tài)易结,等待2MAL進(jìn)入close狀態(tài),服務(wù)器也進(jìn)入close狀態(tài)柜候。
Socket連接
socket是對(duì)TCP/IP協(xié)議的封裝成的接口搞动,方便程序員更方便的使用TCP/IP協(xié)議。不過需要注意的是socket可以基于TCP也可以基于UDP渣刷。socket連接的建立至少需要一對(duì)套接字:Client socket和Server socket
1. 連接過程
服務(wù)端監(jiān)聽
客戶端請(qǐng)求
連接確認(rèn)
特點(diǎn)
基于TCP的socket連接可能是長連接可能是短連接鹦肿,長連接需要定時(shí)發(fā)送心跳包來維持。
HTTP協(xié)議
超文本傳送協(xié)議(Hypertext Transfer Protocol )建立在TCP/IP基礎(chǔ)上辅柴,他的特點(diǎn)是客戶端發(fā)送的每次請(qǐng)求都需要服務(wù)端的響應(yīng)箩溃,請(qǐng)求結(jié)束后主動(dòng)釋放連接瞭吃,所以是一種短連接。
http的請(qǐng)求/響應(yīng)步驟
1. 客戶端連接到web服務(wù)器
客戶端與web服務(wù)器的HTTP端口(默認(rèn)80)建立一個(gè)TCP套接字連接
2. 客戶端發(fā)送HTTP請(qǐng)求
通過TCP套接字涣旨,客戶端向web服務(wù)器發(fā)送一個(gè)請(qǐng)求報(bào)文歪架。請(qǐng)求報(bào)文由請(qǐng)求行(request line),請(qǐng)求頭(header),空行和請(qǐng)求數(shù)據(jù)四部分組成开泽。如下圖
2.1 請(qǐng)求行
如圖所示牡拇,請(qǐng)求行由三個(gè)字段構(gòu)成:請(qǐng)求方法,URL穆律,HTTP協(xié)議版本惠呼。
其中HTTP協(xié)議的請(qǐng)求方法有GET、POST峦耘、HEAD剔蹋、PUT、DELETE辅髓、OPTIONS泣崩、TRACE、CONNECT
2.2 請(qǐng)求頭
請(qǐng)求頭由key:value的形式構(gòu)成洛口。比如
Content-Type:請(qǐng)求體/響應(yīng)體的類型
User-Agent:產(chǎn)生請(qǐng)求的瀏覽器類型矫付。
Accept:客戶端可識(shí)別的內(nèi)容類型列表。
Host:請(qǐng)求的主機(jī)名第焰,允許多個(gè)域名同處一個(gè)IP地址买优,即虛擬主機(jī)。
2.3 空行
發(fā)送回車符和換行符挺举,通知服務(wù)器以下不再有請(qǐng)求頭
2.4 請(qǐng)求數(shù)據(jù)
請(qǐng)求數(shù)據(jù)不在GET方法中使用杀赢,而是在POST方法中使用
3. 服務(wù)器接收請(qǐng)求并返回HTTP響應(yīng)
HTTP響應(yīng)報(bào)文也由四個(gè)部分組成,分別是:狀態(tài)行湘纵、消息報(bào)頭脂崔、空行和響應(yīng)正文.如下圖
4. 釋放連接
若connection 模式為close,則服務(wù)器主動(dòng)關(guān)閉TCP連接梧喷,客戶端被動(dòng)關(guān)閉連接砌左,釋放TCP連接;若connection 模式為keepalive,則該連接會(huì)保持一段時(shí)間铺敌,在該時(shí)間內(nèi)可以繼續(xù)接收請(qǐng)求
5. 客戶端解析HTML內(nèi)容
http與https的區(qū)別
HTTP傳輸?shù)臄?shù)據(jù)都是明文的绊困,未加密的,https通過SSL(Secure Sockets Layer)協(xié)議對(duì)數(shù)據(jù)進(jìn)行加密适刀。此處不再展開
End。