一、计算机网络模型
如今绝大多数网络都使用的是TCP/IP协议,所以我们学习的重点就是TCP/IP协议。下面便来看一下各层的大概功能:
每层都有着自己的功能,各自之间互不干涉,这样便能高速准确的传递信息。下面我们将对TCP/IP5层模型每层进行详细的解释。
二、物理层
物理层为网络模型最底层,它确保比特流可在各种物理媒介中传播,解决两台机器同时发 送的冲突、数据收发是否正确的校验等链路问题。
在物理层常见的协议:有线网络802.3、无线网络802.11、手机3G/4G拨号上网ppp协议等。
三、数据链路层
数据链路层在物理层提供的服务的基础上向网络层提供服务,其最基本的服务是将源自网络层来的数据可靠地传输到相邻节点的目标机网络层。一个完整的以太网数据报大概如下:
首部为14个字节,包含了目的MAC地址、源MAC地址、类型。数据最 短为46个字节,最长为1500个字节。尾部固定为4个字节, 表示数据帧校验序列,用于确定数据包在传输过程中是否损坏。然后把数据包装成数据帧通过物理媒介传输出去。
MAC地址采用十六进制标识,共6个字节, 前三个字节是厂商编号,后 三个字节是网卡流水号,例如 4C-0F-6E-12-D2-19。
有了MAC地址以后,以太网采用广播形式,把数据包发给该子网内所有主机,子网内每台主机在接收到这个包以后,都 会读取首部里的目标MAC地址,然后和自己的MAC地址进行对比,如果相同就做下一步处理,如果不同,就丢弃这个包。所以链路层的主要工作就是对电信号进行分组并形成具有特定意义的数据帧,然后以广播的形式通过物理介质发送给 接收方。
三、网络层
网络层中有三个协议:IP协议、ARP/RARP协议、路由协议。
1、IP协议
IP地址是确定每一台机器在网络层中的身份,分为IPV4和IPV6,如今IPV4的地址池快用完了,IP地址是一个32位二进制的数,IP地址分为公网IP和私有IP。私有IP必须在同一个局域网中才能同信,那么如何确定是否在同一个局域网内,这时便引入了子网掩码,子网掩码与私有IP地址进行与运算结果相同便在同一个网段中,反之不在,
私有IP地址范围:
A: 10.0.0.0~10.255.255.255 即10.0.0.0/8
B:172.16.0.0~172.31.255.255即172.16.0.0/12
C:192.168.0.0~192.168.255.255 即192.168.0.0/16
IP头部的长度一般都为20字节:
2、ARP/RARP协议
ARP(Address Resolution Protocol,地址解析协议)是根据IP地址获取MAC地址的一个网络层协议。而 RARP(Reverse Address Resolution Protocol,反向地址转换协议)则允许局域网的物理机器从网关服务器 的 ARP 表或者缓存上请求其 IP 地址。ARP协议的工作原理如下:
- ARP首先会发起一个ARP请求数据包,数据包的首部包含了目标主机的IP地址;
- 数据包会在链路层进行再次包装,生成以太网数据包,最终由以太网广播给子网内的所有主机;
- 每一台主机都会接收到这个数据包,并取出标头里的IP地址,然后和自己的IP地址进行比较,如果相同 就返回自己的MAC地址,如果不同就丢弃该数据包。
- ARP接收返回消息,以此确定目标机的MAC地址;与此同时,ARP还会将返回的MAC地址与对应的IP地址存 入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。
由于ARP报文是一个广播的报文,每台主机都可以对ARP请求报文进行回复。这样就有一种攻击方式使用 该漏洞,通过伪造IP地址和MAC地址实现ARP欺骗,能够在网络中产生大量的ARP通信量使网络阻塞,攻击者 只要持续不断的发出伪造的ARP响应包就能更改目标主机ARP缓存中的IP-MAC条目,造成网络中断或中间人 攻击。这种攻击方式叫做ARP欺骗攻击,其中netcut(网络剪刀手)就是实现这种攻击方式的一个软件
1、路由协议
首先通过IP协议来判断两台主机是否在同一个子网中,如果在同一个子网,就通过ARP协议查询对应的 MAC地址,然后以广播的形式向该子网内的主机发送数据包。如果不在同一个子网,以太网会将该数据包转 发给本子网的网关进行路由。
网关是互联网上子网与子网之间的桥梁,所以网关会进行多次转发,最终将该数据包转发到目标IP所在 的子网中,然后再通过ARP获取目标机MAC,最终也是通过广播形式将数据包发送给接收方。而完成这个路 由协议的物理设备就是路由器,在错综复杂的网络世界里,路由器扮演者交通枢纽的角色,它会根据信道 情况,选择并设定路由,以最佳路径来转发数据包。骨干网上的路由器与家用的路由器不同,他们会运行一些路由算法,找到一条最优的路径到达目标主机 所在的网络。这些常见的路由协议有:
RIP(Routing Information Protocol):路由信息协议。
IGRP(Interior Gateway Routing Protool):内部网关路由协议。
OSPF(Open Shortest Path First):开放式最短路径优先协议。
IS-IS(Intermediate System-to-Intermediate System):中间系统到中间系统路由协议。
BGP(Border Gateway Protocol):边界网关协议。
四、传输层
传输层是用来实现不同pc上进程之间通信。端口是 16位的,最大为65535,其中1024以下的端口为众所周知端口,这些端口已经分配给了一些常用的服务,譬如 ftp(20/21)、ssh(22)、telnet(23)、smtp(25)、dns(53)、dhcp(67/68)、tftp(69)、www/http(80)、ntp(123)、 snmp(161)、https(443)等。
端口用来确定到达的数据包送到哪个进程中,一个端口只能被一个进程占用,但是一个进程可以占用多个端口。Linux下我们可以使用netstat命令查看哪些端口正在被 使用。
1、TCP/UDP
TCP/IP 中有两个具有代表性的传输层协议,分别是 :TCP 和 UDP。
TCP是面向连接的、可靠的流协议。它为提供可靠性传输,实行“顺序控制”或“重发控制”机制。 此外还具备“流控制(流量控制)”、“拥塞控制”、提高网络利用率等众多功能;
UDP是非面向连接的、不可靠的数据报协议。在 UDP 的情况下,虽然可以确保发送消息的大小,却 不能保证消息一定会到达。因此,应用有时会根据自己的需要进行重发处理。
TCP头部固定长度位20字节:
UDP头部固定8个字节:
2、TCP三路握手
TCP 提供面向有连接的通信传输。面向有连接是指在数据通信开始之前先做好两端之间的准备工作。 所谓三次握手是指建立一个 TCP 连接时需要客户端和服务器端总共发送三个包以确认连接的建立。 在socket编程中,这一过程由客户端执行connect来触发。具体流程如下:
第一次握手:客户端将标志位SYN置为1,随机产生一个值seq=J,并将 该数据包发送给服务器端,客户端进入SYN_SENT状态,等待服务器端确 认。
第二次握手:服务器端收到数据包后由标志位SYN=1知道客户端请求建 立连接,服务器端将标志位SYN和ACK都置为1,ack=J+1,随机产生一个 值seq=K,并将该数据包发送给客户端以确认连接请求,服务器端进入 SYN_RCVD状态。
第三次握手:客户端收到确认后,检查ack是否为J+1,ACK是否为1,如 果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给服务器端, 服务器端检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功, 客户端和服务器端进入ESTABLISHED状态,完成三次握手,随后客户端 与服务器端之间可以开始传输数据了。
3、TCP四次挥手
四次挥手即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket 编程中,这一过程由客户端或服务端任一方执行close来触发。由于TCP连接是全双工的,因此,每个方向都必须要单独进 行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向 上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进 行关闭的一方将执行主动关闭,而另一方则执行被动关闭。
中断连接端可以是客户端,也可以是服务器端。下面以客户端为例: 第一次挥手:客户端发送一个FIN=M,用来关闭客户端到服务器端的数 据传送,客户端进入FIN_WAIT_1状态。意思是说"我客户端没有数据要 发给你了",但是如果你服务器端还有数据没有发送完成,则不必急着 关闭连接,可以继续发送数据。
第二次挥手:服务器端收到FIN后,先发送ack=M+1,告诉客户端,你的 请求我收到了,但是我还没准备好,请继续你等我的消息。这个时候客 户端就进入FIN_WAIT_2 状态,继续等待服务器端的FIN报文。
第三次挥手:当服务器端确定数据已发送完成,则向客户端发送FIN=N 报文,告诉客户端,好了,我这边数据发完了,准备好关闭连接了。服 务器端进入LAST_ACK状态。
第四次挥手:客户端收到FIN=N报文后,就知道可以关闭连接了,但是 他还是不相信网络,怕服务器端不知道要关闭,所以发送ack=N+1后进 入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。服务器端收 到ACK后,就知道可以断开连接了。客户端等待了2MSL后依然没有收到 回复,则证明服务器端已正常关闭,那好,我客户端也可以关闭连接了。 最终完成了四次握手
一些关于传输层的基本概念:
MTU(Maximum Transfer Unit,最大传输单元) 链路层的帧(frame)中的数据部分的最大字节数,以太网中的一般为1500字节。
MSS(Maximum Segment Size,最大报文段大小) TCP的报文段中的数据部分的最大字节数,MTU减去IPv4的Header和TCP的HeaderIPv4(一般都是20字节),则MSS=1500-2020 = 1460字节
MSL(Maximum Segment Lifetime,报文最大生存时间) 报文在网络上存在的最长时间,TCP四次挥手是主动断开连接的一方再发送完最后一个ACK后进入TIME_WAIT状态时,需要 等待2MSL时间后才变成CLOSED状态,RFC 793建议为2分钟。
RTT(Round-Trip Time) 从发送端发送数据开始,到发送端收到来自接收端的确认(接收端收到数据后便立即发送确认),总共经历的时延。 TCP中保留了RTT的加权平均值RTTS(下标S表示Smoothed)。
TTL(Time To Live) 该字段指定IP包被路由器丢弃之前允许通过的最大网段数量。TTL是IPv4包头的一个8 bit字段。
RTO(Retransmission Timeout,超时重传时间) TCP中触发超时重传机制的时间,应略大于RTT。RFC2988中建议RTO = RTTS + 4 * RTTD