TCP/IP
什么是TCP/IP?
簡單來說,計算機和網(wǎng)絡(luò)設(shè)備實現(xiàn)通信鸠天,雙方必須約定好一個規(guī)則,這中規(guī)則統(tǒng)稱為協(xié)議帐姻。當(dāng)然TCP/IP是這種規(guī)則的統(tǒng)稱稠集。
TCP/IP 的分層管理奶段?
四個層次:應(yīng)用層、傳輸層剥纷、網(wǎng)絡(luò)層痹籍、數(shù)據(jù)鏈路層
分層的好處:如果互聯(lián)網(wǎng)是由一個協(xié)議統(tǒng)稱,那么當(dāng)一個地方需要更改設(shè)計晦鞋,需要將整體部分替換掉词裤。而分層只需把變動的層次替換掉即可。并且分層之后設(shè)計也會變得簡單鳖宾,處于應(yīng)用層的只考慮處理自己的任務(wù)即可吼砂。
向頁面請求數(shù)據(jù)HTTP發(fā)生了什么?
首先客戶端處于應(yīng)用層(HTTP)發(fā)送一個Web頁面的HTTP請求鼎文。
接著為了方便傳輸會在傳輸層TCP中把從應(yīng)用層收到的數(shù)據(jù)(HTTP請求報文) 進行分隔渔肩,并且在報文上打上標(biāo)記號、端口號轉(zhuǎn)發(fā)給網(wǎng)絡(luò)層拇惋。
在網(wǎng)路層(IP)周偎,增加作為通信目的地的MAC地址后轉(zhuǎn)發(fā)給鏈路層。
接受服務(wù)器端的鏈路層接收到數(shù)據(jù)后會按序?qū)酉蛏蠈影l(fā)送撑帖,一直到應(yīng)用層蓉坎。
TCP/IP四個層級的作用?
應(yīng)用層:決定了向用戶提供應(yīng)用服務(wù)的通信活動胡嘿。其中包含F(xiàn)TP傳輸協(xié)議蛉艾、DNS域名服務(wù)協(xié)議、HTTP衷敌。
傳輸層:主要提供處于網(wǎng)絡(luò)連接中的兩臺計算機中間的數(shù)據(jù)傳輸勿侯。發(fā)送數(shù)據(jù)包到計算機使用特定端口號的應(yīng)用程序。主要包含UDP和TCP
網(wǎng)絡(luò)層:主要處理在網(wǎng)絡(luò)上流動的數(shù)據(jù)包(網(wǎng)絡(luò)傳輸?shù)淖钚挝唬┙陕蕖H绻嬎銠C之間通過多臺計算機或者網(wǎng)絡(luò)進行傳輸助琐,網(wǎng)絡(luò)層就是在眾多選項之間選擇一條傳輸路線。
鏈路層:主要是處理鏈接網(wǎng)絡(luò)的硬件部分面氓,將二進制數(shù)據(jù)包與網(wǎng)絡(luò)信號相互交換兵钮。
TCP的三次握手?
簡單的來說舌界,發(fā)送端首先發(fā)送一個帶SYN(同步序號掘譬,請求建立連接,并在其序列號的字段進行序列號的初始值設(shè)定禀横,建立鏈接設(shè)為1)標(biāo)志的數(shù)據(jù)包給對方屁药。接受端收到后粥血,回傳一個帶有SYN/ACK(確認號是否有效柏锄,一般設(shè)置為1)標(biāo)志的數(shù)據(jù)包以示傳達確認的消息酿箭。最后發(fā)送端在回傳一個帶有ACK標(biāo)志的數(shù)據(jù)包。
詳細圖解:
PS:ACK趾娃、SYN和FIN這些大寫的單詞表示標(biāo)志位缭嫡,其值要么是1,要么是0抬闷;ack妇蛀、seq小寫的單詞表示序號。
確認ACK:占1位笤成,僅當(dāng)ACK = 1時评架,確認號字段才有效。ACK=0時炕泳,確認號無效纵诞。
確認號ack:占4個字節(jié),期待收到對方下一個報文段的第一個數(shù)據(jù)字節(jié)的序號培遵;序列號表示報文段攜帶數(shù)據(jù)的第一個字節(jié)的編號浙芙;而確認號指的是期望接收到下一個字節(jié)的編號;因此當(dāng)前報文段最后一個字節(jié)的編號+1即為確認號籽腕。
同步SYN:建立連接時用于同步序號嗡呼。當(dāng)SYN=1,ACK=0時表示:這是一個建立請求報文段皇耗,如果同意鏈接南窗,則在相應(yīng)報文中使得SYN=1,ACK=1郎楼。因此SYN=1表示這是一個連接請求或者接受報文請求矾瘾。SYN只有在TCP建立連接的時候才會被置位1,握完手后SYN被置位0
確認號seq:占4個字節(jié)箭启,用來標(biāo)記數(shù)據(jù)段的順序壕翩,TCP把連接中發(fā)送的所有數(shù)據(jù)字節(jié)都編上一個序號,第一個字節(jié)的編號由本地隨機產(chǎn)生傅寡;給字節(jié)編上序號后放妈,就給每一個報文段指派一個序號;序列號seq就是這個報文段中的第一個字節(jié)的數(shù)據(jù)編號荐操。
第一次握手:建立鏈接,客戶端發(fā)送SYN=1的數(shù)據(jù)包到服務(wù)器芜抒,進入SYN_SENT狀態(tài),等待服務(wù)器確認托启;
第二次握手:服務(wù)器接收到SYN=1的數(shù)據(jù)包后宅倒,必須確認用戶的SYN即ack=x+1,同時自己也會發(fā)出一個SYN(seq=y),即SYN+ACK包屯耸,此時服務(wù)器進入SYN_RECV狀態(tài)拐迁;
第三次握手:客戶端收到服務(wù)器的SYN+ACK包蹭劈,向服務(wù)器發(fā)送確認包ACK(ack=y+1),此時包發(fā)送完畢,客戶端和服務(wù)端進入ESTABLISHED(TCP連接成功~)狀態(tài)线召,完成三次握手铺韧。
四次握手?
終止FIN:用來釋放一個連接缓淹。FIN=1表示:此報文段的發(fā)送方的數(shù)據(jù)已經(jīng)發(fā)送完畢哈打,并要求釋放運輸連接
理解:
第一次握手:客戶端進程發(fā)出連接釋放報文,并且停止發(fā)送數(shù)據(jù)讯壶。釋放數(shù)據(jù)報文首部料仗,F(xiàn)IN=1,其序列號為seq=u(TCP規(guī)定伏蚊,F(xiàn)IN即使不攜帶數(shù)據(jù)罢维,也要消耗一個序號)。
第二次握手:服務(wù)器收到連接釋放報文丙挽,發(fā)出確認報文肺孵,ACK=1,ack=u+1颜阐,并且?guī)献约旱男蛄刑杝eq=v平窘,此時,服務(wù)端就進入了CLOSE-WAIT(關(guān)閉等待)狀態(tài)凳怨。TCP服務(wù)器通知高層的應(yīng)用進程瑰艘,客戶端向服務(wù)器的方向就釋放了,這時候處于半關(guān)閉狀態(tài)肤舞,即客戶端已經(jīng)沒有數(shù)據(jù)要發(fā)送了紫新,但是服務(wù)器若發(fā)送數(shù)據(jù),客戶端依然要接受李剖。這個狀態(tài)還要持續(xù)一段時間芒率,也就是整個CLOSE-WAIT狀態(tài)持續(xù)的時間。
之后
客戶端收到服務(wù)器端的確認請求后篙顺,此時偶芍,客戶端就進入到FIN-WAIT-2(終止等待2)狀態(tài),等待服務(wù)器發(fā)送鏈接釋放報文德玫,
第三次握手:服務(wù)器將最后的數(shù)據(jù)發(fā)送完畢匪蟀,向客戶端發(fā)送關(guān)閉連接釋放報文,F(xiàn)IN=1宰僧,ack=u+1材彪,由于在半關(guān)閉狀態(tài),服務(wù)器很可能又發(fā)送了一些數(shù)據(jù),假定此時的序列號為seq=w段化,此時嘁捷,服務(wù)器就進入了LAST-ACK(最后確認)狀態(tài),等待客戶端的確認穗泵。
第四次握手:客戶端收到服務(wù)器的鏈接釋放后普气,必須發(fā)送確認ACK=1谜疤,ack=w+1, seq=u+1佃延,此時,客戶端就進入了TIME-WAIT(時間等待)狀態(tài)夷磕。注意此時TCP連接還沒有釋放履肃,必須經(jīng)過2MSL(最長報文段壽命)的時間后,當(dāng)客戶端撤銷相應(yīng)的TCB后坐桩,才進入CLOSED狀態(tài)尺棋。
最后
服務(wù)器只要收到了客戶端發(fā)出的確認,立即進入CLOSED狀態(tài)绵跷。同樣膘螟,撤銷TCB后,就結(jié)束了這次的TCP連接碾局【2校可以看到,服務(wù)器結(jié)束TCP連接的時間要比客戶端早一些净当。
為什么連接的時候是三次握手内斯,關(guān)閉的時候卻是四次握手?
因為服務(wù)端收到客戶端的SYN鏈接請求報文后像啼,可以直接發(fā)送SYN+ACK報文俘闯。其中ACK報文是用來應(yīng)答的,SYN報文是用來同步的忽冻。
關(guān)閉連接時真朗,當(dāng)服務(wù)端收到FIN報文時,很可能并不會立即關(guān)閉SOCKET僧诚,所以只能先回復(fù)一個ACK報文蜜猾,告訴Client端,"你發(fā)的FIN報文我收到了"振诬。只有等到我Server端所有的報文都發(fā)送完了蹭睡,我才能發(fā)送FIN報文,因此不能一起發(fā)送赶么。故需要四步握手肩豁。
為什么不能用兩次握手進行連接?
三次握手完成了兩個重要的功能,既要雙方做好發(fā)送數(shù)據(jù)的準備工作清钥,也要允許雙方就初始化序列號進行協(xié)商琼锋,進而需要發(fā)送和確認。
現(xiàn)在把三次握手改成僅需要兩次握手祟昭,死鎖是可能發(fā)生的缕坎。
DNS域名解析?
DNS(Domain Name System)服務(wù)是和 HTTP 協(xié)議一樣位于應(yīng)用層的協(xié)議篡悟。它提供域名到 IP 地址之間的解析服務(wù)谜叹。
當(dāng)輸入域名的時候,瀏覽器首先鏈接的是DNS服務(wù)器搬葬,獲取到該域名的IP地址后荷腊,瀏覽器再連接訪問該IP的服務(wù)器。
1急凰、 輸入域名的時候女仰,操作系統(tǒng)會檢查自己本地hosts文件中是否有這個網(wǎng)址映射關(guān)系,如果有抡锈,直接返回疾忍。
2、 如果hosts里沒有這個域名的映射床三,則會查找本地DNS解析器緩存一罩,是否有這個網(wǎng)址映射關(guān)系,如果有勿璃,直接返回擒抛,完成域名解析。
3补疑、 如果hosts與本地DNS解析器緩存都沒有相應(yīng)的網(wǎng)址映射關(guān)系歧沪,首先會找TCP/IP參數(shù)中設(shè)置的首選DNS服務(wù)器,在此我們叫它本地DNS服務(wù)器莲组,此服務(wù)器收到查詢時诊胞,如果要查詢的域名,包含在本地配置區(qū)域資源中锹杈,則返回解析記過給客戶端撵孤,完成域名解析,此解析具有權(quán)威性竭望。
4邪码、 如果要查詢域名,不由本地DNS服務(wù)器區(qū)域解析咬清,但該服務(wù)器已緩存了此網(wǎng)址映射關(guān)系闭专,則調(diào)用這個IP地址映射奴潘,完成域名解析,此解析不具有權(quán)威性影钉。
5画髓、 如果本地DNS服務(wù)器本地區(qū)域文件與緩存解析都失效,則根據(jù)本地DNS服務(wù)器的設(shè)置(是否設(shè)置轉(zhuǎn)發(fā)器)進行查詢平委,如果未用轉(zhuǎn)發(fā)模式奈虾,本地DNS就把請求發(fā)至13臺根DNS,根DNS服務(wù)器收到請求后會判斷這個域名(.com)是誰來授權(quán)管理廉赔,并會返回一個負責(zé)該頂級域名服務(wù)器的一個IP肉微。本地DNS服務(wù)器收到IP信息后,將會聯(lián)系負責(zé).com域的這臺服務(wù)器昂勉。這臺負責(zé).com域的服務(wù)器收到請求后浪册,如果自己無法解析扫腺,它就會找一個管理.com域的下一級DNS服務(wù)器地址(baidu.com)給本地DNS服務(wù)器岗照。當(dāng)本地DNS服務(wù)器收到這個地址后,就會找baidu.com域服務(wù)器笆环,重復(fù)上面的動作攒至,進行查詢,直至找到www.baidu.com主機躁劣。
6迫吐、 如果用的是轉(zhuǎn)發(fā)模式,此DNS服務(wù)器就會把請求轉(zhuǎn)發(fā)至上一級DNS服務(wù)器账忘,由上一級服務(wù)器進行解析志膀,上一級服務(wù)器如果不能解析,或找根DNS或把請求轉(zhuǎn)至上上級鳖擒,以此循環(huán)溉浙。不管是本地DNS服務(wù)器用是轉(zhuǎn)發(fā),還是根提示蒋荚,最后都是把結(jié)果返回給本地DNS服務(wù)器戳稽,由此DNS服務(wù)器再返回給客戶機。