前言
了解TCP/IP五层模型,探究从URL输入到返回到底经历了什么,这篇文件比长 你会从中了解到关于五层模型、MAC、ARP、三次握手、四次挥手等知识
TCP/IP五层模型
物理层
电脑的传输介质,传输二进制(0 1)电气信号
链路层
确定0和1的分组方式 主要为以太网
以太网协议
一组电信号构成一个数据包叫做帧,每一帧分成两个部分:
- 标头(Head)
- 数据(Data)
标头(Head)包含数据包的一些说明项,比如发送者、接收者、目标MAC数据类型等等
数据(Data)则是数据包的具体内容。
MAC地址
MAC地址及物理网卡的地址,由12个16进制数表示例:00-B0-D0-86-AA-F7
前6个16进制数是生产厂商编号后6位是厂商流水号,每个网卡的MAC都是独一无二的
作用:通过MAC地址将数据包送到该子网络中的目标网卡
网络层
网络层的由来
互联网是由无数子组成的巨型网络而以太网依靠MAC地址发送数据,非同个子网络无法传输数据,
需要区分MAC是否是同个子网从而使用不同方式发送(广播、路由方式)
如何区分目标是否在同个子网?
使用子网掩码与本机IP做二进制AND运算(两个数位都为1,结果为1,否则为0),再使用子网掩码与目标IP做AND运算,两个结果一样则在一个子网反之则不在】
例:访问google IP 172.194.72.105, 已知本机子网掩码是255.255.255.0,本机用它对自己的IP地址192.168.1.100,做AND运算,计算结果为192.168.1.0,再对Google的IP地址172.194.72.105也做一个AND运算,计算结果为172.194.72.0,结果不一致
广播(在同个子网)
数据包的目标地址是对方的MAC加对方IP
将数据包发送到本网络下所有的计算机,每台计算机从以太网标头拿到目标MAC地址与自身做比较 一致则接收,
缺点:
- 目标必须在同个子网络下
- 无法得知目标是否接受成功
- 同个子网下都会接受到包,资源浪费 效率低
这里目标的MAC从何得到的?使用ARP(后续网络层中会讲)
路由转发(不在同个子网)
此时数据包的目标地址是网关的MAC加对方IP
网址作用
通过路由选择算法为分组通过通信子网选择最适当的路径,分组超过了协议数据单元允许的长度,则源节点的网络层就要对该分组进行分片
IP协议
规定网络地址的协议叫做IP协议,它所定义的地址就被称为IP地址
作用:
- 为每一台计算机分配IP地址
- 确定哪些地址在同一个子网络
IPv4 网络地址由32个二进制位组成。
子网掩码
作用: 判断任意两个IP地址是否处在同一个子网络
判断步骤:将两个IP地址与子网掩码分别进行AND运算(两个数位都为1,运算结果为1,否则为0),然后比较结果是否相同,如果是的话,就表明它们在同一个子网络中,否则就不是
IP数据包
IP数据包也分为标头和数据两个部分
标头部分主要包括版本、长度、IP地址等信息,数据部分则是IP数据包的具体内容
再将其插入以太网数据包后
ARP协议
作用:根据IP地址获取物理地址的一个TCP/IP协议
步骤:
- 在自己的本地ARP缓存中检查目标IP的匹配MAC地址,有则返回
- 请求帧广播到本地网络上的所有主机,包含要查询主机的IP地址,在对方MAC这栏填的是FF:FF:FF:FF:FF:FF,表示这是一个广播地址
- 子网络的所有主机接受这个数据包,取出IP与自身比对, 相同则告诉对方自己的MAC地址反之则丢弃
- 拿到IP和MAC地址映射更新ARP缓存
传输层
作用:提供应用程序间的通信(区分数据是给主机上哪个程序的),主要是UDP和TCP协议
方法:每个数据包都发到主机的特定端口,所有不同的程序就能取到自己所需要的数据
UDP协议
UDP数据包,也是由标头和数据两部分组成,相当于广播方式 一旦数据包发出,无法知道对方是否收到,传输数据是不可靠的
标头部分主要定义了发出端口和接收端口,数据部分就是具体的内容。然后把整个UDP数据包放入IP数据包的数据部分
TCP
它就是有确认机制的UDP协议,每发出一个数据包都要求确认,如果有一个数据包遗失,就收不到确认,发出方就知道有必要重发这个数据包了
TCP数据包和UDP数据包一样,都是内嵌在IP数据包的”数据”部分,TCP数据包没有长度限制
在将TCP或UDP数据包入IP数据包后
- 以太网标头设置发出方(本机)的MAC地址和接收方(DHCP服务器)的MAC地址,前者就是本机网卡的MAC地址,后者这时不知道就填入一个广播地址:FF-FF-FF-FF-FF-FF。
- IP标头设置发出方的IP地址和接收方的IP地址。这时对于这两者,本机都不知道,于是发出方的IP地址就设为0.0.0.0,接收方的IP地址设为255.255.255.255。
- TCP标头设置发出方的端口和接收方的端口,这一部分是DHCP协议规定好的,发出方是68端口,接收方是67端口
三次握手
- 第一次握手:建立连接时,客户端发送syn包(syn=x)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
- 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;
- 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手
状态码
- URG:紧急指针是否有效,为1表示某一位需要被优先处理
- ACK:确认号是否有效,一般置为1
- PSH:提示接收端应用程序立即从TCP缓冲区把数据读走
- RST:对方要求重新建立连接,复位。
- SYN:请求建立连接,并在其序列号的字段进行序列号的初始值设定 建立连接,设置为1
- FIN:希望断开连接。
四次挥手
- 客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部FIN=1 其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时 客户端进入FIN-WAIT-1(终止等待1)状态
- 服务器收到连接释放报文,发出确认报文 ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服 务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间
- 客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)
- 服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认
- 客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态
- 服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些
应用层
作用: 为不同应用程序规定不同的数据格式
举例来说TCP协议可以为各种各样的程序传递数据,比如Email、WWW、FTP等等,那么必须有不同协议规定电子邮件、网页、FTP数据的格式,这些应用程序协议就构成了应用层
结尾
到这我们了解TCP/IP中基本结构以及MAC解析 数据传递的知识,下一篇将分析URL输入到返回的具体步骤