根据功能不同分为OSI七层协议、TCP/IP四层协议(TCP/IP五层协议是为了介绍网络原理设计,实际应用仍然是四层协议)
其中,OSI七层协议称为开放系统互连基本参考模型,是法律上的国际标准;
但是最后被广泛使用的是TCP/IP四层协议;
TCP/IP五层是为了方便网络原理分析,实际应用的让仍是四层协议。
物理层就是网线,交换机,路由器登一堆物理连接介质,负责发送信息被转化为计算机能认识的二进制的比特流。
数据链链路层就是对物理层要发送的比特流进行分组,即将数据信息的来源和目的地切分出来确认是正确的再读数据,一段比特流是一帧。
而共同遵守的分组协议就是以太网协议ethernet.
一组电信号为一帧----->一帧构成一个数据报
每一组数据报分为报头和数据两部分
head包括(固定18个字节)
data包括(最短46字节,最长1500字节)
head长度+data长度=最短64字节,最长1518字节,超过最大字节就分片发送
当局域网有一条发送端发送的广播数据,接收端先拆包,查看是不是和自己需要的mac地址匹配,匹配的话读数据,不匹配的话扔掉。
当存在以太网、mac地址、广播的发送方式,世界上的计算机就都可以通信了;
但是世界大网络是由一个个彼此隔离的局域网组成,以太网只能在一个局域网内发送,一个局域网是一个广播域,以太网的广播包只能在一个广播域内发送,跨广播域通信只能通过路由转发。
因此,需要一种方法来区分哪些计算机属于同一个广播域,哪些不是。
如果是,采用广播方式通信;
如果不是,则路由方式转发。
————网络层功能:引入一套新的地址来区分不同的广播域/子网,即网络地址
IP协议—用来确定对方局域网的位置
现在我们有ip+mac地址+广播方式,但是这仅仅找到了计算机的位置,我们与别人通过互联网通信根本上是通过应用软件之间的通信,计算机上有很多应用软件,因此,我们要确定软件的具体位置。
计算机上的不同应用软件有不同的端口,因此我们要确定的就是软件的端口。
传输层就是TCP/UDP协议也叫做端口工作协议,这样我们根据协议就可以找到任何一个软件的位置。
指每个软件自定义的一些协议
当客户端要给服务端发送请求,先以单播形式发送给交换机,交换机将请求数据包以广播的方式发送到所有网卡上,目标网卡解包如果发现是发给自己的,则读数据;如果不是则丢弃。
交换机在完成一次通信后,会将刚刚在进行通信的两个mac地址缓存下来,下次这个客户端发送请求时,交换机先在缓存表中查看是否有目标地址,如果有,直接将数据包发送给它,如果没有再使用广播的方式发送给局域网内的所有网卡。
在OSI七层协议中,ARP协议属于数据链路层,而在TCP/IP模型中,被归纳在网络层。
这里将它归纳为数据链路层。
ARP协议(Address Resolution Protocol)地址解析协议,根据目标IP地址获取目标物理地址的协议。
ARP协议分两种情况讨论:
同一局域网(网段,子网)
不同局域网(网段,子网)
mac地址是计算机的物理地址,它可以确定计算机在一个局域网的具体位置。
真实情况下:两台计算机之间通信,发送端可能不知道接收端的物理地址,但是一定要有接收端的IP地址。
然后借助ARP协议,通过IP地址获取接收端的MAC地址,然后在同一局域网以广播+以太网协议进行通信。
同一局域网中,ARP协议的流程(每个计算机都有一个ARP缓存区–ARP列表):
规定网络地址的协议叫做IP协议,它定义的地址称为IP地址,广泛使用的IPV4,它规定网络地址由32位2进制表示。
范围:0.0.0.0–255.255.255.255
一个IP地址通常写成四段十进制数
网络层的IP协议为我们区分子网,数据链路层的以太网为我们确定主机,传输层的作用就是确定要通信的主机上的应用程序
传输层功能:建立端口与端口的通信
端口范围:0-65535,0-1023为系统占用端口
传输层的端口协议:TCP协议,UDP协议
应用层功能:
因此:
应用层会获取客户端服务端的端口号和IP地址,以及一个合适的应用层协议
目前存在的应用层协议有:DNS,FTP,HTTP,telnet,Https,SMTP,POP3,SNMP等。
假如计算机1要向计算机2发送数据,简单的流程是什么样的?
所以,IP地址+端口号就可以确定世界上任意一台计算机上的目标软件。
UDP协议–User Datagram Protocol,用户数据报协议
特性:
不可靠的无连接协议、面向数据报、相对不安全的;
但是传输速率相对高、尽最大努力服务、无阻塞控制。
用于:
QQ聊天、微信、在线视频等对数据准确性和丢包要求比较低,但是速度必须快。
“报头”部分只有8个字节,总长度不超过65535字节,正好放进一个IP数据报:
以太网头 IP头 UDP头 数据
TCP协议–Transmission Control Protocol,传输控制协议
特性:
可靠的、面向连接的流式协议,相对安全的;
但是传输效率相对低。
用于:
文件传输、发送或者接受邮件,远程登录。
TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据报的长度不会超过IP数据报的长度,以确保单个TCP数据报不必再分割。总长度不超过65535字节。
以太网头 IP头 TCP头 数据
IP数据报: <-----65535------->
思路
这里显示为四次握手,是因为第2、3次握手可以合并为一次,服务端可以发送一个回应包既包含同意客户端与我建立连接、又包含我也向客户端建立连接的申请。
即为:
规范版本为:
图解:
SYN:请求,seq是一个随机的序列号
第一次握手:客户端发送请求SYN=1 随机序列号seq=x到服务端,服务端接收消息
第二次握手:服务端回一个ack=x+1,并且也发送了一个SYN=1,随机序列号seq=y,这个说明服务端同意了客户端的连接请求(客户端到服务端的连接通道建立完毕),并向客户端发送一个建立连接通道的请求;
第三次握手:客户端接受消息后,回复一个ack=y+1,消息到达服务端(服务端到客户端的连接通道建立完毕)。
接下来,客户端和服务端就可以互相发消息了。
当客户端向服务端消息发送完毕,应该将消息通道关闭(通道一直开启会占用资源),此时就需要TCP断开连接的四次挥手。
为什么断开连接需要四次挥手?2、3次整合成一次不可以嘛?
答:客户端向服务端发起断开连接请求时,说明客户端已经向服务端发送完毕数据了,所以请求断开连接,但是此时服务端向客户端的数据发送是否完成还不确定,服务端需要等待向客户端发送的数据全部完成后,才可以向客户端发起断开连接的请求,所以不能整合到一起。
规范版本:
图解:
第一次挥手:客户端向服务端发送完毕数据后,会向服务端发送一个FIN=1 seq=u的请求,服务端接收到这个请求;
第二次挥手:服务端接收到这个请求后,会向客户端发送一个ack=u+1的请求,同意断开连接,客户端接收到这个请求,断开了通往服务端的通道;
第三次握手:服务端向客户端发送的数据发送完毕后,向客户端发送一个FIN=1 seq=w的请求,客户端接收到这个请求;
第四次握手:客户端接收到这个请求后,会向服务端发送一个ack=w+1的请求,同意服务端断开连接,服务端接收到这个请求,断开通往客户端的通道。
断开连接与创建连接时是不一样的,断开连接时要保证数据传输已经结束,所以客户端向服务端发起断开请求时,表示客户端向服务端的数据发送已经完毕,因此客户端请求断开连接,但是此时服务端向客户端发送数据是否完毕无法确定,服务端需要等待向客户端发送的数据全部完成后,才向客户端发起断开连接请求,因此两次不能整合为一次。
TCP设有一个保活计数器,如果客户端出现故障,服务器不能一直等待下去,白白浪费资源。服务端每收到一次客户端的请求后都会重置这个计数器,时间通常设置为2小时,如果两小时还没有收到客户端的任何数据,服务端就会发送一个探测报文段,以后每隔75秒发送一次。若一连发送10个探测报文段仍然没反应,服务器就认为客户端出现故障,接着就关闭连接。
TCP协议也称为“好人协议”,因为TCP协议不会拒绝任何客户端连接,只要有客户端来连接,服务端就会回复一个ack然后向客户端发送SYN请求,等待客户端同意,在客户端没有同意之前,服务端会维护一个未连接队列,该队列为每个客户端的SYN包(syn=j)开设一个条目,该条目表明服务器已经收到客户端的SYN包,并已向客户端发出确认,在等待客户端的确认包。
这些条目所标识的连接在服务器处于Syn_RECV状态,当服务器收到客户的确认包时,删除该条目,服务器进入ESTABLISHED状态。
SYN洪水攻击: 利用TCP协议缺陷,通过发送大量的半连接请求,耗费CPU和内存资源,配合IP欺骗,SYN攻击能达到很好的效果。
比如: 客户端在短时间内伪造大量不存在的IP地址,向服务器不断发送syn包,服务器回复确认包,并等待客户端的确认,由于源地址是不存在的,服务器需要不断重复发送直至超时,这些伪造的syn包将长时间占用未连接队列,正常的syn请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。