物理层(以比特流单位,中继器、集线器)
1.通信方式
单工通信:只能单向传输
半双工通信:双向交替传输,不能两边同时传
全双工通信:双向同时传输
传输层(以帧为单位,网卡、网桥、交换机)
1.封装成帧
将网络层传下来的包添加尾部和首部,用于标记帧的开始和结束
2.透明传输
在进行转义符的传递时,用户察觉不到转义符的存在
3.差错检测
目前数据链路层广泛使用循环冗余检验(CRC)来检查比特差错
4.MAC地址
处于数据链路层,长度6个字节(48位),用于唯一标识网络适配器(网卡)
5.协议
CSMA/CD协议表示载波监听多点接入/碰撞检测
ppp协议是用户计算机和 ISP 进行通信时所使用的数据链路层协议
网络层(路由器)
IP协议
ip地址是一个32位的二进制数,通常被分割为4个“8位二进制数”,IP地址通常用“点分十进制”表示成(a.b.c.d)的形式,其中,a,b,c,d都是0~255之间的十进制整数,8位的二进制数最多能表示到2^8-1=255
ip地址被分为很多类,其中最常用的是ABC类,他们的ip地址=网络地址+主机地址
ip分类:A类前几位为0,范围为0-126.x.x.x(127.x.x.x段地址空间是被保留的回环地址)前8位是网络地址;B类前几位为10,范围为128-191.x.x.x前16位是网络地址;C类前几位为110,范围为192-223.x.x.x前24位是网络地址;D类前几位为1110,范围为224-239.x.x.x;E类前几位为11110,范围为240-247.x.x.x;
网络地址可以知道每类地址可以有多少个网络,主机地址可以知道没类地址有多少可用的主机,没类地址主机地址全为0标识位网络地址,全为1也就是255,标识为广播地址
子网掩码不能单独存在,它必须结合IP地址一起使用。子网掩码只有一个作用,就是将某个IP地址划分成网络地址和主机地址两部分(通过子网掩码,就可以判断两个IP在不在一个局域网内部,子网掩码可以看出有多少位是网络号,有多少位是主机号)
子网掩码32位都与IP地址32位对应,如果某位是网络地址,则子网掩码为1,否则为0。
各自的ip地址与各自的子网掩码进行与运算之后,如果得出的结果是相同的,则说明这两台计算机是位于同一个子网络上的,可以进行直接通讯
可根据需要的子网数或者每个子网的主机数进行占取主机地址位数作为掩码自定义子网掩码
网关:在同一个网段中(也就是局域网)通讯,是可以直接通过IP得到MAC就能找到了,如果在不同的网段中就需要发往默认网关 Gateway 了.Gateway 的地址一定是和源 IP 地址是同一个网段的,如果不是第一个(x.x.x.1),就是第二个(x.x.x.2)
在经过网关时,MAC地址一定会发生变化(源地址和目标地址为本阶段发送的),IP始终不发生变化的是转发网关(在整个过程中源ip和目标ip始终不变),ip发生变化的是NAT网关
2.地址解析协议ARP
ARP 实现由 IP 地址得到 MAC 地址
ARP欺骗原理:在ARP缓存表机制存在一个缺陷,就是当请求主机收到ARP应答包后,不会去验证自己是否向对方主机发送过ARP请求包,就直接把这个返回包中的IP地址与MAC地址的对应关系保存进ARP缓存表中,如果原有相同IP对应关系,原有的则会被替换
3.网际控制报文协议 ICMP
ICMP 是为了更有效地转发 IP 数据报和提高交付成功的机会。它封装在 IP 数据报中,但是不属于高层协议,ICMP 报文分为差错报告报文和询问报文
Ping 是 ICMP 的一个重要应用,主要用来测试两台主机之间的连通性。Ping 的原理是通过向目的主机发送 ICMP Echo 请求报文,目的主机收到之后会发送 Echo 回答报文。Ping 会根据时间和成功响应的次数估算出数据包往返时间以及丢包率
Traceroute 是 ICMP 的另一个应用,用来跟踪一个分组从源点到终点的路径,发送的 IP 数据报封装的是无法交付的 UDP 用户数据报,并由目的主机发送终点不可达差错报告报文
传输层
1.UDP和TCP
用户数据报协议 UDP(User Datagram Protocol)是无连接的,尽最大可能交付,没有拥塞控制,面向报文(对于应用程序传下来的报文不合并也不拆分,只是添加 UDP 首部),支持一对一、一对多、多对一和多对多的交互通信
传输控制协议 TCP(Transmission Control Protocol)是面向连接的,提供可靠交付,有流量控制,拥塞控制,提供全双工通信,面向字节流(把应用层传下来的报文看成字节流,把字节流组织成大小不等的数据块),每一条 TCP 连接只能是点对点的(一对一)
2.UDP首部格式
首部字段只有 8 个字节,包括源端口、目的端口、长度、检验和。12 字节的伪首部是为了计算检验和临时添加的
3.三次握手
在socket编程中,客户端执行connect()时,将触发三次握手
在三次握手中只有3个状态SYN_SENT,SYN_RCVD,ESTABLISHED
在第一次握手中初始序列号为x,报文段不能携带数据,但要消耗一个序列号,第二次握手初始序列号为y确认号ack为x+1,第三次握手序列号为x+1,确认号为y+1,报文段可以携带数据,不携带数据则不会消耗序号
1.为什么要进行三次握手,两次握手不行吗?
如果客户端发起一个请求连接报文之后,因为网络堵塞等原因导致服务端长时间没有接收到,而客户端超时重新发送一个连接请求,在请求到达服务端并完成传输的数据之后,第一个在网络中滞留的请求包才到达服务端,服务端以为又是一个新的连接请求就发起确认,可是客户端却没有要建立这个连接发送的数据,那服务度就会一直等待浪费资源,如果采用三次握手,在客户端没有及时响应(一般会进行超时重传,超过系统规定最大次数之后,会在半连接队列中删除该连接请求)服务端之后,服务端则不再进行等待
2. 什么是半连接队列?
服务器在第一次接受到SYN之后,处于SYN_RCVD状态,此时双方还没有完全建立连接,服务器会把这种状态下的请求连接放入半连接队列中。
如果已经完成3次握手,建立好连接的会被放在全连接队列中,如果队列满了会有丢包现象。
3. ISN(Initial Sequence Number)是固定的吗?
ISN是根据时间动态变化的,如果是固定的,那很容易被攻击者进行攻击
4. 三次握手过程中可以携带数据吗?
在第一次和第二次握手的过程中是不可以携带数据的,第三次握手可以携带数据。第一次握手和第二次握手中还不知道服务端可客户端的接受和发送数据能力,如果攻击者直接伪造大量数据在第一次和第二次握手中不停发送连接请求,那将耗费大量资源来处理这些报文。对于第三次握手,客户端已经处于ESTABLISHED状态,并且已知道服务器接收和发送能力,再携带数据就没什么问题了
5.SYN攻击是什么?
攻击者刻意使用客户端并伪造很多不存在的ip地址向服务端发起连接请求,这样服务端不断回复确认,由于ip地址都是不存在的,这样又导致服务端不断重发直至超时,这样伪造的SYN包占满半连接队列后,有些正常的SYN包被丢弃,从而引起网络拥塞和系统瘫痪。SYN攻击是一种典型的Dos/DDos攻击
预防SYN攻击方法:缩短服务端超时时间,增加最大半连接数量,过滤网关防护,SYN cookies技术
4.四次挥手
在socket编程中,任何一方执行close()操作即可产生挥手操作
挥手为什么要四次?
tcp通信是全双工通信,前两次挥手是关闭客户端到服务端方向的,后面必须等到服务到数据报文发送完成之后才可以发送FIN报文进行关闭,所以是必须分开发送,需要四次挥手
为什么进入TIME_WAIT状态之后需要等待2MSL时间才进行关闭?(MSL是Maximum Segment Lifetime报文在网络中的最长生存时间)
主要是保证服务端在LAST_ACK状态下能够接受到客户端的确认关闭报文,网络是不可靠的,如果客户端发送的确认报文在网络中阻塞,不能到达服务端,那么客户端将及时重发,如果不等待2MSL时间直接关闭,该情况下服务端无法收到确认报文处于等待。
5.tcp包发送和接收流程(可靠性的实现)
tcp首部有源端口、目的端口、序号、确认号、数据偏移、保留、ACK、FIN、窗口、检验和、紧急指针、选项、填充
连接管理:采用三次握手和四次挥手进行连接和释放
序列号、确认号、检验和、重发控制:tcp通过给每一个需要发送的包编入一个序号,在接收方对包进行排序,利用检验和检验收到的数据是否有差错(重复丢失等问题),如果有差错,tcp将会丢弃和不确认这个报文段。如果没有差错会回复一个确认号表示已收到。收到确认之后再进行发送下一个。如果发送方在一定时间内没有收到该确认号,则会重新发送数据。
流量控制:通过滑动窗口的大小(取决于接收方缓存的大小)来控制发送方的发送速率,以实现流量控制,当窗口字段值为0时,发送方不能发送数据
拥塞控制:通过拥塞窗口控制,包括慢启动、拥塞避免、快速重启、快速恢复
应用层
1.DNS域名系统(53端口TCP/UDP,长度>512字节使用TCP)
2.FTP文件传输协议(20/21端口,TCP)
3.DHCP动态主机配置协议(67/68端口,UDP)
4. TELNET远程登录协议(23端口,TCP)
5.电子邮件协议(发送常用SMTP(25,TCP),读取常用POP3(110,TCP)、IMAP(143,TCP))
6.HTTP超文本传输协议(80端口,TCP)
本文有些知识是根据自己理解所写,如有错误,欢迎大佬指正