如果你想拥有你从未拥有过的东西,那么你必须去做你从未做过的事情
对于一名合格的运维工程师而言,网络相关知识是必不可少的。尽管在实际工作中,不一定需要对网络设备(如交换机、路由器等)进行配置,但对于 IP 地址、子网掩码、网关、OSI 七层模型、DNS 解析流程以及 TCP 的三次握手和四次挥手等相关知识,还是需要有所了解的。接下来,我将分两章对这些相关知识进行阐述~~~
目录
为什么TCP建立连接只需要三次握手,但是断开连接需要四次挥手?
💬欢迎交流:在学习过程中如果你有任何疑问或想法,欢迎在评论区留言,我们可以共同探讨学习的内容。你的支持是我持续创作的动力!
👍点赞、收藏与推荐:如果你觉得这篇文章对你有所帮助,请不要忘记点赞、收藏,并分享给更多的小伙伴!你们的鼓励是我不断进步的源泉!
🚀推广给更多人:如果你认为这篇文章对你有帮助,欢迎分享给更多对Linux感兴趣的朋友,让我们一起进步,共同提升!
网络七层模型:
网络的OSI是七层分别是,应用层,表示层,会话层,传输层,网络层,数据链路层,物理层;
TCP模型则只有四层:应用层(应用层,表示层,会话层,传输层并称为应用层),网络层,数据链路层,物理层
那么他们都有什么作用呢?
#应用层:给应用程序提供端口,协议
#表示层:数据的编码和解码,加密和解密,压缩和解压缩
#会话层:维护,管理程序之间的会话
#传输层:端到端的连接tcp和udp
#网络层:ip地址,网络的路由和寻址
#数据链路层:帧从一跳到另一跳
#物理层:比特从一跳到另一跳;单工,半双工,全双工;网络拓扑图
DNS解析:
DNS解析
互联网主要是通过 IP 地址(如 IPv4 地址:192.168.1.1 或 IPv6 地址:2001:0db8:85a3:0000:0000:8a2e:0370:7334)来识别和定位网络上的设备。然而,这些 IP 地址很难被人们记忆。DNS 的主要功能就是将人们便于记忆的域名(如www.example.com)转换为计算机能够理解的 IP 地址。当你在浏览器中输入 “www.baidu.com” 时,你的计算机就会向 DNS 服务器发送一个请求,询问这个域名对应的 IP 地址是多少。DNS 服务器查询后,将百度服务器的 IP 地址返回给你的计算机,这样你的计算机就能与百度的服务器建立连接并获取网页内容。
最高层是根 DNS 服务器,全球共有 13 个根 DNS 服务器(从 A.root - servers.net到 M.root - servers.net)。它们主要负责引导查询请求到下一级的顶级域名(TLD)服务器。顶级域名服务器负责管理像.com、.org、.net 等顶级域名相关的信息。然后还有权威 DNS 服务器,这些服务器由各个域名的所有者(如网站管理员)维护,包含了特定域名(如example.com)下具体主机(如www.example.com)的 IP 地址信息。
DNS解析流程:
1.浏览器输入www.baidu.com 查询浏览器缓存 有返回IP 没有则查询本地的HOSTS
2.如果HOSTS有返回IP 如果没有继续查询本地的DNS
3.本地DNS一般是我们自己配置的比如223.5.5.5 8.8.8 114.114.114.114,查询本地DNS是否有对应的IP 如果有返回给浏览器 如果没有则查询.根服务器
4.根服务器不存储域名解析,会给LDNS返回顶级域.com的服务器IP地址
5.LDNS重新请求.com域名服务器 .com不存在域名解析 .com会返回权威域名服务器的IP地址给LDNS
6.LDNS重新请求baidu.com权威域名服务器,权威域名服务器就是我们自己配置的A记录解析,将A记录对应的IP地址返回给LDNS
7.LDNS拿到后自己缓存一份 返回给浏览器一份
8.浏览器和拿到的百度服务器IP地址建立连接
A记录和cname
A 记录(Address Record)
A 记录是 DNS(域名系统)中的一种记录类型,用于将域名直接映射到一个 IPv4 地址。例如,当你有一个域名 “example.com”,通过 A 记录可以指定这个域名对应的服务器的 IPv4 地址,如 “192.168.1.100”。这就像是给一个人(域名)直接分配了一个具体的家庭住址(IP 地址),当访问这个域名时,计算机直接根据这个记录找到对应的 IP 地址来建立连接。
CNAME 记录(Canonical Name Record)
CNAME 记录是一种别名记录。它将一个域名(别名)指向另一个域名(通常是规范域名),而不是直接指向 IP 地址。例如,你有一个域名 “www.example.com”,通过 CNAME 记录可以将它指向 “example.com”,而 “example.com” 可能通过 A 记录或者其他方式再指向实际的 IP 地址。这就好比一个人(域名)有一个昵称(别名),这个昵称最终还是指向这个人的真实姓名(规范域名),然后再通过真实姓名找到其家庭
简单来说A记录就是将域名解析成IP,cname就是将IP解析成域名
建立连接三次握手(面试题)
1.A向B发起syn请求并且发送一个序号seq=x
2.B收到确认信息ACK=1,并且也发送一个syn=1的请求,并且发送第一个数据包seq=y,并且发送ack=x+1,下次应该给我发送第二个数据包
3.A收到确认信息ACK=1,并且发送了第二个数据包seq=x+1,确认下次B给我的数据包为ack=y+1
4.三次握手成功建立
为什么要三次握手?
为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。
举个栗子:
“已失效的连接请求报文段”的产生在这样一种情况下:客户端发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达服务端。本来这是一个早已失效的报文段。但服务端收到此失效的连接请求报文段后,就误认为是客户端再次发出的一个新的连接请求。于是就向客户端发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要服务端发出确认,新的连接就建立了。由于现在客户端并没有发出建立连接的请求,因此不会理睬服务端的确认,也不会向服务端发送数据。但服务端却以为新的运输连接已经建立,并一直等待客户端发来数据。这样,服务端的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,客户端不会向服务端的确认发出确认。服务端由于收不到确认,就知道客户端并没有要求建立连接。”
这就很明白了,防止了服务器端的一直等待而浪费资源。
断开连接四次挥手
数据传输完毕后,双方都可以释放连接.
此时客户端和服务器都是处于ESTABLISHED状态,然后客户端主动断开连接,服务器被动断开连接.
1. 客户端进程发出连接释放报文,并且停止发送数据。 释放数据报文首部,FIN=1,其序列号为seq = u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时客户端进入FIN-WAIT1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
2. 服务器收到连接释放报文,发出确认报文,ACK=1,确认序号为 u + 1,并且带上自己的序列号seq = v,此时服务端就进入了CLOSE WAIT(关闭等待)状态。 TCP服务器通知高层的应用进程,客户端向服务器请求了断开连接,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
3. 客户端收到服务器的确认请求后,此时客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最终数据)
4. 服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,确认序号为v + 1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq = w,此时服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
5. 客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,确认序号为w + 1,而自己的序列号是u + 1,此时客户端就进入了TIME WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
6. 服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。
小知识点:在网络传输层,tcp模块中有一个tcb(传输控制模块,transmitcontrolblock),它用于记录tcp协议运行过程中的变量。对于有多个连接的tcp,每个连接都有一个tcb。tcb结构的定义包括这个连接使用的源端口、目的端口、目的ip、序号、应答序号、对方窗口大小、己方窗口大小、tcp状态、top输入/输出队列、应用层输出队列、tcp的重传有关变量
为什么要四次分手?
那四次分手又是为何呢?TCP协议是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP是全双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕了;但是,这个时候主机1还是可以接受来自主机2的数据;当主机2返回ACK报文段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;当主机2也发送了FIN报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,主机1收到主机2的FIN报文段时,回复ACK,表示知道主机2也没有数据传输了,之后彼此就会愉快的中断这次TCP连接。
TCP十一种状态
客户端发送FIN给服务端-->ESTABLISHED-->FIN_WAIT1第一次等待
服务端收到回复ACK: ESTABLISHED--->CLOSED_WAIT关闭等待
收到后客户端:FIN_WAIT1-->FIN_WAIT2第二次等待
服务端继续回复客户端FIN: CLISED_WAIT--->LAST_ACK
客户端回复确认ACK:FIN_WAIT2-->TIME_WAIT时间等待-->CLOSED状态
最后服务端收到确认ACK: LAST_ACK---> CLOSED
各个状态的意义如下:
CLOSED:初始状态,表示TCP连接是“关闭着的”或“未打开的”。
LISTEN :表示服务器端的某个SOCKET处于监听状态,可以接受客户端的连接。
SYN_RCVD :表示服务器接收到了来自客户端请求连接的SYN报文。在正常情况下,这个状态是服务器端的SOCKET在建立TCP连接时的三次握手会话过程中的一个中间状态,很短暂,基本上用netstat很难看到这种状态,除非故意写一个监测程序,将三次TCP握手过程中最后一个ACK报文不予发送。当TCP连接处于此状态时,再收到客户端的ACK报文,它就会进入到ESTABLISHED状态。
SYN_SENT :这个状态与SYN_RCVD状态相呼应,当客户端SOCKET执行connect()进行连接时,它首先发送SYN报文,然后随即进入到SYN_SENT状态,并等待服务端的发送三次握手中的第2个报文。SYN_SENT状态表示客户端已发送SYN报文。
ESTABLISHED :表示TCP连接已经成功建立。
FIN_WAIT_1 :这个状态得好好解释一下,其实FIN_WAIT_1和FIN_WAIT_2两种状态的真正含义都是表示等待对方的FIN报文。而这两种状态的区别是:FIN_WAIT_1状态实际上是当SOCKET在ESTABLISHED状态时,它想主动关闭连接,向对方发送了FIN报文,此时该SOCKET进入到FIN_WAIT_1状态。而当对方回应ACK报文后,则进入到FIN_WAIT_2状态。当然在实际的正常情况下,无论对方处于任何种情况下,都应该马上回应ACK报文,所以FIN_WAIT_1状态一般是比较难见到的,而FIN_WAIT_2状态有时仍可以用netstat看到。
FIN_WAIT_2 :上面已经解释了这种状态的由来,实际上FIN_WAIT_2状态下的SOCKET表示半连接,即有一方调用close()主动要求关闭连接。注意:FIN_WAIT_2是没有超时的(不像TIME_WAIT状态),这种状态下如果对方不关闭(不配合完成4次挥手过程),那这个FIN_WAIT_2状态将一直保持到系统重启,越来越多的FIN_WAIT_2状态会导致内核崩溃。
TIME_WAIT :表示收到了对方的FIN报文,并发送出了ACK报文。TIME_WAIT状态下的TCP连接会等待2*MSL(Max Segment Lifetime,最大分段生存期,指一个TCP报文在Internet上的最长生存时间。每个具体的TCP协议实现都必须选择一个确定的MSL值,RFC 1122建议是2分钟,但BSD传统实现采用了30秒,Linux可以cat /proc/sys/net/ipv4/tcp_fin_timeout看到本机的这个值),然后即可回到CLOSED可用状态了。如果FIN_WAIT_1状态下,收到了对方同时带FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态。(这种情况应该就是四次挥手变成三次挥手的那种情况)
CLOSING :这种状态在实际情况中应该很少见,属于一种比较罕见的例外状态。正常情况下,当一方发送FIN报文后,按理来说是应该先收到(或同时收到)对方的ACK报文,再收到对方的FIN报文。但是CLOSING状态表示一方发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文。什么情况下会出现此种情况呢?那就是当双方几乎在同时close()一个SOCKET的话,就出现了双方同时发送FIN报文的情况,这是就会出现CLOSING状态,表示双方都正在关闭SOCKET连接。
CLOSE_WAIT :表示正在等待关闭。怎么理解呢?当对方close()一个SOCKET后发送FIN报文给自己,你的系统毫无疑问地将会回应一个ACK报文给对方,此时TCP连接则进入到CLOSE_WAIT状态。接下来呢,你需要检查自己是否还有数据要发送给对方,如果没有的话,那你也就可以close()这个SOCKET并发送FIN报文给对方,即关闭自己到对方这个方向的连接。有数据的话则看程序的策略,继续发送或丢弃。简单地说,当你处于CLOSE_WAIT状态下,需要完成的事情是等待你去关闭连接。
LAST_ACK :当被动关闭的一方在发送FIN报文后,等待对方的ACK报文的时候,就处于LAST_ACK状态。当收到对方的ACK报文后,也就可以进入到CLOSED可用状态了
是不是记不住?其实小屁也记不住
为什么TCP建立连接只需要三次握手,但是断开连接需要四次挥手?
三次握手建立连接的原因
三次是保证可靠连接的最少次数
两次握手是不够的。如果只有两次握手,当客户端发送 SYN 请求后,服务器返回 SYN - ACK,但是这个 ACK 可能在网络中丢失。此时,客户端会认为连接没有建立成功,而服务器却认为连接已经建立,开始等待客户端发送数据,这就会导致资源的浪费和连接状态的不一致。而三次握手可以避免这种情况,因为客户端在收到服务器的 SYN - ACK 后会发送 ACK 进行确认,只有当服务器收到这个 ACK 后,双方才会认为连接建立成功。
四次挥手断开连接的原因
因为 TCP 连接是全双工的,双方都可以独立地发送和接收数据
第一次挥手:主动关闭方(假设为客户端)发送一个 FIN(结束标志)包,表示客户端不再发送数据,但此时客户端仍然可以接收数据。例如,客户端发送一个 FIN 包,序列号为 u,这个包表示客户端希望终止发送数据的连接部分。
第二次挥手:被动关闭方(服务器)收到 FIN 包后,会返回一个 ACK 包,确认号为 u + 1。这表明服务器已经收到客户端的 FIN 包,但是服务器可能还有数据需要发送给客户端,所以连接还不能完全关闭。
第三次挥手:当服务器发送完剩余的数据后,它会发送一个 FIN 包给客户端,表示服务器也不再发送数据了,假设这个 FIN 包的序列号为 v。
第四次挥手:客户端收到服务器的 FIN 包后,会发送一个 ACK 包,确认号为 v+ 1,此时连接才真正完全关闭。这四次挥手过程确保了在全双工通信模式下,双方的数据发送和接收通道都能被妥善地关闭,避免数据丢失和连接状态的混乱
说白了四次挥手的目的就是因为如果断开连接只有三次的话数据可能传输不完整,四次挥手则会确定数据传输完之后再断开连接。
十进制和二进制转换
十进制
十进制是我们日常生活中最常用的计数系统。它的基数是 10,这意味着它使用 10 个数字(0 - 9)来表示所有的数
二进制
二进制是计算机中最基本的计数系统。它的基数是 2,只用 0 和 1 两个数字来表示所有的数。每一位数字的权重是 2 的幂次方,从右到左依次是 2⁰、2¹、2²、2³……
二进制转换为十进制:
8位的二进制数最小的是00000000,最大的是11111111,那么他们对应的10进制数字是多少呢?
1 1 1 1 1 1 1 1
128 64 32 16 8 4 2 1
八位相加:128+64+32+16+8+4+2+1=255 最高为255
每位为1的相加
1 0 0 1 1 0 1 0
128 0 0 16 8 0 2 0
128+16+8+2=154
十进制转为二进制:从128开始相减,可以减哪位哪位为1
1 1 1 1 1 1 1 1
128 64 32 16 8 4 2 1
60转为二进制:
60-128不通
60-64不通
60-32=28
28-16=12
12-8=4
4-4=0
0-2不通
0-1不通
得出结果60转为二进制:
0 0 1 1 1 1 0 0
128 64 32 16 8 4 2 1
运维必备的网络知识的分享先到这里,明天继续~~~~
想成为大佬,就要从小白开始,从0开始,一点一点的积累,慢慢成长,明天你就是大佬!!想学习更多麒麟操作系统的知识,关注小屁,让你成为运维老鸟~~~~~