计算机网络基本概念笔记 | 青训营笔记

230 阅读6分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第4篇笔记

数据包传输原理

假设网络上要将一个数据包(名为PAC)由北京的一台主机(名称为A,IP地址为IP_A,MAC地址为MAC_A)发送到华盛顿的一台主机(名称为B,IP地址为IP_B,MAC地址为MAC_B)。这两台主机之间不可能是直接连接起来的,因而数据包在传递时必然要经过许多中间节点(如路由器,服务器等等),我们假定在传输过程中要经过C1、C2、C3(其MAC地址分别为M1,M2,M3)三个节点。A在将PAC发出之前,先发送一个ARP请求,找到其要到达IP_B所必须经历的第一个中间节点C1的MAC地址M1,然后在其数据包中封装(Encapsulation)这些地址:IP_A、IP_B,MAC_A和M1。当PAC传到C1后,再由ARP根据其目的IP地址IP_B,找到其要经历的第二个中间节点C2的MAC地址M2,然后再将带有M2的数据包传送到C2。如此类推,直到最后找到带有IP地址为IP_B的B主机的地址MAC_B,最终传送给主机B。在传输过程中,IP_A、IP_B和MAC_A不变,而中间节点的MAC地址通过ARP在不断改变(M1,M2,M3),直至目的地址MAC_B。

简单的说就是找下一条地址,发送ARP,找到目标MAC地址,然后重复动作直到找到和IP_B同网段的目标MAC,然后再传送。

注意:同网段才能发送ARP请求。

四层网络模型

数据链路层

在网线光缆等数据传输媒介中,数据是以电信号的形式传输,也就是0-1的电信号表示数据。且包含了物理地址。数据层则是解决物理地址寻址的问题。

以太网协议定义了数据帧,每一帧传输一段数据,如果数据很长,则需要分帧传输。每一个数据帧分为两个部分,head和data(TCP、IP协议也是分为两部分)。

网络层

网络层,定义了另一种地址,用来定义计算机所在的自网络,就像你所在的市区,就是一个范围。

  • IP协议 网络层定义的地址就是IP地址,规定网络地址的协议叫做IP协议。

目前广泛使用的是IPV4,但随着世界上计算机数量的增多,逐渐发现32位慢慢不够用了,就有了IPV6。

  • IP地址 IPV4有32位2进制数表示,通常转化为4段十进制数表示IP地址。从0.0.0.0---255.255.255.255,每台计算机都会有一个IP地址,这个地址分为网络部分和主机部分,每个区域的网络部分和主机部分位数可能不相等。

  • 子网掩码 但是由于每个区域的差别,网络部分和主机部分的位数可能不一样,因此出现了子网掩码,用来判断两个IP是否在同一各网络。比如网络部分有16位,那么255.255.102.111的子网掩码就是255.255.0.0,通过判断两个计算机IP的子网掩码是否相同就可以知道是否处于同一个子网了。

  • ARP协议 由于IP数据包放在以太网数据包里发送,通过IP寻址,通过MAC地址定位,那么我们怎么能知道目标主机的MAC地址(通常IP地址是已知的,后面解释),所以我们需要用IP地址拿到MAC地址。

可以使用ARP协议,ARP协议发送一个数据包,与IP协议相似,包含于以太数据包中。其中包含了本机IP地址,本机MAC地址目标IP地址,目标MAC地址由于不知道,写的是FF:FF:FF:FF:FF:FF,用来表示这是个广播地址,子网中的计算机都会拿到这个包,然后和自己的IP比较,如果相同,就知道这是个想要我MAC地址的的请求,把自己MAC地址回复。

传输层

  • UDP协议 UDP数据包也是由Head和Data两部分组成。 Head部分:定义了发出端口和接收端口; Data部分:存放了数据。 其中,UDP的Head部分8个字节,总长65535字节,正好可以放进一个IP数据包。

  • TCP协议 为什么有了UDP,还有TCP呢? 因为UDP是不可靠传输,就是A发了一段UDP数据包给B,B有可能收到,也可能因为网络等问题收不到,A也不知道是个啥情况,就默认B收到了,对于一些必须要保证给B的数据,这显然不可行,TCP协议就可以保证在网络无问题时,100%传输,就算出错,A自己也能知道。

  • TCP协议:TCP数据包中除了数据,有很多其它的字段,这些字段保证了传输的可靠性。 保证可靠传输会用到序列号(seq),确认号(ack),SYN,ACK,FIN 序列号:程序用来标识数据包所用的字段 确认好:用来表示对收到的数据包表示确认收到

  • SYN:程序请求建立连接的字段

  • ACK:程序确认收到数据的字段

  • FIN:程序请求关闭连接的字段

  • 三次握手 主机A,主机B

  • 1.A→B seq=x,SYN=1 主机A请求建立连接 (注:这一步后,B确认了自己的收报能力)

  • 2.B→A seq=y,ACK=1,SYN=1,ack=x+1 ACK表示B确认收到A的请求,SYN表示同意建立连接 (注:这一步后,A确认了自己的发报和收报能力,因为发出去的数据有应答,就说明B已经收到了)

  • 3.A→B seq=x+1,ACK=1,ack=y+1 ACK表示确认B的请求 (注:这一步后,B才最终确认自己的发报能力,因为2发给A的有应答)

3次握手后,表示这个链接是好的,才建立连接,发送数据。

  • 四次挥手

  • A→B seq=x,FIN=1 A主机的数据发送完了,所以A发送FIN,发起了断开连接的请求

  • B→A seq=y,ACK=1,ack=x+1 ACK确认收到了A的数据,但是B的数据还没有传完,所以需要等B把数据包传完之后才断开连接 (注:这一步之后,B接着传输剩下的数据包)

  • B→A FIN=1,ACK=1,seq=z,ack=x+1 B的数据传完了,所以也发送FIN表示可以断开连接 (注:这一步之后,B直接断开连接)

  • A→B ACK=1,seq=x+1,ack=z+1 A表示收到了B的数据,可以断开连接 (注:这一步之后,A等待B的应答,经过2MSL之后,还没有收到B的回信,因为B已经关闭连接了,所以A确定B已经断开了,A也断开连接。2MSL为报文在网络上最大生存时间,超过这个时间就会被丢弃)

应用层

TCP协议可以为各种各样的程序传递数据,比如Email、WWW、FTP等等。那么,必须有不同协议规定电子邮件、网页、FTP数据的格式,这些应用程序协议就构成了"应用层"。