计算机基础
- 1.五层模型各层功能及传输功能
- 2.各层协议
- 1.数据链路层(MAC)
- 2.网络层(ARP,RARP,ICMP,IP)
- 3.传输层(TCP/UDP)
- 4.应用层(HTTP/DNS/FTP/SMTP)
1.五层模型各层功能及传输功能
层级 | 协议 | 数据格式 |
---|---|---|
应用层 | HTTP,DNS,FTP,SMTP等 | Data(数据) |
传输层 | TCP, UDP | Segment(数据段) |
网络层 | ARP,RARP,ICMP,IP | Packet(数据包) |
数据链路层 | MAC | Frame(数据帧) |
物理层 | 光纤/电缆/微波 | bit(比特位) |
应用层:通过应用进程间的交互来完成特定网络应用。
传输层:为上层协议提供端到端的可靠和透明的数据传输服务,向高层屏蔽了下层数据通信的细节,使高层用户看到的只是在两个传输实体间的一条主机到主机的、可由用户控制和设定的、可靠的数据通路。
网络层:在 计算机网络中进行通信的两个计算机之间可能会经过很多个数据链路,也可能还要经过很多通信子网。网络层的任务就是选择合适的网间路由和交换结点, 确保数据及时传送。
数据链路层:通过校验、确认和反馈重发等手段,将不可靠的物理链路转换成对网络层来说无差错的数据链路。
物理层:利用传输介质为数据链路层提供物理连接。
2.各层协议
1.数据链路层(MAC)
1.寻址:MAC地址
-
MAC地址概念:也叫物理地址、硬件地址或链路地址,由网络设备制造商生产时写在硬件内部。
-
MAC地址表示方法:MAC地址的长度为48位(6个字节),通常表示为12个16进制数,每2个16进制数之间用冒号隔开,如:08:00:20:0A:8C:6D就是一个MAC地址,其中前6位16进制数08:00:20代表网络硬件制造商的编号,它由IEEE(Istitute of Electrical and Electronics Engineers,电气与电子工程师协会)分配,而后3位16进制数0A:8C:6D代表该制造商所制造的某个网络产品(如网卡)的系列号。每个网络制造商必须确保它所制造的每个以太网设备都具有相同的前三字节以及不同的后三个字节。这样就可保证世界上每个以太网设备都具有唯一的MAC地址。
-
IP地址与MAC地址:
-
ip地址是逻辑地址,地址的分配是基于网络拓朴,Mac地址是物理地址,地址的分配是基于制造商
-
IP地址为32位,MAC地址为48位
-
MAC地址不够灵活,每个设备出厂就确定了,如果用MAC地址来寻址,如果网卡坏了,更换另一个网卡,地址就要改变,会给实际应用带来很大麻烦,因此使用MAC不现实。
但是IP地址又太灵活,因为IP地址是逻辑的,理论上每个人可以随便输入,虽然IP分配的时候是唯一的,但是谁也不能保证网络中不出现重复的IP地址。
-
2.交换机:
- 交换机:
- 自主学习,即插即用。交换机维护了一个交换机表(类似于路由表,只是使用的是MAC地址),初始化时,它会向与之相连的节点进行广播以获取它们的MAC地址,然后当一个节点很久没有接入到链路中时,则从交换机表中删除该MAC地址。
- 交换拥有过滤和转发的功能,过滤是决定一个帧应该转发到某个接口还是应当将其丢弃的交换机功能;转发是决定一个帧应该被导向哪个接口。
- 在使用交换机构建的局域网中,不会因为碰撞而浪费带宽,并且不同链路能够以不同的速率运行在不同的媒体上,因此,对于原有的设备与新设备混用,交换机是理想的。
- 交换机和路由器区别:
- 交换机是第二层的分组交换机,而路由器是第三层的分组交换机。
- 交换机即插即用
- 大型交换网络中要求主机和路由器中由大量的ARP表,这将生成可观的ARP流量和处理量。
3.差错检查和纠正比特
奇偶校验法
奇偶校验法的思路很简单,就是在数据帧中增加一个比特位使数据帧为奇数称为奇校验,为偶数称为偶校验。接收方接收到数据后只需检测数据帧为奇数还是偶数。但显然这样简单的做法会带来一些问题,虽然同一数据帧多个比特位都被噪声干扰产生比特变化的概率很低,但这样的情况一旦发生了,该差错检验方法就没有起到作用。同时奇偶校验法只能检测差错而不能纠正错误。
校验和法
- 将所有比特字进行相加
- 将比特字相加的结果转换为其反码(如果有溢出,它要被回卷),作为其检验和
- 接收方将所有比特字相加(包括检验和),查看结果是否全为1。
循环冗杂检测(CRC)编码
- 发送方和接收方协商一个r+1比特模式,称为生成多项式,我们将其表示为G
- 对于一个给定的数据段D,发送方要选择r个附加比特R,并将它们附加到D上,使之得到的d+r模式用模2运算恰好能被G整除。
- 接收方用G去除接收到的d+r比特,如果余数为零则无差错,否则则认为数据出错丢弃该帧。
4.信道分类
时分复用
- 将时间分割为一个或多个时间帧(与前面提到的数据帧不一样),并进一步划分每个时间帧为N个时隙。
- 为每条链路分配一个时隙
- 每条链路在分配到的时隙内进行数据传输
频分复用
- 与时分复用类似,所谓频分复用是把带宽划分为多个信道分配给每条链路,数据在分配好的频率下进行传输
码分复用
- 码分复用对每个节点分配一种不同的编码,然后每个节点用它唯一的编码来对它发送的数据进行编码
2.网络层(ARP,RARP,ICMP,IP)
1.IP
IP报文(32个字节)
-
IP报文图
-
IP报头各字段
- 版本号(Version)4:标识目前采用的IP协议的版本号。一般的值为0100(IPv4),IPv6的值(0110)
- 头部长度(Header Length)4:这个字段的作用是为了描述IP包头的长度,因为在IP包中有变长的可选部分。
- 服务类型(Type of Service)8:这是一个高级选项,由路由器管理员控制,可以为特定用户(VIP)提供特定等级的服务
- 总长(Total Length)16: IP数据报的总长度,IP包最大长度65535字节。
- 标识符(Identifier)16:该字段和标记(Flags)和分段序号(Fragment Offset)字段联合使用,对大的上层数据包进行分段(fragment)操作,用于保证IP分片后组装的顺序性和丢包等差错检测.
- 标记(Flags)3:该字段第一位不使用。第二位是DF位,DF位设为1时表明路由器不能对该上层数据包分段。如果一个上层数据包无法在不分段的情况下进行转发,则路由器会丢弃该上层数据包并返回一个错误信息。第三位是MF位,当路由器对一个上层数据包分段,则路由器会在除了最后一个分段的IP包的包头中将MF位设为1。
- 分段序号(Fragment Offset)13:该字段对包含分段的上层数据包的IP包赋予序号。由于IP包在网络上传送的时候不一定能按顺序到达,这个字段保证了目标路由器在接受到IP包之后能够还原分段的上层数据包。到某个包含分段的上层数据包的IP包在传送是丢失,则整个一系列包含分段的上层数据包的IP包都会被要求重传。
- 生存时间(TTL)8:TTL长度8 bit,最大值是255,TTL的一个推荐值是64。虽然从字面上翻译,TTL是IP数据包在计算机网络中的存在的最长时间。但实际上TTL是IP数据包在网络中可以转发的最大跳数。TTL字段由IP数据包的发送者设置,在IP数据包从源到目的的整个转发路径上,每经过一个路由器,把该TTL的值减1,然后再将IP包转发出去。如果在IP包到达目的IP之前,TTL减少为0,路由器将会丢弃收到的TTL=0的IP包并向发送者发送 ICMP time exceeded消息。TTL的主要作用是避免IP包在网络中的无限循环和收发,节省了网络带宽,并能使IP包的发送者能收到告警消息。这个字段可以防止由于故障而导致IP包在网络中不停被转发。
- 首部检验和16(Head checksum):用于检测比特错误
- 起源和目标地址32(Source and Destination Addresses):这两个字段都是32比特,每台主机和路由器都有一个IP地址(不一定时公网IP),当某源生成一个数据报时,它在源IP字段中插入它的IP地址,在目的IP地址字段中插入其最终目的地的地址
- 选项: 选项字段允许IP首部被扩展
- 数据: payload,需要传输的数据
IP地址
-
网络地址
IP地址由网络号(包括子网号)和主机号组成,网络地址的主机号为全0,网络地址代表着整个网络。
-
广播地址
广播地址通常称为直接广播地址,是为了区分受限广播地址。
广播地址与网络地址的主机号正好相反,广播地址中,主机号为全1。当向某个网络的广播地址发送消息时,该网络内的所有主机都能收到该广播消息。
-
组播地址
D类地址就是组播地址。
先回忆下A,B,C,D类地址吧:
-
A类地址以0开头,第一个字节作为网络号,地址范围为:0.0.0.0~127.255.255.255;
-
B类地址以10开头,前两个字节作为网络号,地址范围是:128.0.0.0~191.255.255.255;
-
C类地址以110开头,前三个字节作为网络号,地址范围是:192.0.0.0~223.255.255.255。
-
D类地址以1110开头,地址范围是224.0.0.0~239.255.255.255,D类地址作为组播地址(一对多的通信);
-
E类地址以1111开头,地址范围是240.0.0.0~255.255.255.255,E类地址为保留地址,供以后使用。
注:只有A,B,C有网络号和主机号之分,D类地址和E类地址没有划分网络号和主机号。
-
-
255.255.255.255
该IP地址指的是受限的广播地址。受限广播地址与一般广播地址(直接广播地址)的区别在于,受限广播地址只能用于本地网络,路由器不会转发以受限广播地址为目的地址的分组;一般广播地址既可在本地广播,也可跨网段广播。例如:主机192.168.1.1/30上的直接广播数据包后,另外一个网段192.168.1.5/30也能收到该数据报;若发送受限广播数据报,则不能收到。
注:一般的广播地址(直接广播地址)能够通过某些路由器(当然不是所有的路由器),而受限的广播地址不能通过路由器。
-
0.0.0.0
常用于寻找自己的IP地址,例如在我们的RARP,BOOTP和DHCP协议中,若某个未知IP地址的无盘机想要知道自己的IP地址,它就以255.255.255.255为目的地址,向本地范围(具体而言是被各个路由器屏蔽的范围内)的服务器发送IP请求分组。
-
回环地址
127.0.0.0/8被用作回环地址,回环地址表示本机的地址,常用于对本机的测试,用的最多的是127.0.0.1。
-
A、B、C类私有地址
私有地址(private address)也叫专用地址,它们不会在全球使用,只具有本地意义。
A类私有地址:10.0.0.0/8,范围是:10.0.0.0~10.255.255.255
B类私有地址:172.16.0.0/12,范围是:172.16.0.0~172.31.255.255
C类私有地址:192.168.0.0/16,范围是:192.168.0.0~192.168.255.255
子网掩码及网络划分
ip地址是由权威机构分发的,但是不可能让一个结构给全世界每个人发一个ip地址。更合理的做法是采用之前应用过的分布式的思想,某机构向权威机构申请一部分ip地址 => 该机构向其内部人员发放ip地址。这样怎么进行划分就成了一个问题,你总不可能随机分配吧(不利于管理),所以这里就有了子网掩码的概念。223.0.0.0/24 中/24就是子网掩码,它表示该子网前24个比特位不变,后8位可以由该子网自由分配。也就是说该机构拿到了这块地址后,就可以向内部人员分配223.0.0.1,223.0.0.2,223.0.0.99…这样互联网就被划分为了许许多多的子网络
子网掩码是标志两个IP地址是否同属于一个子网的,也是32位二进制地址,其每一个为1代表该位是网络位,为0代表主机位。它和IP地址一样也是使用点式十进制来表示的。如果两个IP地址在子网掩码的按位与的计算下所得结果相同,即表明它们共属于同一子网中。子网掩码最多30位(规定子网最少容纳两台主机)。
在计算子网掩码时,我们要注意IP地址中的保留地址,即“ 0”地址和广播地址,它们是指主机地址或网络地址全为“ 0”或“ 1”时的IP地址,它们代表着本网络地址和广播地址,一般是不能被计算在内的。
子网掩码的计算:
- 对于无须再划分成子网的IP地址来说,其子网掩码非常简单,即按照其定义即可写出:如某B类IP地址为 10.12.3.0,无须再分割子网,则该IP地址的子网掩码255.255.0.0。如果它是一个C类地址,则其子网掩码为 255.255.255.0。其它类推,不再详述。下面我们关键要介绍的是一个IP地址,还需要将其高位主机位再作为划分出的子网网络号,剩下的是每个子网的主机号,这时该如何进行每个子网的掩码计算。
-
利用子网数来计算
在求子网掩码之前必须先搞清楚要划分的子网数目,以及每个子网内的所需主机数目。
-
将子网数目转化为二进制来表示;
如欲将B类IP地址168.195.0.0划分成27个子网:27=11011;
-
取得该二进制的位数,为N;
该二进制为五位数,N = 5
-
取得该IP地址的类子网掩码,将其主机地址部分的的前N位置1即得出该IP地址划分子网的子网掩码。
将B类地址的子网掩码255.255.0.0的主机地址前5位置 1,得到 255.255.248.0
-
-
利用主机数来计算
如欲将B类IP地址168.195.0.0划分成若干子网,每个子网内有主机700台:
-
将主机数目转化为二进制来表示;
700=1010111100;
-
如果主机数小于或等于254(注意去掉保留的两个IP地址),则取得该主机的二进制位数,为N,这里肯定 N<8。如果大于254,则 N>8,这就是说主机地址将占据不止8位
该二进制为十位数,N=10;
-
使用255.255.255.255来将该类IP地址的主机地址位数全部置1,然后从后向前的将N位全部置为 0,即为子网掩码值。
将该B类地址的子网掩码255.255.0.0的主机地址全部置1,得到255.255.255.255,然后再从后向前将后 10位置0,即为:11111111.11111111.11111100.00000000,即255.255.252.0。这就是该欲划分成主机为700台的B类IP地址 168.195.0.0的子网掩码。
-
-
根据每个网络的主机数量进行子网地址的规划和计算子网掩码
比如一个子网有10台主机,那么对于这个子网需要的IP地址是:
10+1+1+1=13
注意:加的第一个1是指这个网络连接时所需的网关地址,接着的两个1分别是指网络地址和广播地址。
因为13小于16(16等于2的4次方),所以主机位为4位。而256-16=240,所以该子网掩码为255.255.255.240。
如果一个子网有14台主机,不少人常犯的错误是:依然分配具有16个地址空间的子网,而忘记了给网关分配地址。这样就错误了,因为14+1+1+1=17,17大于16,所以我们只能分配具有32个地址(32等于2的5次方)空间的子网。这时子网掩码为:255.255.255.224。
ipv4和ipv6的转换
ipv4(32比特位的IP地址)和ipv6(128位比特位的IP地址)的过渡是一个循序渐进的过程,在用户体验IPv6带来的好处的同时仍能与网络中其余的IPv4用户通信。
主流技术:
-
- 双栈策略:(最直接方式)在IPv6结点中加入IPv4协议栈。这种具有双协议栈的结点称作“IPv6/v4结点”,这些结点可以使用IPv4与IPv4结点互通,也可以直接使用IPv6与IPv6结点互通。
-
-
隧道技术:(为解决局部纯IPv6网络与IPv4骨干隔离形成的孤岛问题,用隧道技术的方式解决)利用穿越现存IPv4互联网的隧道技术将孤岛连接起来,逐步扩大IPv6的实现范围。在隧道的入口处,路由器将IPv6的数组分组封装进入IPv4中,IPV4分组的源地址和目的地址分别是隧道入口和出口的IPV4地址。在隧道的出口处再将IPV6分组取出转发给目的节点。
隧道技术在实践中有四种具体形式:构造隧道、自动配置隧道、组播隧道以及6to4。
-
-
- 隧道代理TB,Tunnel Broker。(目的是简化隧道的配置,提供自动的配置手段),TB可以看作是一个虚拟的IPv6 ISP,它为已经连接到IPv4网络上的用户提供连接到IPv6网络的手段,而连接到IPv4网络上的用户就是TB的客户。
-
- 协议转换技术。其主要思想是在V6节点与V4节点的通信时需借助于中间的协议转换服务器,此协议转换服务器的主要功能是把网络层协议头进行V6/V4间的转换,以适应对端的协议类型。
-
-
SOCKS64。
在客户端里引入SOCKS库,它处于应用层和socket之间,对应用层的socket API和DNS域名解析API进行替换。
另一种是SOCKS网关。
-
-
-
传输层中继
与SOCKS64的工作机理相似,只不过是在传输层中继器进行传输层的“协议翻译”
-
-
-
应用层代理网关(ALG)
类似。在应用层进行协议翻译。
-
2.ICMP(网间控制报文协议Internet control message Protocol)
1.ICMP简述
- ICMP 是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。
- ICMP基于IP协议,也就是说,一个ICMP包需要封装在IP包中,然后在互联网传送。ICMP是IP套装的必须部分,任何一个支持IP协议的计算机,都要同时实现ICMP。
2.ICMP传输的控制信息
错误(error)信息
:这一类信息可用来诊断网络故障。IP协议的工作方式是“Best Effort”,如果IP包没有被传送到目的地,或者IP包发生错误,IP协议本身不会做进一步的努力。但上游发送IP包的主机和接力的路由器并不知道下游发生了错误和故障,它们可能继续发送IP包。通过ICMP包,下游的路由器和主机可以将错误信息汇报给上游,从而让上游的路由器和主机进行调整。咨询(Informational)信息
:比如某台计算机询问路径上的每个路由器都是谁,然后各个路由器同样用ICMP包回答
3.ICMP包组成(Type, Code和Checksum三部分):
- 类型:指明该数据包属于什么类型(大分类),长度1个字节。
- 代码:指明数据包属于大类里面的哪个小类,长度1个字节。类型字段与代码字段共同决定ICMP数据包类型,以及后续字段含义。
- 校验和: 指明该数据包的校验和,长度2个字节。该校验和覆盖整个ICMP数据包
4.常见的ICMP包类型
- 0(Echo Reply):属于咨询信息,ping命令就是利用了该类型的ICMP包。
- 3(Destination Unreachable)属于错误信息。如果一个路由器接收到一个IP包,不知道下一步往哪里发送,就会向出发主机发送该类型的ICMP包。
- 11(Time Exceeded)属于错误信息。IPv4中的Time to Live(TTL)会随着经过的路由器而递减,当这个区域值减为0时,就认为该IP包超时(Time Exceeded)。traceroute就利用了这种类型的ICMP包,它向目的地发送IP包,第一次的时候,将TTL设置为1,引发第一个路由器的Time Exceeded错误。这样,第一个路由器回复ICMP包,从而让出发主机知道途径的第一个路由器的信息。随后TTL被设置为2、3、4,...,直到到达目的主机。这样,沿途的每个路由器都会向出发主机发送ICMP包来汇报错误。traceroute将ICMP包的信息打印在屏幕上,就是接力路径的信息了
5.ping连接过程(测试网络连通性)
-
ping 程序用来探测主机到主机之间是否可通信,如果不能ping到某台主机,表明不能和这台主机建立连接。ping 使用的是ICMP协议,它发送icmp回送请求消息给目的主机。ICMP协议规定:目的主机必须返回ICMP回送应答消息给源主机。如果源主机在一定时间内收到应答,则认为主机可达。
假定主机A的IP地址是192.168.1.1,主机B的IP地址是192.168.1.2,都在同一子网内,则当你在主机A上运行“Ping 192.168.1.2”后,都发生了些什么呢?
首先,Ping命令会构建一个固定格式的ICMP请求数据包,然后由ICMP协议将这个数据包连同地址“192.168.1.2”一起交给IP层协议(和ICMP一样,实际上是一组后台运行的进程),IP层协议将以地址“192.168.1.2”作为目的地址,本机IP地址作为源地址,加上一些其他的控制信息,构建一个IP数据包,并在通过 ARP 协议查找出IP地址192.168.1.2所对应的物理地址,一并交给数据链路层。后者构建一个数据帧,目的地址是IP层传过来的物理地址,源地址则是本机的物理地址,还要附加上一些控制信息,依据以太网的介质访问规则,将它们传送出去。
主机B收到这个数据帧后,先检查它的目的地址,并和本机的物理地址对比,如符合,则接收;否则丢弃。接收后检查该数据帧,将IP数据包从帧中提取出来,交给本机的IP层协议。同样,IP层检查后,将有用的信息提取后交给ICMP协议,后者处理后,马上构建一个ICMP应答包,发送给主机A,其过程和主机A发送ICMP请求包到主机B一模一样
3.ARP(地址解析协议 Address Resolution Protocol)
1.ARP简述
- 地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。地址解析协议是建立在网络中各个主机互相信任的基础上的,网络上的主机可以自主发送ARP应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存;由此攻击者就可以向某一主机发送伪ARP应答报文,使其发送的信息无法到达预期的主机或到达错误的主机,这就构成了一个ARP欺骗。ARP命令可用于查询本机ARP缓存中IP地址和MAC地址的对应关系、添加或删除静态对应关系等
2.ARP工作流程举例
- 主机A的IP地址为192.168.1.1,MAC地址为0A-11-22-33-44-01;
- 主机B的IP地址为192.168.1.2,MAC地址为0A-11-22-33-44-02;
- 当主机A要与主机B通信时,地址解析协议可以将主机B的IP地址(192.168.1.2)解析成主机B的MAC地址,以下为工作流程:
- (1)根据主机A上的路由表内容,IP确定用于访问主机B的转发IP地址是192.168.1.2。然后A主机在自己的本地ARP缓存中检查主机B的匹配MAC地址。
- (2)如果主机A在ARP缓存中没有找到映射,它将询问192.168.1.2的硬件地址,从而将ARP请求帧广播到本地网络上的所有主机。源主机A的IP地址和MAC地址都包括在ARP请求中。本地网络上的每台主机都接收到ARP请求并且检查是否与自己的IP地址匹配。如果主机发现请求的IP地址与自己的IP地址不匹配,它将丢弃ARP请求。
- (3)主机B确定ARP请求中的IP地址与自己的IP地址匹配,则将主机A的IP地址和MAC地址映射添加到本地ARP缓存中。
- (4)主机B将包含其MAC地址的ARP回复消息直接发送回主机A。
- (5)当主机A收到从主机B发来的ARP回复消息时,会用主机B的IP和MAC地址映射更新ARP缓存。本机缓存是有生存期的,生存期结束后,将再次重复上面的过程。主机B的MAC地址一旦确定,主机A就能向主机B发送IP通信了。
4.RARP(反向地址解析协议 Reversed Address Resolution Protocol)
1.RARP简述
- 逆地址解析协议,即RARP,功能和ARP协议相对,其将局域网中某个主机的物理地址转换为IP地址,比如局域网中有一台主机只知道物理地址而不知道IP地址,那么可以通过RARP协议发出征求自身IP地址的广播请求,然后由RARP服务器负责回答。
2.RARP工作流程举例
- (1)给主机发送一个本地的RARP广播,在此广播包中,声明自己的MAC地址并且请求任何收到此请求的RARP服务器分配一个IP地址;
- (2)本地网段上的RARP服务器收到此请求后,检查其RARP列表,查找该MAC地址对应的IP地址;
- (3)如果存在,RARP服务器就给源主机发送一个响应数据包并将此IP地址提供给对方主机使用;
- (4)如果不存在,RARP服务器对此不做任何的响应;
- (5)源主机收到从RARP服务器的响应信息,就利用得到的IP地址进行通讯;如果一直没有收到RARP服务器的响应信息,表示初始化失败
3.传输层(TCP/UDP)
1.TCP协议报文结构
-
源头端口16位,目标端口16位,序列号32位,首部长度4位,保留位6位,控制代码6位,接受窗口16位
-
序号和确认号:用于建立连接(创建传输信道),断开连接。同时也是实现可靠数据传输的关键。
-
首部长度和保留未用:TCP首部的长度是可变的,首部长度字段用于将首部与数据字段区分开。保留未用如其名,为保留字段。
-
URG,ACK,PSH,RST,SYN,FIN:URG(urgent紧急), ACK(acknowledgement 确认) PSH(push传送) RST(reset重置), SYN(synchronous建立联机) FIN(finish结束)
各占一个比特位。ACK比特用于指示字段中的值是有效的,RST,SYN和FIN用于建立和断开连接,URG用于标记报文段是否为“紧急”的数据,PSH被置1时,接收方应该立即将数据交给上传。(实践中,PSH,URG并没有使用)
-
紧急数据指针:指向紧急数据尾部的指针,与URG配合使用。(实践中并没有用到)
-
接收窗口:用于流量控制。
-
选项:通常为空,该字段用于发送方与接收方协商最大报文字段长度时,或在告诉网络环境下用作窗口调节因子时使用。
2.TCP三次握手
1.TCP三次握手详解
- 客户端发送一个syn=1连接请求和一个序列号seq=x,然后客户端进入syn_send状态,等待服务器的确认
- 服务器收到客户端的syn请求,需要对syn进行确认于是将ack=x+1,然后将序列号seq=y;最后将上述信息放到一个报文段中发送给客户端,服务器进入syn_receive状态
- 客户端收到服务端的确认信息,ack=y+1,seq=x+1,向服务端发送ack确认报文。该报文发送完毕后连接建立完成
2.为什么要进行TCP三次握手?
-
三次握手的目的是建立可靠的通信信道,说到通讯,简单来说就是数据的发送与接收,而三次握手最主要的目的就是双方确认自己与对方的发送与接收是正常的。
-
第一次握手:Client 什么都不能确认;Server 确认了对方发送正常,自己接收正常
-
第二次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:对方发送正常,自己接收正常
-
第三次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:自己发送、接收正常,对方发送、接收正常
所以三次握手就能确认双发收发功能都正常,缺一不可。
3.第2次握手传回了ACK,为什么还要传回SYN?
- 接收端传回发送端所发送的ACK是为了告诉客户端,我接收到的信息确实就是你所发送的信号了,这表明从客户端到服务端的通信是正常的。而回传SYN则是为了建立并确认从服务端到客户端的通信。
4.如果已经建立了连接,但是客户端突然出现了故障,怎么办?
- TCP设有一个计时器,客户端如果出现故障,服务器端不能一直等待下去,白白浪费资源。服务器端每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器端就会发送一个探测包,以后每隔75秒钟发送一次。若一连发送10个探测包仍然没反应,服务器端就认为客户端出了故障,接着就关闭连接。
5.什么是TCP半连接?
在三次握手过程中,服务器端发送SYN、ACK后,收到客户端的ACK之前的TCP连接称为半连接,此时服务器端处于SYN_RCVD状态,当收到ACK之后,服务器端进入Established状态
6.什么是SYN攻击
- SYN攻击就是Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server则回复确认包,并等待Client确认,由于源地址不存在,因此Server需要不断重发直至超时,这些伪造的SYN包将长时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络拥塞甚至系统瘫痪
7.怎么检测和预防SYN攻击?
- 检测:使用命令netstat -nap | grep SYN_RECV
- 预防:降低主机的等待时间使主机尽快的释放半连接的占用,短时间受到某IP的重复SYN则丢弃后续请求
3.TCP四次挥手
1.TCP四次挥手详解
- 客户端发送一个fin=1连接关闭的请求,序号seq=u,客户端的进入fin_wait_1状态
- 服务端收到连接释放报文段后即发出确认报文段,(ACK=1,确认号ack=u+1,序号seq=v),客户端进入fin_wait_2状态
- 服务端向客户端发送FIN报文段,请求关闭连接,同时主机2进入LAST_ACK状态(FIN=1,ACK=1,序号seq=w,确认号ack=u+1)
- 客户端收到服务端的fin报文,向客户端发送ack报文然后进入time_wait状态。服务端收到报文后关闭连接。客户端等待两个msl时间后关闭连接(ACK=1,seq=u+1,ack=w+1)
2.为什么进行TCP四次挥手
- 因为tcp是全双工模式,当主机1发送fin报文表示主机1没有数据要发送了,主机2收到该报文发送一个ack确认报文表示我知道主机没有要发送的数据了,但主机1还可以接收报文,主机2发送一个fin到主机1,主机1收到后表示我知道主机2也没有数据要发送了。然后双方再愉快的分手
3.为什么等待2msl
- 保证tcp的全双工连接能正常关闭。如果客户端直接关闭,那么ack报文可能因为网络问题导致服务端没有收到客户端的ack确认请求。那么服务端会重新发送fin报文但此时客户端已经关闭该连接因此找不到与服务端对应的连接。
- 保证此次连接的数据段从网络中消失。如果客户端直接关闭连接,然后马上建立下一次连接,那么有可能新老连接使用的是同一个端口,旧连接因网络原因滞留在网络中的某些数据就会在新连接建立后到达服务端,这样新老连接的数据教会发生混淆
- msl表示报文最大生存时间,2msl表示发送接收一个来回报文的最大生存时间
4.什么是TCP半关闭?
- 任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后就完全关闭了TCP连接。
4.TCP协议如何来保证数据的顺序性
1.流量控制
- 控制发送方的发送速度,让接收方来得及接收而不至于数据丢失。
- 使用滑动窗口机制,a向b发数据,建立连接时b告诉a我的接收窗口rwnd=n,因此发送窗口的字节量不能大于该窗口。当报文某一字段丢失b会向a发送一个ack报文,Ack=1,ack=上次接收到的序列号队尾+1,新的rwnd;当接收窗口满了也会发送ack报文,当数据全部接受会发送一个ack,rwnd=0
2.拥塞控制
- 发送方维持一个拥塞窗口cwnd,该窗口的大小随网络拥塞程度动态变化
- 慢开始算法:建立连接时将cwnd设置为最大报文段mss的数值,试探性发送,收到确认信息后逐倍加大cwnd的大小。cwnd有一个门限值,当cwnd < 门限则使用慢开始算法,大于使用拥塞避免,等于则两者即可。
- 拥塞避免:与慢开算法相比,cwnd不再是逐倍数放大,而是每次加1,让其线性缓慢增长
- 快重传:要求接收方收到一个失序报文后立即发出确认报文而不是等到需要自己发送数据时在携带该信息。当收到连续3个重复的确认信息时发送方立即重传该缺失报文
- 快恢复:当发送方连续收到三个重复确认信息后,将慢开始门限减半,然后不执行慢开始而是使用拥塞避免算法使cwnd窗口线性增大
5.TCP协议怎么保证数据的可靠传输
1.校验和重传
- 校验策略是说每一个tcp数据都会带着数据的校验和,服务端接收到tcp数据首先会验证校验和,如果验证不对,服务端将丢弃这个tcp数据和不确认收到此报文段(希望发送方重发该数据)。
- 重传策略是说,每一次数据发送是客户端都会同时起一个定时器,如果在指定时间内没有接收到服务端的确认,就把数据再发一次。定时器时长是一个动态变化的过程,简单来说是由当前网络的拥塞程度和之前定时器时长的加权平均值确立的,但对于使用快恢复算法之后的定时器则只跟当前网络拥塞程度有关
6.TCP粘包,TCP拆包
1.TCP粘包和TCP拆包是什么?
-
通过前面的学习我们知道,TCP协议是面向字节流需要通过Socket获取(/上传)数据。Socket大门不可能是无限大的,它存在一个最大长度。报文大小与Socket大小有下面情况
-
如上图中的第一根bar所示,服务端一共读到两个数据包,每个数据包都是完成的,并没有发生粘包的问题,
-
服务端仅收到一个数据包,这个数据包包含客户端发出的两条消息的完整信息,这个时候基于第一种情况的逻辑实现的服务端就蒙了,因为服务端并不能很好的处理这个数据包,甚至不能处理,这种情况其实就是TCP的粘包问题。
-
服务端收到了两个数据包,第一个数据包只包含了第一条消息的一部分,第一条消息的后半部分和第二条消息都在第二个数据包中,或者是第一个数据包包含了第一条消息的完整信息和第二条消息的一部分信息,第二个数据包包含了第二条消息的剩下部分,这种情况其实是发送了TCP拆包问题,因为发生了一条消息被拆分在两个包里面发送了,同样上面的服务器逻辑对于这种情况是不好处理的
2.什么情况下会发生TCP粘包?
- TCP连接复用造成的粘包问题
- TCP默认使用Nagle算法,该算法会导致TCP粘包
- 数据包过大造成的粘包问题
- 网络拥塞造成的TCP粘包
- 接收方不及时接受缓存区的包,造成一次接受多个包
3.如何处理粘包、拆包?
- 使用带消息头的协议、消息头存储消息开始标识及消息长度信息,服务端获取消息头的时候解析出消息长度,然后向后读取该长度的内容。
- 设置定长消息,服务端每次读取既定长度的内容作为一条完整消息,当消息不够长时,空位补上固定字符。
- 设置消息边界,服务端从网络流中按消息编辑分离出消息内容,一般使用‘\n’。
- 更为复杂的协议,例如楼主最近接触比较多的车联网协议808,809协议
7.UDP报文结构
- 源端口号,目的端口号:目的端口号是为了报文到站后寻找合适的socket,那么为什么要把源端口号也带上呢?因为连接是全双工模式,也就是说接收方既是发送方也是接收方,当接收方想反馈信息给发送方时只需要从报文中获取源端口号作为反馈报文的目的端口号即可。
- 长度:一组报文的长度,用于分割报文组同时检测是否出现丢包现象。
- 校验和:16比特位,用于检验报文是否在发送过程中受外界干扰出现了比特改变的情况。(我们知道数据最终是由电缆或光缆或电磁波传递的,物理学上外界环境可能会影响这些信号,比如使得高电平变为低电平对应到比特位就是将1变为了0)
- 校验原理:将udp报文中的所有16位比特字进行相加
将比特字相加的结果转换为其反码(如果有溢出,它要被回卷),作为其检验和
接收方将所有16位比特字相加(包括检验和),查看结果是否为1111111111111111
产生了溢出将进行回卷,所谓回卷是指舍弃高位进位而在最低位+1)
8.udp的特性
- udp是无连接的。也就是说使用udp协议传输报文,不需要事先建立一条信息通道,而是添加首部后直接交给网络层
- udp提供不可靠交互。之前讲解udp报文字段时我们看到了虽然udp提供了差错检测的功能,但它却对差错回复无能为力。也就是说当udp接收到受损的报文时,只能将其丢弃。(也就是视频中存在的丢帧现象)
- 面向报文。为报文添加首部后,直接交给网络层进行传递。
- 1对1,1对多。因为不需要建立信道,所以可以实现类似网络层广播的一个效果
9.TCP协议和UDP协议特性区别
- TCP是面向连接的协议,UDP是无连接协议。TCP用三次握手建立连接,UDP发送数据前不需要建立连接;
- TCP可靠,UDP不可靠。TCP丢包会重传,并且有确认机制,UDP不会;
- TCP有序,UDP无序。消息在传输过程中可能会乱序,后发送的消息可能会先到达,TCP会对其进行重排序,UDP不会;
- TCP 必须对数据进行校验,而UDP的校验是可选的;
- TCP有流量控制(滑动窗口)和拥塞控制,UDP没有;
- TCP传输慢,UDP传输快。因为TCP需要建立连接、保证可靠性和有序性,所以比较耗时。
- TCP要建立连接、保证可靠性和有序性,就会传输更多的信息,包头比较大(TCP头部至少需要20字节,UDP头部只要8个字节)
- tcp支持1对1的交互,udp支持1对1,1对多,多对多的交互
10.网络端口
TCP 服务器由发送端和接收端创建一种称为套接字的端点来获得,每个套接字有一个套接字编号(地址),该编号由主机的 IP 地址以及一个本地的16位数值组成的。这个16位数值称为端口,所以一共有2^16 = 65535个端口可用。
1024以下的(不0包括1024)的端口被保留,只能用作由特权用户(比如UNIX系统的 root)启动的标准服务,这些端口称为知名端口。一些知名的端口如下:
端口 | 协议 | 用途 |
---|---|---|
20,21 | FTP | 文件传输协议,21是控制端口,20是数据端口 |
22 | SSH | 远程登录,Telnet的替代 |
23 | Telnet | TELNET 终端仿真服务 |
25 | SMTP | 简单邮件传输协议 |
53 | DNS | 域名解析服务 |
80 | HTTP | 万维网, 超文本传输服务 |
443 | HTTPS | 安全的 Web |
1024~49151 之间的的其它端口可以通过 IANA 注册,由非特权用户使用,但是应用程序可以选择自己的端口号
11.TCP对应的协议:
(1) FTP:定义了文件传输协议,使用21端口。
(2) Telnet:一种用于远程登陆的端口,使用23端口,用户可以以自己的身份远程连接到计算机上,可提供基于DOS模式下的通信服务。
(3) SMTP:邮件传送协议,用于发送邮件。服务器开放的是25号端口。
(4) POP3:它是和SMTP对应,POP3用于接收邮件。POP3协议所用的是110端口。
(5)HTTP:是从Web服务器传输超文本到本地浏览器的传送协议。
12.UDP对应的协议:
(1) DNS:用于域名解析服务,将域名地址转换为IP地址。DNS用的是53号端口。
(2) SNMP:简单网络管理协议,使用161号端口,是用来管理网络设备的。由于网络设备很多,无连接的服务就体现出其优势。
(3) TFTP(Trival File Tran敏感词er Protocal),简单文件传输协议,该协议在熟知端口69上使用UDP服务。
4.应用层(HTTP/DNS/FTP/SMTP)
1.HTTP(hypertext transport protocol超文本传输协议)
1.HTTP简述
- HTTP是一个应用层协议,主要用于Web开发,通常由HTTP客户端发起一个请求,创建一个到服务器指定端口(默认是80端口)的TCP连接。HTTP服务器则在那个端口监听客户端的请求。一旦收到请求,服务器会向客户端返回一个状态,比如"HTTP/1.1 200 OK”,以及返回的内容,如请求的文件、错误消息、或者其它信息。
2.http请求(请求行、请求消息报头、请求正文)
-
请求行的格式:
Method SP Request-URI SP HTTP-Version CRLF
请求行以一个方法符号开头,后面跟着请求的URI和协议的版本,中间以空格隔开。其中
- Method指出在由Request-URI标识的资源上所执行的方法,方法是大小写敏感的;
- Request-URL是一个统一资源标识符(通过简单的格式化字符串,通过名称、位置、或其他任何特性标识某个资源)。
- HTTP-Version 表示请求的HTTP协议版本;
- CRLF表示回车和换行(除了作为结尾的 CRLF 外,不允许出现单独的 CR 或 LF 字符)
-
请求消息报头
报头域是由名字+“:”+空格+值组成,消息报头域的名字是大小写无关的。请求消息报头包含了普通报头、请求报头、实体报头。
-
普通报头
用于所有的请求和响应消息,但并不用于被传输的实体,只用于传输的消息。
- Cache-Control:用于指定缓存指令,缓存指令是单向的(响应中出现的缓存指令在请求中未必会出现),且是独立的(一个消息的缓存指令不会影响另一个消息处理的缓存机制);
- Date:表示消息产生的日期和时间;
- Connection:允许发送指定连接的选项,例如指定连接是连续,或者指定“close”选项,通知服务器在响应完成后关闭连接。
-
请求报头
允许客户端向服务器端传递请求的附加信息以及客户端自身的信息。
- Host:指定被请求资源的 Internet 主机和端口号,它通常是从HTTP URL中提取出来
- User-Agent:允许客户端将它的操作系统、浏览器和其它属性告诉服务器;
- Accept:指定客户端接受哪些类型的信息,eg:Accept:image/gif,表明客户端希望接受GIF图象格式的资源;
- Accept-Charset:指定客户端接受的字符集,缺省是任何字符集都可以接受;
- Accept-Encoding:指定可接受的内容编码,缺省是各种内容编码都可以接受
- Authorization:证明客户端有权查看某个资源,当浏览器访问一个页面,如果收到服务器的响应代码为401(未授权),可以发送一个包含Authorization请求报头域的请求,要求服务器对其进行验证。
-
实体报头
定义了关于实体正文(eg:有无实体正文)和请求所标识的资源的元信息。
- Allow:GET,POST
- Content-Encoding:文档的编码(Encode)方法,例如:gzip;
- Content-Language:内容的语言类型,例如:zh-cn;
- Content-Length:表示内容长度,eg:80
-
3.http响应(状态行、消息报头、响应正文)
-
状态行
HTTP-Version Status-Code Reason-Phrase CRLF
所有HTTP响应的第一行都是状态行,依次是当前HTTP版本号,3位数字组成的状态代码,以及描述状态的短语,彼此由空格分隔
HTTP状态码的作用:Web服务器用来告诉客户端,发生了什么事。状态代码的第一个数字代表当前响应的类型:
- 1xx消息——请求已被服务器接收,继续处理
- 2xx成功——请求已成功被服务器接收、理解、接受
- 3xx重定向——需要后续操作才能完成这一请求
- 4xx客户端错误——请求含有词法错误或者无法被执行
- 5xx服务器错误——服务器在处理某个正确请求时发生错误
常见的状态码:
- 200 OK 服务器成功处理了请求;
- 206 Partial Content(部分内容)代表服务器已经成功处理了部分GET请求(只有发送GET 方法的request, web服务器才可能返回206)
- 301 Moved Permanently(永久重定向)请求的URL已移走。Response中应该包含一个Location URL, 说明资源现在所处的位置
- 302 Moved Temporarily(临时重定向)
- 304 Not Modified(未修改)客户的缓存资源是最新的,要客户端使用缓存
- 400 Bad Request(坏请求)告诉客户端,它发送了一个错误的请求。
- 401 Unauthorized(未授权)需要客户端对自己认证
- 404 Not Found 未找到资源
- 500 Internal Server Error 服务器遇到一个错误,使其无法对请求提供服务
-
消息报头
响应消息报头包含了普通报头、响应报头、实体报头,普通报头和实体报头和请求消息报头中的普通报头、实体报头相同。
响应报头允许服务器传递不能放在状态行中的附加响应信息,以及关于服务器的信息和 对 Request-URI 所标识的资源进行下一步访问的信息。常用的响应报头如下:
- Location:用于重定向接受者到一个新的位置,Location响应报头域常用在更换域名的时候;
- Server:包含了服务器用来处理请求的软件信息,与User-Agent请求报头域是相对应的
- WWW-Authenticate:必须被包含在401(未授权的)响应消息中。
4.常用的请求方法:
- GET:请求获取Request——URL所标识的资源
- POST:在Request——URL所标识的资源后附加资源
- HEAD:请求获取由Request——URL所标识的资源的响应消息报头
- PUT:请求服务器存储一个资源,由Request——URL作为其标识
- DELETE:请求服务器删除由Request——URL所标识的资源
- TRACE:请求服务器回送收到的请求信息(用于测试和诊断)
- CONNECT:保留
- OPTIONS:请求查询服务器性能
5.POST和GET的区别
GET一般用于获取/查询资源信息,而POST一般用于更新资源信息,主要区别如下:
- GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456。POST方法是把提交的数据放在HTTP包的Body中。
- GET提交的数据大小有限制(因为浏览器对URL的长度有限制,实际上HTTP协议规范没有对URL长度进行限制),而POST方法提交的数据没有限制。
- GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值,也就是说Get是通过地址栏来传值,而Post是通过提交表单来传值。
- 对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
- GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码。
- GET在浏览器回退时是无害的,而POST会再次提交请求。GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
- 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
6.HTTP/1.0版本,1.1版,2.0本主要区别
HTTP1.0与HTTP 1.1的主要区别
- 长连接
- 节约带宽
- HOST域
HTTP1.1与HTTP 2.0的主要区别
- 多路复用
- 二进制分帧
- 首部压缩
- 服务器推送
HTTP1.0**和HTTP1.1区别
- 带宽优化
HTTP/1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了。HTTP/1.1中在请求消息中引入了range头域,它允许只请求资源的某个部分。
另外一种情况是请求消息中如果包含比较大的实体内容,但不确定服务器是否能够接收该请求(如是否有权限),此时若贸然发出带实体的请求,如果被拒绝也会浪费带宽。HTTP/1.1加入了一个新的状态码100(Continue),客户端事先发送一个只带头域的请求,如果服务器因为权限拒绝了请求,就回送响应码401(Unauthorized);如果服务器接收此请求就回送响应码100,客户端就可以继续发送带实体的完整请求了。 - 长连接
HTTP 1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求。由于大多数网页的流量都比较小,一次TCP连接很少能通过slow-start区,不利于提高带宽利用率。
HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟。
HTTP 1.1还允许客户端不用等待上一次请求结果返回,就可以发出下一次请求,但服务器端必须按照接收到客户端请求的先后顺序依次回送响应结果,以保证客户端能够区分出每次请求的响应内容,这样也显著地减少了整个下载过程所需要的时间。 - 缓存
在HTTP/1.0 中,使用Expire头域来判断资源的fresh或stale,并使用条件请求来判断资源是否仍有效。例如,cache通过If-Modified-Since头域向服务器验证资源的Last-Modefied头域是否有更新,源服务器可能返回304(Not Modified),则表明该对象仍有效;也可能返回200(OK)替换请求的Cache对象。
HTTP/1.1在1.0的基础上加入了一些cache的新特性,当缓存对象的Age超过Expire时变为stale对象,cache不需要直接抛弃stale对象,而是与源服务器进行重新激活(revalidation)。 - Host头域
在 HTTP1.0 中认为每台服务器都绑定一个唯一的IP地址,因此请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都支持Host头域,请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。 - 错误提示
HTTP/1.0 中只定义了16个状态响应码,对错误或警告的提示不够具体。HTTP/1.1 引入了一个Warning头域,增加对错误或警告信息的描述。
此外,在HTTP/1.1中新增了24个状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。
HTTP1.1和HTTP2.0区别
-
多路复用
允许同时通过单一的 HTTP/2 连接发起多重的请求-响应消息.在HTTP/1.1协议中,浏览器客户端在同一时间针对同一域名的请求有一定数据限制,超过限制数目的请求会被阻塞,HTTP2.0使用了多路复用的技术,做到同一个连接并发处理多个请求,而且并发请求的数量比HTTP1.1大了好几个数量级。HTTP1.1可以通过多建立几个TCP连接,来支持处理更多并发的请求,但是创建TCP连接本身也是有开销的,而HTTP/2 可以很容易的去实现多流并行而不用依赖建立多个 TCP 连接,HTTP/2 把 HTTP 协议通信的基本单位缩小为一个一个的帧,这些帧对应着逻辑流中的消息。并行地在同一个 TCP 连接上双向交换消息。 -
二进制分帧
HTTP/2在 应用层(HTTP/2)和传输层(TCP or UDP)之间增加一个二进制分帧层。在不改动 HTTP/1.x 的语义、方法、状态码、URI 以及首部字段的情况下, 解决了HTTP1.1 的性能限制,改进传输性能,实现低延迟和高吞吐量。在二进制分帧层中, HTTP/2 会将所有传输的信息分割为更小的消息和帧(frame),并对它们采用二进制格式的编码 ,其中 HTTP1.x 的首部信息会被封装到 HEADER frame,而相应的 Request Body 则封装到 DATA frame 里面。HTTP/2 通信都在一个连接上完成,这个连接可以承载任意数量的双向数据流。在过去, HTTP 性能优化的关键并不在于高带宽,而是低延迟。TCP 连接会随着时间进行自我调谐,起初会限制连接的最大速度,如果数据成功传输,会随着时间的推移提高传输的速度。这种调谐则被称为 TCP 慢启动。由于这种原因,让原本就具有突发性和短时性的 HTTP 连接变的十分低效。HTTP/2 通过让所有数据流共用同一个连接,可以更有效地使用 TCP 连接,让高带宽也能真正的服务于 HTTP 的性能提升。这种单连接多资源的方式,减少服务端的链接压力,内存占用更少,连接吞吐量更大;而且由于 TCP 连接的减少而使网络拥塞状况得以改善,同时慢启动时间的减少,使拥塞和丢包恢复速度更快。 -
首部压缩
HTTP1.x的header带有大量信息,而且每次都要重复发送,HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小。
-
服务端推送
服务端推送是一种在客户端请求之前发送数据的机制。在 HTTP/2 中,服务器可以对客户端的一个请求发送多个响应。Server Push 让 HTTP1.x 时代使用内嵌资源的优化手段变得没有意义;当我们对支持HTTP2.0的web server请求数据的时候,服务器会顺便把一些客户端需要的资源一起推送到客户端,免得客户端再次创建连接发送请求到服务器端获取。这种方式非常合适加载静态资源。服务器推送可以缓存,并且在遵循同源的情况下,不同页面之间可以共享缓存,因此当客户端需要的数据已缓存时,客户端直接从本地加载这些资源就可以了,不用走网络,速度自然是快很多的。
7.http和https区别
- https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
- http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
- http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
- http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
8.ssl证书加密握手过程
-
客户端向服务端发出加密通信的请求。这被叫做clientHello请求,
-
- 包括支持的协议版本,一个随机数用于等会生成会话密钥,支持的加密方法,支持的压缩方法
-
回应,serverhello,
-
- 确认加密通信协议的版本,一个随机数用于稍后生成会话密钥,确定加密方法,服务器的证书
-
客户端验证服务端证书是否为可信机构颁步,如果不可信会给访问者一个警告有起决定是否继续通信,
-
- 返回一个随机数用于公钥加密,编码改变通知(之后的信息都用双方商定的加密方法和密钥发生),客户端握手结束的通知
-
服务端收到客户端的第三个随机数后,计算生成本次会话用的“会话密钥”,然后向客户端发送下面信息:
-
- 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供客户端校验。
2.Cookie与Session
1.为什么有cookie和session
- Web应用程序是使用HTTP协议传输数据的,但HTTP协议是无状态的协议,一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接,这就意味着服务器无法从连接上跟踪会话。会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份
2.cookie
简单地说,cookie 就是浏览器储存在用户电脑上的一小段文本文件。cookie 是纯文本格式,不包含任何可执行的代码。一个 Web 页面或服务器告知浏览器按照一定规范来储存这些信息,并在随后的请求中将这些信息发送至服务器,Web 服务器就可以使用这些信息来识别不同的用户。大多数需要登录的网站在用户验证成功之后都会设置一个 cookie,只要这个 cookie 存在并可以,用户就可以自由浏览这个网站的任意页面。
cookie 会被浏览器自动删除的原因:
- 会话 cooke (Session cookie) 在会话结束时(浏览器关闭)会被删除
- 持久化 cookie(Persistent cookie)在到达失效日期时会被删除
- 如果浏览器中的 cookie 数量达到限制,那么 cookie 会被删除以为新建的 cookie 创建空间。
大多数浏览器支持最大为 4096 字节的 Cookie。由于这限制了 Cookie 的大小,最好用 Cookie 来存储少量数据,或者存储用户 ID 之类的标识符。用户 ID 随后便可用于标识用户,以及从数据库或其他数据源中读取用户信息。 浏览器还限制站点可以在用户计算机上存储的 Cookie 的数量。大多数浏览器只允许每个站点存储 20 个 Cookie;如果试图存储更多 Cookie,则最旧的 Cookie 便会被丢弃。有些浏览器还会对它们将接受的来自所有站点的 Cookie 总数作出绝对限制,通常为 300 个。
使用 Cookie 的缺点:
- 不良站点用 Cookie 收集用户隐私信息;
- Cookie窃取:黑客以可以通过窃取用户的cookie来模拟用户的请求行为。(跨站脚本攻击XSS)
3.session
Session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识(session id):
- 如果已包含一个session id 则说明以前已经为此客户端创建过session,服务器就按照session id把这个 session 检索出来使用(如果检索不到,可能会新建一个)。
- 如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个 session id将被在本次响应中返回给客户端保存。
检查客户端的请求里是否已包含了一个session标识的具体实现方式:
- Cookie方式:服务器给每个Session分配一个唯一的JSESSIONID,并通过Cookie发送给客户端。当客户端发起新的请求的时候,将在Cookie头中携带这个JSESSIONID,这样服务器能够找到这个客户端对应的Session。
- URL回写:服务器在发送给浏览器页面的所有链接中都携带JSESSIONID的参数,这样客户端点击任何一个链接都会把JSESSIONID带回服务器。如果直接在浏览器输入服务端资源的url来请求该资源,那么Session是匹配不到的。
4.cookie和session的区别
-
存储位置不同
cookie的数据信息存放在客户端浏览器上。
session的数据信息存放在服务器上。
-
存储容量不同
单个cookie保存的数据<=4KB,一个站点最多保存20个Cookie。
对于session来说并没有上限,但出于对服务器端的性能考虑,session内不要存放过多的东西,并且设置session删除机制。
-
存储方式不同
cookie中只能保管ASCII字符串,并需要通过编码方式存储为Unicode字符或者二进制数据。
session中能够存储任何类型的数据,包括且不限于string,integer,list,map等。
-
隐私策略不同
cookie对客户端是可见的,别有用心的人可以分析存放在本地的cookie并进行cookie欺骗,所以它是不安全的。
session存储在服务器上,对客户端是透明对,不存在敏感信息泄漏的风险。
-
有效期上不同
开发可以通过设置cookie的属性,达到使cookie长期有效的效果。
session依赖于名为JSESSIONID的cookie,而cookie JSESSIONID的过期时间默认为-1,只需关闭窗口该session就会失效,因而session不能达到长期有效的效果。
-
服务器压力不同
cookie保管在客户端,不占用服务器资源。对于并发用户十分多的网站,cookie是很好的选
session是保管在服务器端的,每个用户都会产生一个session。假如并发访问的用户十分多,会产生十分多的session,耗费大量的内存。
-
浏览器支持不同
-
假如客户端浏览器不支持cookie:
cookie是需要客户端浏览器支持的,假如客户端禁用了cookie,或者不支持cookie,则会话跟踪会失效。关于WAP上的应用,常规的cookie就派不上用场了。
运用session需要使用URL地址重写的方式。一切用到session程序的URL都要进行URL地址重写,否则session会话跟踪还会失效。
-
假如客户端支持cookie:
cookie既能够设为本浏览器窗口以及子窗口内有效,也能够设为一切窗口内有效。
session只能在本窗口以及子窗口内有效。
-
-
跨域支持上不同
cookie支持跨域名访问。
session不支持跨域名访问。
3.DNS(domain name server域名解析协议)解析过程
-
浏览器先检查自身缓存中有没有被解析过的这个域名对应的ip地址,如果有,解析结束。同时域名被缓存的时间也可通过TTL属性来设置。
-
如果浏览器缓存中没有(专业点叫还没命中),浏览器会检查操作系统缓存中有没有对应的已解析过的结果。而操作系统也有一个域名解析的过程,在windows中可通过c盘里一个叫hosts的文件来设置,如果你在这里指定了一个域名对应的ip地址,那浏览器会首先使用这个ip地址。
但是这种操作系统级别的域名解析规程也被很多黑客利用,通过修改你的hosts文件里的内容把特定的域名解析到他指定的ip地址上,造成所谓的域名劫持。所以在windows7中将hosts文件设置成了readonly,防止被恶意篡改。
-
如果至此还没有命中域名,才会真正的请求本地域名服务器(LDNS)来解析这个域名,这台服务器一般在你的城市的某个角落,距离你不会很远,并且这台服务器的性能都很好,一般都会缓存域名解析结果,大约80%的域名解析到这里就完成了。
-
如果LDNS仍然没有命中,就直接跳到Root Server 域名服务器请求解析
-
根域名服务器返回给LDNS一个所查询域的主域名服务器(gTLD Server,国际顶尖域名服务器,如.com .cn .org等)地址
-
此时LDNS再发送请求给上一步返回的gTLD
-
接受请求的gTLD查找并返回这个域名对应的Name Server的地址,这个Name Server就是网站注册的域名服务器
-
Name Server根据映射关系表找到目标ip,返回给LDNS
-
LDNS缓存这个域名和对应的ip
-
LDNS把解析的结果返回给用户,用户根据TTL值缓存到本地系统缓存中,域名解析过程至此结束
4.在浏览器中输入一个网址它的运行过程是怎样的?
- 应用层:客户端浏览器发起一个HTTP会话到服务器。客户端浏览器通过 DNS 解析到 www.baidu.com 的IP地址,通过这个IP地址找到客户端到服务器的路径。
- 传输层:在客户端的传输层,把HTTP会话请求分成报文段,添加源和目的端口(服务器使用80端口监听客户端的请求,客户端由系统随机选择一个端口如5000),和服务器建立 TCP 连接后进行通信。
- 网络层:客户端的网络层不关心应用层或者传输层的东西,主要做的是通过查找路由表确定如何到达服务器,期间可能经过多个路由器。其中可能用到的路由选择协议有 RIP协议、OSPF协议、EGP协议。
- 链路层:包从路由器到达服务器的局域网后,通过 ARP 协议查找服务器IP地址对应的MAC地址,然后将数据帧传到服务器。
- 服务器端经过物理层→数据链路层→网络层→传输层→应用层,解析请求报文,发送HTTP响应报文。
- 关闭连接,TCP四次挥手。
- 客户端解析HTTP响应报文,浏览器开始显示HTML