[{"data":1,"prerenderedAt":353},["ShallowReactive",2],{"content:\u002F2021\u002Fdns-and-tcp":3,"surround:\u002F2021\u002Fdns-and-tcp":342},{"id":4,"title":5,"body":6,"categories":315,"date":317,"description":300,"draft":318,"extension":319,"image":20,"meta":320,"navigation":322,"path":323,"permalink":324,"published":324,"readingTime":325,"recommend":324,"references":324,"seo":330,"sitemap":331,"stem":336,"tags":337,"type":340,"updated":324,"__hash__":341},"content\u002Fposts\u002F2021\u002Fdns-and-tcp.md","DNS 与 TCP",{"type":7,"value":8,"toc":299},"minimark",[9,13,21,25,41,51,54,80,83,99,103,121,126,129,166,169,184,194,198,203,242,245,249,254,257,261,266,277,281,284,288],[10,11,12],"h2",{"id":12},"一图概览",[14,15,16],"p",{},[17,18],"img",{"alt":19,"src":20},"image.png","\u002Fimages\u002Fdns-and-tcp\u002F01.jpg",[10,22,24],{"id":23},"dns-hosts","DNS & hosts",[14,26,27,28,32,33,36,37,40],{},"DNS，全称：",[29,30,31],"strong",{},"D","omain ",[29,34,35],{},"N","ame ",[29,38,39],{},"S","ystem，中文：域名系统",[42,43,44],"blockquote",{},[14,45,46,47,50],{},"域名系统本身的原理是比较复杂的，但域名系统的功能很简单，就是",[29,48,49],{},"输入一个域名，输出一个 IP","，这里我们只对 DNS 做简单讨论",[14,52,53],{},"举例说明：",[55,56,57,61,64,71,74],"ol",{},[58,59,60],"li",{},"在浏览器输入 baidu.com 这个地址",[58,62,63],{},"浏览器需要知道你访问的这个地址对应的 IP 是多少，于是浏览器就会去问操作系统",[58,65,66,67,70],{},"如果操作系统也不知道，就会去问电信、移动、联通这样的",[29,68,69],{},"网络运行商","（以下简称 ISP）",[58,72,73],{},"当你付费之后，网络运营商就会告诉你 baidu.com 这个地址对应的 IP 是多少（假设这里 baidu.com 对应的 IP 是 1.2.3.4），然后将 IP 返回给你",[58,75,76,77],{},"浏览器获取到 baidu.com 对应的 IP 之后，就会与 1.2.3.4 这个 IP ",[29,78,79],{},"建立 TCP 连接",[14,81,82],{},"细化过程：",[55,84,85,88,91],{},[58,86,87],{},"在浏览器输入 baidu.com 这个地址的时候，浏览器首先会去检查自身是否有缓存，如果发现之前访问过 baidu.com ，那么浏览器就会直接将上一次的 IP 进行返回",[58,89,90],{},"如果浏览器没有缓存，就回去询问操作系统，然后操作系统首先也是会检查自身是否有缓存，如果没有就会去询问 ISP（网络运行商）",[58,92,93,94,98],{},"平时我们修改 hosts 这个文件，其实就是在手动给操作系统设置缓存，比如我们在 hosts 中写入",[95,96,97],"code",{"code":97},"baidu.com 2.3.4.5","，以后每次访问 baidu.com 这个地址的时候就不会再去询问 ISP 了，直接会通过 hosts 中的设置去访问 2.3.4.5 这个 IP",[10,100,102],{"id":101},"tcp-三次握手","TCP 三次握手",[14,104,105,106,109,110,113,114,117,118],{},"TCP 全称：",[29,107,108],{},"T","ransmission ",[29,111,112],{},"C","ontrol ",[29,115,116],{},"P","rotocol，即",[29,119,120],{},"传输控制协议",[14,122,123],{},[17,124],{"alt":19,"src":125},"\u002Fimages\u002Fdns-and-tcp\u002F02.png",[14,127,128],{},"假设 A 是浏览器，B 是服务器",[55,130,131,143,159],{},[58,132,133,134,137,138],{},"A 首先会向 B 发送一个叫做",[95,135,136],{"code":136},"SYN(x)","（假设这里 x = 100）的信息",[42,139,140],{},[14,141,142],{},"SYN 是 synchronize(同步) 的缩写，同步不是指「同步异步」中的同步，而是「同步信息」中的同步；这里的 x 一般是一个数字编号，且 x 和 y 一般都是从 0 开始的，这里我们对 x 和 y 的意义不做讨论，有兴趣的请自行研究",[58,144,145,146,149,150,153,154],{},"B 收到 A 发来的同步信息后，就会返回",[95,147,148],{"code":148},"ACK(x+1)","（101） ",[95,151,152],{"code":152},"SYN(y)","（这里假设 y = 200）",[42,155,156],{},[14,157,158],{},"ACK 是 acknowledge(知道) 的缩写",[58,160,161,162,165],{},"然后 A 会回复消息 ",[95,163,164],{"code":164},"ACK(y+1)","（201）给 B",[14,167,168],{},"从以上过程中能够确保以下几件事：",[170,171,172,175,178,181],"ul",{},[58,173,174],{},"A 可以向 B 发送信息",[58,176,177],{},"B 能收到 A 发送的信息",[58,179,180],{},"B 也可以向 A 发送信息",[58,182,183],{},"A 也能收到 B 发送的信息",[14,185,186,189,190,193],{},[29,187,188],{},"三次握手成功后","就开始建立 TCP 连接了，建立连接后就可以开始",[29,191,192],{},"传输内容","了（一般是 HTTP 内容，也可以是其他内容，且传输的过程也可以是双向的，并非一定是单向的），HTTP 内容传输结束后，就会「关闭」",[10,195,197],{"id":196},"tcp-四次挥手","TCP 四次挥手",[14,199,200],{},[17,201],{"alt":19,"src":202},"\u002Fimages\u002Fdns-and-tcp\u002F03.png",[55,204,205,216,226,237],{},[58,206,207,208,211],{},"上述内容传输完成后，A 会发送一个",[95,209,210],{"code":210},"FIN(x)",[42,212,213],{},[14,214,215],{},"注意：不一定是 A 先发送 FIN，也可以是 B 先发送",[58,217,218,219,221],{},"B 先回复",[95,220,148],{"code":148},[42,222,223],{},[14,224,225],{},"注意：关闭时的 x 和 y 一般都不是 0",[58,227,228,229,232],{},"然后再回复",[95,230,231],{"code":231},"FIN(y)",[42,233,234],{},[14,235,236],{},"步骤 2 和步骤 3 中间可能会夹杂着其他内容",[58,238,239,240],{},"A 回复",[95,241,164],{"code":164},[14,243,244],{},"最后，A 和 B 各自关闭自己的 TCP 连接",[10,246,248],{"id":247},"一些-q-a","一些 Q & A",[250,251,253],"h3",{"id":252},"为什么需要关闭-tcp-连接","为什么需要关闭 TCP 连接？",[14,255,256],{},"因为一直保持连接会浪费内存和 CPU",[250,258,260],{"id":259},"tcp-和-udp-的区别是什么","TCP 和 UDP 的区别是什么？",[42,262,263],{},[14,264,265],{},"八股文，面试必背",[170,267,268,271,274],{},[58,269,270],{},"TCP 面向连接有状态，UDP 无状态",[58,272,273],{},"TCP 可靠（不丢失不重复），UDP 不可靠",[58,275,276],{},"TCP 传输效率较低，UDP 较高",[250,278,280],{"id":279},"为什么-tcp-的三次握手不能精简为两次","为什么 TCP 的三次握手不能精简为两次？",[14,282,283],{},"为了确保客户端（A端）能接收到服务端（B端）的数据（只有两次的话，无法判断 A 是否能接收到 B 的数据）",[250,285,287],{"id":286},"为什么-tcp-的四次挥手不能将中间两步合并成一步","为什么 TCP 的四次挥手不能将中间两步合并成一步？",[14,289,290,291,293,294,296,297],{},"因为两步中间（指发送",[95,292,148],{"code":148},"和",[95,295,231],{"code":231},"之间）往往会有其他数据需要发送，需要等其他数据发送完成之后，再发送",[95,298,231],{"code":231},{"title":300,"searchDepth":301,"depth":301,"links":302},"",4,[303,305,306,307,308],{"id":12,"depth":304,"text":12},2,{"id":23,"depth":304,"text":24},{"id":101,"depth":304,"text":102},{"id":196,"depth":304,"text":197},{"id":247,"depth":304,"text":248,"children":309},[310,312,313,314],{"id":252,"depth":311,"text":253},3,{"id":259,"depth":311,"text":260},{"id":279,"depth":311,"text":280},{"id":286,"depth":311,"text":287},[316],"学习笔记","2021-08-20",false,"md",{"comments":318,"slots":321},{},true,"\u002F2021\u002Fdns-and-tcp",null,{"text":326,"minutes":327,"time":328,"words":329},"6 min read",5.11,306600,1022,{"title":5,"description":300},{"loc":323,"images":332},[333,334,335],{"loc":20},{"loc":125},{"loc":202},"posts\u002F2021\u002Fdns-and-tcp",[338,339],"DNS","TCP","tech","qe3lAKoaF7Q3CcBqpUWihKqg9oOnyYnwlCOWLZmwVmE",[343,348],{"title":344,"path":345,"stem":346,"date":347,"type":340,"children":-1},"浅析 Promise、Async\u002FAwait","\u002F2021\u002Fpromise-async-await","posts\u002F2021\u002Fpromise-async-await","2021-08-17",{"title":349,"path":350,"stem":351,"date":352,"type":340,"children":-1},"AST、Babel、依赖","\u002F2022\u002Fast-and-babel-and-dependencies","posts\u002F2022\u002Fast-and-babel-and-dependencies","2022-03-15",1793699839749]