跟蹤瀏覽器輸入一個網址到最后瀏覽器展示出來一個濱才波瀾的網頁的過程基本就是 一次網絡協(xié)議的過程。
第一步:瀏覽器輸入網址螃成。
瀏覽器里面輸入一個URL ,其實就是相當于發(fā)送一次get請求去理解查坪。
一般正式環(huán)境我們?yōu)g覽器上輸入的都是域名寸宏,不是四段式IP。
當瀏覽器輸入url 按回車之后 偿曙,第一步就是 進行域名轉換IP氮凝。也叫 DNS解析過程。
- 瀏覽器會先詢問 操作系統(tǒng)的hosts 文件望忆,查看里面是否有域名和IP 的映射罩阵,如果有 直接拿來使用竿秆, 如果沒有瀏覽器會發(fā)起DNS請求,查找域名對應的IP稿壁。
- 瀏覽器會先向本地DNS服務器發(fā)起請求幽钢。(本地DNS服務器并不是本機的一個服務器,他也是一個服務器只是叫做本地DNS服務器傅是,也是個遠程的服務器匪燕。一般本地DNS服務器就是你介入的網絡的運營商的一個DNS服務器。默認我們在聯(lián)網的時候 DCHP為我們配置的DNS服務器地址叫做本地服務器喧笔。也可以自己配置)(DCHP谎懦,是一個協(xié)議,是指我們在聯(lián)網的時候溃斋,路由器利用這個協(xié)議自動我們電腦分配一個IP地址的協(xié)議)。
- 本地DNS服務器會先查看緩存吸申,看是之前查找過改域名的IP梗劫。如果沒有,本地DNS服務器會向根DNS服務器請求IP地址截碴,根DNS服務器會返回可以查到的IP地址的DNS服務器地址給你梳侨, 你在去請求該DNS服務器查詢IP。此過程輪詢直至找到最終的IP日丹。(DNS服務器器有個特點走哺,就是每一臺DNS服務器都存有根DNS服務器地址,上一級DNS服務器 存有下一級DNS服務器地址)哲虾。
第二步:查找完畢IP之后 丙躏,客戶端構造一個隨機端口發(fā)送請求。由于屬于HTTP(s)請求束凑,開始 TCP 建立連接過程和TLS握手過程晒旅。
- 三次握手
1⊥羲撸客戶端 發(fā)送 SYN 標志位為1废恋,seq序列號為隨機數(shù)Q1的同步請求 到服務器,請求建立連接扒寄∮愎模客戶端請求之前處于close 狀態(tài), 發(fā)送完畢SYN報文 之后處于 SYN-SEND 狀態(tài)该编。
2迄本。服務器在接收到SYN請求之前一直處于listening 狀態(tài)。接收到SYN 報文之后 處于 SYN-RECEVIED狀態(tài)上渴。并發(fā)送 SYN 標志位為1岸梨,seq序列號為數(shù)據(jù)數(shù)的Q2喜颁,ACK標志位為1 ack 確認號為 Q1+1 的報文給客戶端作為回復。
3曹阔。 客戶端 在接收到 服務器返回的ACK 報文之后半开。 再給服務器回復一個ACK 標志位為1 ,ack 確認號為 Q2+1 ,SEQ 標志位雖為0赃份,但是seq 序列號為 Q1+1的確認報文寂拆。
注釋: 客戶端第一次握手發(fā)給服務端的Q1 和 服務端第二次握手發(fā)給客戶端的Q2 ,兩次序列號是不同的抓韩,為啥需要倆隨機數(shù)纠永,理解為:客戶端發(fā)給服務端的消息用Q1, 服務端發(fā)給客戶端的用Q2。 這倆值是不一樣的谒拴。
每次報文的seq 序列號代表的含義是 我本次發(fā)送的消息是我整體消息的第幾個編號位置+我的隨機數(shù)序列號(編號概念是指:一個消息可能過大尝江,分成兩次發(fā)送,第一次發(fā)送0-100 字節(jié)英上, 第二次發(fā)送的時候就是100-200字節(jié)炭序。為了標記我是哪個消息,把消息編號了苍日。)
每次報文的ack 序列號的值的概念 是值 我收到了消息惭聂,并且希望你下次發(fā)送過來的消息的開始編號是多少,這里是希望對方發(fā)送過來的編號相恃,所以ack得值都是對方的seq隨機數(shù)的+接收到的消息的位置辜纲。
問題:為啥三次握手?
答案:為了 保證傳輸?shù)目煽啃浴4_保建立了連接拦耐。需要三次握手耕腾,如果只要兩次握手, 最后一次客戶端到服務端的ACK 確認握手不發(fā)送揩魂∮牡耍可能會造成服務器資源浪費。eg:我第一次發(fā)送的SYN 報文火脉,如果網絡比較慢超時了牵舵,我客戶端會重發(fā)消息給服務端,這次重發(fā)的來得快倦挂。然后服務器直接發(fā)送個ACK 就建立了連接畸颅。 然后過了一會 那條超時的SYN消息來到了服務器。服務器 沒法區(qū)分你這次SYN 報文 方援。是我發(fā)的ACK報文你沒接到没炒。還是說 是 之前超時的報文。我就只能再ACK 消息給客戶端犯戏。
第三步:建立完TCP 鏈接 送火。建立TLS 鏈接拳话。(https)
1 . 客戶端發(fā)送client hello 到服務器 交換信息 (包括客戶端支持的加密算法)。
- 服務器發(fā)送 選擇的加密算法种吸,https數(shù)字證書等信息到客戶端弃衍。
- 客戶端校驗https 數(shù)字證書。
- 根據(jù)加密算法選擇方式 構造加密秘鑰坚俗。
- finsh.驗證下加密秘鑰镜盯。
數(shù)字證書簡單介紹:
CA或者自簽名的 一個文件。包含了 簽發(fā)機構猖败,域名速缆,非對稱加密的公鑰 等信息。證書校驗是指 在證書尾部攜帶了一個MD5的摘要信息恩闻,用CA機構的私鑰加密的艺糜,CA 機構的公鑰是配置在瀏覽器里面的,用這個公鑰解密得到摘要幢尚,和證書本身計算出來的摘要丟比倦踢。一樣就是沒有被篡改。從證書得到的非對稱加密的公鑰可以放心使用侠草。
非對稱機密:一對公鑰私鑰,私鑰加密犁嗅,公鑰解密边涕,公鑰加密,私鑰解密褂微。:RSA等
對稱加密: 公鑰功蜓,私鑰是一個。 DES 3DES宠蚂,AES式撼。
摘要:MD5, SHA 算法求厕。不可逆著隆。
具體知識 自學。
TSL 交互過程 計算對稱加密秘鑰過程呀癣。
1,老的方式是從數(shù)字證書拿到非對稱加密公鑰美浦。客戶端生成對稱加密秘鑰AES项栏,用非對稱加密公鑰進行加密 發(fā)送給服務器浦辨,服務器用私鑰解密得到對稱機密秘鑰。
- 新的方式沼沈, 可以采用一些算法流酬, 客戶端和服務器 各自計算出來 秘鑰過程币厕。一些參數(shù) 就算在網絡上傳遞 也不怕 秘鑰被篡改。eg DH算法芽腾,DCEH算法旦装。都不在用老的方式了。
第四步晦嵌,TLS建立連接之后同辣,就可以發(fā)送HTTP請求了。 構造HTTP 報文發(fā)送到 傳輸層構造TCP 首部信息 拼接上端口惭载。
第五步 將 傳輸層數(shù)據(jù)發(fā)送到網絡層 旱函。 拼接網絡層首部 源ip地址 目標IP地址。
第六步,將 網絡層IP數(shù)據(jù)發(fā)送到數(shù)據(jù)鏈路層描滔,構造鏈路層首部和尾部FCS棒妨。首部包括源MAC地址和目標mac地址。
注釋:在這一步 我們通常是把信息先發(fā)給路由器含长。所以 目標MAC地址 先路由器的mac地址券腔, 采用ARP 協(xié)議,發(fā)廣播尋找mac地址拘泞,之后發(fā)送到路由器纷纫。
路由器和路由器之間是 PPP協(xié)議, 不攜帶目標mac 和源mac地址陪腌。點對點發(fā)送消息 不需要目標mac地址辱魁。不在尋址了。
第七步诗鸭。數(shù)據(jù)鏈路層 發(fā)送到物理層 將消息發(fā)送到服務器染簇。
第八步 服務器接收到消息 層層解析。最后轉發(fā)到 服務器java代碼上去强岸。
第九步锻弓,四次分手。斷開連接蝌箍。
1.發(fā)送端 發(fā)送finish 報文到接收端青灼。 表達 我沒什么消息要發(fā)給你了。 我這邊不會再給你發(fā)消息了妓盲。 我要請求斷開連接聚至。發(fā)送完畢處于 finish-wait1
2.接收端 收到了消息,發(fā)送一個ACK 確認報文本橙,告知發(fā)送端扳躬,我知道了。但是我還有些消息要發(fā),我先發(fā)完贷币。
3,接收端發(fā)完消息之后 在發(fā)送個 finish報文击胜,表達 我也沒什么消息 了。
4.發(fā)送端 在接收到 接收端發(fā)送的“第2步”的ACK 確認報文役纹。處于 finish-wait2階段偶摔。
5.在接受到 第三步的finish 報文之后 ,發(fā)送個ACK 報文 到接受端告知我知道了 關閉連接促脉。然后處于 time-wait 階段辰斋, 等待2TTA時間。然后關閉連接瘸味。
為什么四次分手宫仗。
答: 因為 分手的時候屬于雙向通信。發(fā)送finish 消息 只是表示 我沒什么發(fā)送給你了旁仿, 但是 我還可接受消息藕夫,可能對方還可能發(fā)消息給你。所以需要四次枯冈。接收方發(fā)送完消息之后 毅贮,在發(fā)送一個finish 報文告訴發(fā)送方 我也沒什么發(fā)給你了, 咱么斷開連接吧尘奏。才真正斷開連接滩褥。
為什么最后一步發(fā)送方需要等待2個TTA時間?
答: 為了防止此次發(fā)送的報文 丟包炫加。如果2個tta時長過去 都沒有收到服務器消息铸题, 就代表 服務器收到了我 最后的確認報文。