网络通讯:
就是要把特定意义的数据通过物理介质传送给对方。
把电信号变成有意义的数据:
以字节为单位分组,标识好每一组电信号的信息特征,按照分组的顺序来依次发送。
以太网规定:一组电信号为一个数据包,就是一帧。
OSI七层、TCP\IP四层、五层协议
每一层的协议
数据链路层
数据包必须是从一块网卡传送到另一块网卡,网卡地址就是MAC地址,MAC地址采用十六进制标识,共6个字节, 前三个字节是厂商编号,后三个字节是网卡流水号。
有了MAC地址以后,以太网采用广播形式,把数据包发给该子网内所有主机,子网内每台主机在接收到这个包以后,都会读取首部里的目标MAC地址,然后和自己的MAC地址进行对比,如果相同就做下一步处理,如果不同,就丢弃这个包。
数据链路层的主要工作就是对电信号进行分组并形成具有特定意义的数据帧,然后以广播的形式通过物理介质发送给接收方。
网络层
-
发送者如何知道接收者的MAC地址?
-
发送者如何知道接收者和自己同属一个子网?
-
如果接收者和自己不在同一个子网,数据包如何发给对方?
为了解决这些问题,网络层引入了三个协议,分别是IP协议、ARP协议、路由协议。
- IP协议
区分两台主机是否属于同一个网络
IP地址分类:A(0 ~ 127)B(128 ~ 191)C(192 ~ 223)D(224 ~ 239) E - ARP协议
地址解析协议,根据IP获取MAC地址 - 路由协议
提供了异构网互联的机制,就是用来确定到达目标ip的路径
网络层的主要工作是为不同的主机提供通信
传输层
链路层定义了主机的身份,即MAC地址, 而网络层定义了IP地址,明确了主机所在的网段,有了这两个地址,数据包就从可以从一个主机发送到另一台主机。
但是实际上数据包是从一个主机的某个应用程序发出,然后由对方主机的应用程序接收。
为了确定是哪个应用程序要接收这个数据包。
因此传输层引入了UDP协议来解决这个问题,为了给每个应用程序标识身份,UDP协议定义了端口,同一个主机上的每个应用程序都需要指定唯一的端口号,并且规定网络中传输的数据包必须加上端口信息。
UDP协议比较简单,实现容易,但它没有确认机制, 数据包一旦发出,无法知道对方是否收到,因此可靠性较差,为了解决这个问题,提高网络可靠性,TCP协议就诞生了。
TCP即传输控制协议,是一种面向连接的、可靠的、基于字节流的通信协议。
每发出一个数据包都要求确认,如果有一个数据包丢失,就收不到确认,发送方就必须重发这个数据包。
TCP的确认机制就是三次握手。
三次握手与四次挥手:
为什么需要三次握手呢?
为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。
比如:client发出的第一个连接请求报文段在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段,但是server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求,于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了,由于client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据,但server却以为新的运输连接已经建立,并一直等待client发来数据。所以没有采用“三次握手”,这种情况下server的很多资源就白白浪费掉了。
四次挥手
当主动关闭方发出FIN报文段时,表示主动关闭方已经没有数据要发送了,被动关闭方返回ACK报文段,表示已经知道主动关闭方没有数据发送了;当被动关闭方也发送了FIN报文段时,这时就表示被动关闭方也没有数据要发送了,如果收到主动关闭方确认报文段,被动关闭方进入关闭状态,主动关闭方在发出确认报文段后等待2MSL,在等待时间里如果没有接收到被动关闭方重新发送的FIN报文段时,主动关闭方进入关闭状态,之后彼此就会愉快的中断这次TCP连接。如果接收到重新发送的FIN报文段,则继续发送ACK确认报文。
说明:
1)SYN攻击 用众多伪造ip地址向服务器发送SYN=1(请求连接),让服务器处于SYN-RCVD状态,但都无法第三次握手(因为伪造ip不存在)
2)4次挥手中的FIN就相当于三次握手中的SYN。
3)序号seq,确认序号ack,确认标志位ACK作用还是一样的,就是确认作用(把seq加上1赋给ack,并把ACK置1)
什么是TCP连接
TCP连接是一种抽象的概念,表示一条可以通信的链路。
每个TCP连接有且仅有两个端点,表示通信的双方,且双方在任意时刻都可以作为发送者和接受者。
什么是套接字
一条TCP连接的两端就是两个套接字。
套接字 = IP地址 :端口号
因此,TCP连接 = (套接字1,套接字2)= (IP1:端口号1,IP2:端口号2)
TCP、UDP区别:
-
TCP就是有确认机制的UDP协议
-
UDP数据包由首部和数据两部分组成,首部长度为8个字节,主要包括源端口和目标端口;数据最大为65527个字节,整个数据包的长度最大可达到65535个字节。
-
TCP 数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常 TCP 数据包的长度不会超过IP数据包的长度,以确保单个TCP 数据包不必再分割。
TCP 协议 补充
-
使用滑动窗口机制来进行流量控制。
建立连接时,各端分配一个缓冲区用来存储接收的数据,并将缓冲区的尺寸发送给另一端。接收方发送的确认消息中包含了自己剩余的缓冲区尺寸。剩余缓冲区空间的数量叫做窗口。其实就是建立连接的双方互相知道彼此剩余的缓冲区大小。 -
拥塞控制
拥塞控制:防止过多的数据注入到网路中,这样可以使网络中的路由器或链路不至于阻塞。拥塞控制是一个全局性的过程,和流量控制不同,流量控制是点对点的控制。
1、慢开始:发送方维持一个叫做拥塞窗口cwnd(congestion window)的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态的变化。发送方让自己的发送窗口等于拥塞窗口,另外考虑到接收方的接收能力,发送窗口可能小于拥塞窗口。思路就是:不要一开始就发送大量的数据,先试探一下网络的拥塞程度,也就是说由小到大增加拥塞窗口的大小。
传输层的主要工作是定义端口,标识应用程序身份,实现端口到端口的通信,TCP协议可以保证数据传输的可靠性。(为不同的进程提供通信)
应用层
理论上讲,有了以上三层协议的支持,数据已经可以从一个主机上的应用程序传输到另一台主机的应用程序了,但此时传过来的数据是字节流,不能很好的被程序识别,操作性差。
因此,应用层定义了各种各样的协议来规范数据格式,常见的有 HTTP、FTP、SMTP 等,HTTP 是一种比较常用的应用层协议,主要用于B/S架构之间的数据通信。
HTTP VS HTTPS
HTTP特点:
无状态:协议对客户端没有状态存储,对事物处理没有“记忆”能力,比如访问一个网站需要反复进行登录操作
无连接:HTTP/1.1之前,由于无状态特点,每次请求需要通过TCP三次握手四次挥手,和服务器重新建立连接。比如某个客户机在短时间多次请求同一个资源,服务器并不能区别是否已经响应过用户的请求,所以每次需要重新响应请求,需要耗费不必要的时间和流量。
基于请求和响应:基本的特性,由客户端发起请求,服务端响应
简单快速、灵活
通信使用明文、请求和响应不会对通信方进行确认、无法保护数据的完整性
HTTPS特点:
基于HTTP协议,通过SSL或TLS提供加密处理数据、验证对方身份以及数据完整性保护
内容加密:采用混合加密技术,中间者无法直接查看明文内容
验证身份:通过证书认证客户端访问的是自己的服务器
保护数据完整性:防止传输的内容被中间人冒充或者篡改
Https协议握手阶段比较费时, Https连接缓存不如Http高效
HTTPS协议的加密范围也比较有限,在黑客攻击、拒绝服务攻击、服务器劫持等方面几乎起不到什么作用,但是会增加攻击成本
应用层的主要工作就是定义数据格式并按照对应的格式解读数据。