计算机网络-TCP&IP&MAC
可靠传输——TCP
HTTP是基于TCP协议传输的,TCP协议是一种可靠的传输,HTTP之所以要用到TCP协议而不使用UDP协议,也很简单,设想一下如果你在上网的时候页面发生缺失,或者图片缺失,很难受对不对,所以要使用可靠传输来保证我们上网的体验感,所以我们先来了解一下TCP协议
TCP包头格式
TCP报文首部格式如下图所示
首先源端口号和目的端口号是必不可少的,有了这两个端口号,数据包才知道从哪里来,要到哪里去
接下来序号也是必不可少的,序号是包的序号,这个是为了解决包乱序的问题,给包编上序号,就不会弄混啦😁😁😁
然后就是确认号,目的是为了确认发出去的对方是否有收到,如果没有收到就应该重新发送,直到送达,这个是为了解决丢包问题
接下来就是一些状态位,SYN是发起一个连接,ACK是回复,RST是重新连接,FIN是结束连接等等。因为TCP是面向连接的,因而双方需要维护连接的状态,这些状态位的发送,会引起双方状态的变更
紧接着就是窗口大小,因为TCP承担着流量控制的责任,所以在通信的过程中,通信双方各声明一个窗口(缓存大小),标识自己当前能够处理的能力,别发送的太多太快,也别发送的太少太慢;除了流量控制以外,TCP还会做拥塞控制,对于传输信道上到底堵不堵,它无能为力,唯一能做的只有控制自己,即控制发送的速度,做到拥塞控制
TCP的三次握手
在HTTP传输数据之前,首先要建立TCP连接,TCP连接的建立,通常需要三次握手,这个所谓的连接,只是双方计算机里维护的一个状态机,在连接建立的过程中,双方的时序图如下所示
- 一开始,客户端和服务端都处于CLOSED状态,首先是服务器主动监听某个端口,处于LISTEN状态
- 然后客户端主动发起连接SYN,之后处于SYN-SENT状态
- 服务端收到发起的连接,返回SYN,并且ACK客户端的SYN,之后处于SYN-RCVD状态
- 客户端收到服务器发送的SYN和ACK之后,发送对SYN确认的ACK,之后处于ESTABLISHED状态,因为它一发一收成功了,处于就绪状态
- 服务端收到ACK的ACK后,处于ESTABLISHED状态,因为它也一发一收成功了
TCP分割数据
如果HTTP请求消息比较长,超过MSS的长度,这是TCP就需要把HTTP的数据拆解成一块块的数据发送,而不是一次性发送所有的数据
- MTU:一个网络包的最大长度,以太网一般为1500字节
- MSS:除去IP和TCP头部之后,一个网络包所能容纳的TCP数据的最大长度
数据会被以MSS的长度为单位进行拆分,拆分出来的每一块数据都会被放入单独的网络包中。也就是在每个被拆分的数据加上TCP头信息,然后交给IP模块来发送数据
TCP报文生成
TCP协议里面会有两个端口,一个是浏览器监听的端口(通常是随机生成的),一个是Web服务器监听的端口(HTTP默认端口号是80,HTTPS默认端口号是443)
在双方建立连接后,TCP报文中的数据部分就是存放HTTP头部+数据,组装好TCP报文之后,就交给下面的网络层处理
至此HTTP数据包成功发送出去了,但是该怎么知道该往哪走呢?
远程定位——IP
TCP模块在执行连接、收发、断开等各阶段操作时,都需委托IP模块将数据封装成网络包发送给通信对象
IP包头格式
首先也是要有源地址IP和目标地址IP:
源地址IP:客户端输出的IP地址
目标地址:通过DNS域名解析得到的Web服务器IP
因为HTTP是通过TCP进行传输的,所以在IP包头的协议号,要填写06(D),表示为TCP协议
当存在多个网卡时,一台主机就会有多个IP地址,这个时候需要判断到底应该填写哪个地址,即使用哪一个网卡来进行发包
这个时候就要用到路由表规则,来判断哪一个网卡作为源地址IP,路由表规则即拿IP地址和子网掩码进行与(&)运算,得到一个结果,拿去和本机Destination进行比较,匹配不一致,则失败,匹配成功,则使用该网卡的IP地址作为IP包头的源地址,如下图所示
这是有了IP协议,知道了从哪来,该到哪去,但是要怎么去呢?下一站该去哪呢?
两点传输——MAC
生成了IP头部后,接下来网络包还需要在IP头部的前面加上MAC头部
MAC头部是以太网使用的头部,它包含了接收方和发送方的MAC地址等信息
MAC包里面需要发送方MAC地址和接收方目标MAC地址,用于两点间的传输
在TCP/IP通信里,MAC包头的协议类型只使用:
- 0800:IP协议
- 0806:ARP协议
发送方的MAC地址获取比较简单,MAC地址是在网卡生产时写入到ROM里的,只要将这个值读取出来写入到MAC头部就可以了
接收方获取MAC地址有点复杂,首先得先弄清楚要发给谁,这个在前面已经讨论过了,查一下路由表就行了,但是这只知道IP地址,如何获取MAC地址呢?
此时就要用到ARP协议帮我们找到路由器的MAC地址,ARP协议会在以太网中以广播的形式,对以太网的所有设备喊出:“这个IP地址是谁的?把你的MAC地址告诉我。”
然后就会有主机进行回应:“这个IP是我的,我的MAC地址是xxxx”。
如果对方和自己处于一个子网中,那么通过上面的操作就可以得到对方的MAC地址,然后我们将MAC地址写入MAC头部中,MAC头部就完成了
但是每次都进行这种广播操作,不是很麻烦吗?这个时候,操作系统会把本次查询的查询结果放在一块叫做ARP缓存的内存空间留着以后使用,不过缓存的时间只有几分钟
至此,网络包的报文如下图
至此,所有准备工作已经完成,终于要出门了
出口——网卡
网络包只是存放在内存中的一串二进制数字信息,没有办法直接发送给对方,因此我们需要将数字信号转化为电信号,才能在网线上传输
负责执行这一操作的是网卡,要控制网卡还得靠网卡驱动程序
网卡驱动获取网络包后,会将其复制到网卡内的缓存区中,接着会在其开头加上报头和起始帧分界符,在末尾加上用于检测错误的帧校验序列
- 起始帧分界符是一个用来表示包起始位置的标记
- 末尾的FCS用来检测包在传输的过程中是否有损坏
最后网卡会将数据包转换为电信号,通过网线发送出去
送别者——交换机
交换机的设计是将网络包原样转发到目的地,交换机工作在MAC层,也称二级网络设备
首先,电信号到达网线接口,交换机里的模块进行接收,接下来交换机里的模块将电信号转换为数字信号
然后通过包末尾的FCS校验错误,如果没问题就放到缓冲区,这部分操作基本和计算机的网卡相同,但交换机的工作方式和网卡不同。
将包存入缓冲区后,接下来要查询一下这个包的接收方MAC地址是否已经在MAC地址表中有记录了
交换机的MAC地址表主要包含两个信息:
- 设备的MAC地址
- 该设备连接在交换机的哪个端口上
举个例子,如果收到的包的接收方MAC地址为00-00-C0-16-AE-FD
,则根据MAC地址表,知道这个地址位于2
号端口上,然后通过交换电路将包发送到相应的端口
当MAC地址表中找不到指定的MAC地址的时候,可能是因为具有该地址的设备还没有向交换机发送过包,或者有一段时间没工作导致从地址表中删除了
这时候,交换机无法判断该转发到哪个端口上,只能将数据包转发到除了源端口之外的所有端口,无论该设备连接在哪个端口上都能接收到这个包。只有相应的接收者接到包之后才会进行处理,而其他设备则会忽略这个包,不对这个包作出相应应答
那这样不是会造成网络拥塞吗?完全不用担心这个问题,因为只有目标设备会做出响应,只要发回了响应包,交换机就可以把它的地址写入MAC地址表,下次就不需要把包发往所有端口了。而且换句话来说,数据包在网络通信过程中广播的次数很多,所以多进行一次这样的操作并没有什么很大的问题
以下两个是常见的广播地址
MAC地址中:FF-FF-FF-FF-FF-FF |
出境大门——路由器
有一个非常形象的比喻,路由器就像是在每一个路口上为你决策往哪个方向走的导航一样。对于数据包来说,路由器帮助每一个数据包选择不同的路线来帮助他们更好地到达目的地。路由器也是通过转发的方式转发到下一个路由器或者目标设备,这一步的工作原理和交换机类似,通过查表判断包转发的目标,但是路由器和交换机在构造上有一定的区别,主要表现在:
- 路由器是基于IP设计的,俗称三级网络设备,路由器的每个端口都有相应的MAC地址和IP地址
- 交换机是基于以太网设计的,俗称二级网络设备,交换机的端口不具有MAC地址
路由器的包接受操作
首先,电信号到达网线接口处,路由器中的模块会将电信号转化成数字信号,然后通过包末尾的 FCS 进行差错检测;如果没问题则检查MAC头部接收方MAC地址,看看是不是发给自己的包,如果是就放在接收方缓冲区中,否则丢弃这个包
确定输出端口
完成包接受操作后,路由器会去掉包开头的MAC头部,因为此时MAC头部的任务已经完成,于是MAC头部被丢弃,接下来,路由器会根据MAC头部后方的IP头部中的内容进行包的转发操作,转发分为几个阶段,首先就是查询路由表判断转发目标,如下是路由表的示例图
例如10.10.1.101向192.168.1.100转发消息时,首先将目标IP和子网掩码进行&运算,得到结果为192.168.1.0,与路由表中第二天符合,所以路由器将这条数据包从eth3发出去,如果路由表中无相关条目,则通过默认路由转发,其中0.0.0.0表示默认路由
路由器发送操作
首先要根据路由表的网关列来判断对方的地址。
- 如果网关是一个IP地址,则这个IP地址就是我们需要转发到的目标地址,且还未抵达终点,还需继续由路由器转发
- 如果网关为空,则IP头部的接收方IP地址就是要转发到的目标地址,说明已抵达终点
知道对方的IP地址后,通过ARP协议根据IP地址查询MAC地址,并将查询的结果作为接收方的MAC地址(路由器中也有APR缓存,会优先在ARP缓存中查询,如果找不到则发送ARP查询请求)
网络包完成后,接下来会将其转化为电信号并通过端口发送出去,这一步的工作过程和计算机是相同的。
发送出去的网络包会通过交换机到达下一个路由器,由于接收方MAC地址是下一个路由器的地址,所以交换机会根据这一地址将包传输到下一个路由器,接下来下一个路由器再转发到下一个路由器,经过层层转发后,网络包就到达了最终的目的地
在数据包的转发过程中,一直在变化的是MAC地址,源IP和目的IP都不会发生变化,因此在两个设备间进行传输,MAC地址更为重要
服务器和客户端
以下是数据包在服务器和客户端之间传递的过程中数据包的形态变换情况
数据包到达服务器后,服务器先扒开数据包的MAC头部,查看是否与自己的MAC地址相符合,符合则接受包
接着继续拆开IP头部,发现IP地址符合,根据IP头中的协议号,知道自己上层是TCP协议
于是,打开TCP的头部,里面有序列号,需要看一眼这个序列号是不是想要的,如果是就放入缓存并返回一个ACK,如果不是就丢弃。TCP头部还有端口号,HTTP的服务器正在监听这个端口号,于是服务器知道HTTP进程需要这个包,于是就把包发给HTTP进程
服务器的HTTP进程看到,这个请求需要访问一个页面,于是就把这个页面封装在HTTP响应报文
接着HTTP响应报文依次套上TCP、IP、MAC头部,再发送回去
最后,客户端经过四次挥手和服务器进行连接断开