一共6个步骤:
DNS解析
DNS,英文全称是Domain Name System,中文意思是域名系统。首先明确一点的是,DNS 是属于应用层的,并且它选择的运输层协议是 UDP
简单来说就是:浏览器查询DNS,根据域名获取对应的IP地址(一个域名可能对应多个IP地址)
根域名服务器(root Name server) 是互联网域名解析系统(DNS)中最高级别的域名服务器,负责返回顶级域的权威域名服务器地址。它们是互联网基础设施中的重要部分,因为所有域名解析操作均离不开它们。由于DNS和某些协议(未分片的用户数据协议(UDP)数据包在IPv4内的最大有效大小为512字节)的共同限制,根域名服务器地址的数量呗限制为13个。
顶级域名(TLD),就是最高层级的域名。简单说,就是网址的最后一个部分。比如,网址www.baidu.com的顶级域名就是.com。他们可以分成两类。一类是一般性顶级域名(gTLD)也可以叫通用顶级域名,比如.com、net、.edu、.org等等,共有700多个。另一类是国别顶级域名(ccTLD),代表不同的国家和地区,比如.cn(中国)、.io(英属印度洋领地)等,共有300多个。
**名称服务器(Name Server)**在互联网中是指提供域名服务协议的程序或服务器。它可以将"人类可识别"的标识符,映射为系统内部通常为数字形式的标识码。域名系统(DNS)服务器是最著名的名称服务器:域名是互联网两大主要名字空间之一。
DNS解析过程(重点)
浏览器缓存
中是否缓存过该域名对应的ip地址本机系统缓存
是否缓存过ip本地域名服务器
发起域名解析的请求本地域名服务器
向根域名解析服务器
发起域名解析请求顶级域服务器地址
本地域名服务器
向顶级域名服务器
发起解析请求名称服务器(Name Server)地址
本地域名服务器
向名称服务器
发起解析请求ip地址
给本地服务器
DNS负载均衡: DNS负载均衡技术的实现原理是在DNS服务器中为同一个主机名配置多个IP地址,在应答NDS查询时,DNS服务器对每个查询将以DNS文件中主机记录的IP地址按顺序返回不同的解析结果,将客户端的访问引导到不同的机器上去,使得不同的客户端访问不同的服务器,从而达到负载均衡的目的。
1.HTTP(Hypertext Transfer Protocol) 超文本传输协议(80)
1).无状态(cookie/session keep-alive)
2).无连接
3).基于请求和响应
4).简单灵活
5).通信使用明文
2.HTTPS(Hypertext Transfer Protocol Secure)超文本传输安全协议(443)
1).HTTP+SSL(Netscape的安全套接层)
a).SSL((Secure Sockets Layer) 安全套接层(40-128)
b).TLS(Transport Layer Security) 传输层安全
2).数据加密(SSL);身份认证(CA证书[采用非对称加密])
3.TCP(Transmission Control Protocol)传输控制协议
1).面向连接
2).可靠传输的情况, 应用于文件传输, 重要状态更新等场景
3).传输大量数据
4).传输慢
4.UDP(User Data Protocol)用户数据协议
1).面向非连接
2).高速传输和实时性要求较高的通信领域(可靠性需要应用层控制)
3).传输少量数据
4).传输快
5.Socket(程序通过一个双向的通信连接实现数据的交换,连接的一端称为一个socket)(API)
1).socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口
2).连接过程:服务器监听,客户端请求,连接确认
3).优势与劣势
A).优势:
a).传输数据为字节级,传输数据可自定义,数据量小
b).传输数据时间短,性能高
c).适合于客户端和服务器端之间信息实时交互
d).可以加密,数据安全性强
B).劣势:
a).需对传输的数据进行解析,转化成应用级的数据
b).相对于HTTP协议传输,增加了开发量
c).对开发人员的开发水平要求高
4).基于Socket传输的特点其适用于对传输速度,安全性,实时交互,费用等要求高的应用中,如网络游戏,手机应用,银行内部交互等
6.TCP/IP(TCP/IP Protocol Suite)TCP/IP协议族
1).四层模型
a).应用层 有FTP、HTTP、TELNET、SMTP、DNS等协议
b).传输层 有TCP协议与UDP协议
c).网络层 有IP协议、ICMP协议、ARP(地址解析)协议、RARP(反向地址解析)协议和BOOTP协议
d).网络接口层 有FDDI、Ethernet、Arpanet、PDN、SLIP、PPP、IEEE802.1A、IEEE802.2-IEEE802.11
2).五层模型
a).应用层 有FTP、HTTP、TELNET、SMTP、DNS等协议
b).传输层 有TCP协议与UDP协议
c).网络层 有IP协议、ICMP协议、ARP协议、RARP协议和BOOTP协议
d).数据链路层 有FDDI、Ethernet、Arpanet、PDN、SLIP、PPP
e).物理层 有IEEE802.1A、IEEE802.2- IEEE802.11等协议
Session
由于HTTP协议是无状态的协议,所以服务端为了记录用户的状态时,就需要用某种机制来识具体的用户,这个机制就是Session。典型的场景比如购物车。
当你点击下单按钮时,由于HTTP协议无状态,所以并不知道是哪个用户操作的,所以服务端要为特定的用户创建了特定的Session,用用于标识这个用户,并且跟踪用户,这样才知道购物车里面有几本书。
这个Session是保存在服务端的,有一个唯一标识。在服务端保存Session的方法很多,内存、数据库、文件都有。集群的时候也要考虑Session的转移,在大型的网站,一般会有专门的Session服务器集群,用来保存用户会话,这个时候 Session 信息都是放在内存的,使用一些缓存服务比如Memcached之类的来放 Session。
Cookie
而服务端为了识别特定的客户,Cookie就登场了。
每次HTTP请求的时候,客户端都会发送相应的Cookie信息到服务端。实际上大多数的应用都是用 Cookie 来实现Session跟踪的,第一次创建Session的时候,服务端会在HTTP协议中告诉客户端,需要在 Cookie 里面记录一个Session ID,以后每次请求把这个会话ID发送到服务器,我就知道你是谁了。
如果客户端的浏览器禁用了 Cookie 怎么办?
一般这种情况下,会使用一种叫做URL重写的技术来进行会话跟踪,即每次HTTP交互,URL后面都会被附加上一个诸如 sid=xxxxx 这样的参数,服务端据此来识别用户。
Cookie其实还可以用在一些方便用户的场景下,设想你某次登陆过一个网站,下次登录的时候不想再次输入账号了,怎么办?这个信息可以写到Cookie里面,访问网站的时候,网站页面的脚本可以读取这个信息,就自动帮你把用户名给填了,能够方便一下用户。这也是Cookie名称的由来,给用户的一点甜头。
总结:
同步与异步
同步和异步关注的是消息通信机制
举个通俗的例子:
你打电话问书店老板有没有《计算机网络》这本书,如果是同步通信机制,书店老板会说,你稍等,”我查一下",然后开始查啊查,等查好了(可能是5秒,也可能是一天)告诉你结果(返回结果)。
而异步通信机制,书店老板直接告诉你我查一下啊,查好了打电话给你,然后直接挂电话了(不返回结果)。然后查好了,他会主动打电话给你。在这里老板通过“回电”这种方式来回调。
阻塞与非阻塞
阻塞和非阻塞关注的是程序(线程)在等待调用结果(消息,返回值)时的状态
还是上面的例子,你打电话问书店老板有没有《分布式系统》这本书,你如果是阻塞式调用,你会一直把自己“挂起”,直到得到这本书有没有的结果,如果是非阻塞式调用,你不管老板有没有告诉你,你自己先一边去玩了, 当然你也要偶尔过几分钟check一下老板有没有返回结果。在这里阻塞与非阻塞与是否同步异步无关。跟老板通过什么方式回答你结果无关。
什么是SQL 注入?
SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
举个例子?
变量ShipCity的值由用户提交, 在正常情况下,加入用户输入的是"Beijing" 那么SQL 语句会执行:
SELECT * FROM OrdersTable WHERE ShipCity = 'Beijing';
但假如用户输入一段有语义的SQL语句,比如:
beijing’;drop table OrdersTable–
他的请求为
http://localhost:8080/ExcelUsingXSLT/Default.aspx?shipcity=beijing’;drop table OrdersTable–
那么, SQL 语句在实际执行时就会如下:
SELECT * FROM OrdersTable WHERE ShipCity='Beijing'; drop table OrdersTable--'
结果直接删表的,这种就是恶意攻击
如何防止SQL注入?
XSS是一种经常出现在web应用中的计算机安全漏洞,与SQL注入一起成为web中最主流的攻击方式。
XSS是指恶意攻击者利用网站没有对用户提交数据进行转义处理或者过滤不足的缺点,进而添加一些脚本代码嵌入到web页面中去,使别的用户访问都会执行相应的嵌入代码,从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。
解决办法:不信任任何客户端提交的数据,只要是客户端提交的数据就应该先进行相应的过滤处理然后方可进行下一步的操作。
(就知道这些了,(#^.^#)!!!)
自动重传请求(Automatic Repeat-ReQuest,ARQ)是OSI模型中数据链路层和传输层的错误纠正协议之一。
ARQ协议主要包含:停止-等待ARQ协议
、连续ARQ协议
。其中连续ARQ协议是为了解决停等ARQ协议信道利用率低的问题,目前传统的连续ARQ协议有回退N帧ARQ协议、选择性重传ARQ协议。
注意: AQR协议的一个特点是:发送窗口的大小 <= 窗口总数
停等ARQ协议(stop-and-wait):
停等ARQ协议相当于发送窗口和接收窗口大小均为1
的滑动窗口协议。即发送方发送一个帧后,必须接收到一个确认帧(ACK)才能发送下一个。
原理:
优点:
原理简单,广泛运用于分组交换网络。
缺点:
较长的等待时间,使得数据传输速度低。低速传输时频道利用率较高,高速传输时频道利用率较低。
连续ARQ协议(Continuous ARQ)
为了克服停等ARQ协议长时间等待ACK的缺点,这个协议会连续发送一组数据包,然后再等待这些数据包的ACK。
回退N帧ARQ协议(Go-Back-N):
原理:
选择性重传ARQ协议(Selective Repeat):
原理:
简单着说,IP 地址主要用来网络寻址用的,就是大致定位你在哪里,而 MAC 地址,则是身份的唯一象征,具体定位你在哪里,通过 MAC 来唯一确认这人是不是就是你。
主要区别:
IP地址
找到对应的MAC地址
0
开头,主机号占后24位。(网络号为127,作为本地回测地址,不指派)10
开头,主机号占后16位。110
开头,主机号占后8位。1110
开头,保留位多播地址。1111
开头,保留位今后使用。注意:
只有A类、B类和C类地址可分配给网络中的主机
和路由器的各接口
主机号为“全0
”的地址是网络地址
,不能分配给主机
或者路由器中的各接口
主机号为“全1
”的地址是广播地址
,不能分配给主机
或者路由器中的各接口
目前主要有以下两种方式:
NAT 协议
。ICMP介绍:
ICMP全称 Internet Control Message Protocol 网际控制报文协议;
为了有效的转发IP数据报和提高交付成功的机会,在网际层使用了网际控制报文协议;
主机或路由器使用ICMP来发送差错报告报文和询问报文
ICMP报文被封装在IP数据报中发送
ICMP 主要有两个应用,一个是 Ping
,一个是 Traceroute
。
1. Ping
Ping(Packet InterNet Grouper,分组网间探测) 是 ICMP 的一个重要应用,主要用来测试主机或路由器之间的连通性。
Ping 的原理是通过向目的主机发送 ICMP 请求报文
,目的主机收到之后会发送 回答报文
。Ping 会根据时间和成功响应的次数估算出数据包往返时间
以及丢包率
。
Traceroute 是 ICMP 的另一个应用,用来跟踪IP数据报从源主机到达目的主机要经过哪些路由。
原理:
TCP协议的主要特点:
TCP的可靠性原理:
那么TCP是怎样保证可靠性的呢?
TCP报文段
TCP利用滑动窗口
来实现流量控制。流量控制是为了控制发送方发送速率,保证接收方来得及接收。接收方发送的确认报文中的窗口字段可以用来控制发送方窗口的大小,从而影响发送方的发送速率。当窗口字段设置为0,则发送方不能发送数据。
TCP 利用滑动窗口实现流量控制的机制。滑动窗口(Sliding window)是一种流量控制技术。早期的网络通信中,通信双方不会考虑网络的拥挤情况直接发送数据。由于大家不知道网络拥塞状况,同时发送数据,导致中间节点阻塞掉包,谁也发不了数据,所以就有了滑动窗口机制来解决此问题。
TCP采用滑动窗口来进行流量传输控制,滑动窗口的大小意味着接收方还有多大的缓冲区可以用于接收数据。发送方可以通过滑动窗口的大小来确定应发送多少字节的数据。当滑动窗口为0时,发送方一般不能再发送数据报,但有两种情况除外,一种情况是可以发送紧急数据,例如,允许用户终止在远端机上的运行进程;另一种情况是发送方可以发送一个 1 字节的数据报来通知接收方重新声明它希望接收的下一字节及发送方的滑动窗口大小。
拥塞控制和流量控制不同,
流量控制
针对的是点对点
通信量的控制,而拥塞控制
则是一个全局性
的过程。
在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络性能就要变坏,这种情况就叫做阻塞。(在计算机网络中的宽带、交换节点中的缓存和处理机等,都是网络的资源)
若出现拥塞而不进行控制,整个网络的吞吐量将随输入负荷的增大儿下降。
为了进行拥塞控制,TCP 发送方要维持一个拥塞窗口(cwnd) 的状态变量。拥塞控制窗口的大小取决于网络的拥塞程度,并且动态变化。发送方让自己的发送窗口取为拥塞窗口和接收方的接受窗口中较小的一个。
TCP 的拥塞控制采用了四种算法,即:慢开始、拥塞避免、快重传和快恢复。在网络层也可以使路由器采用适当的分组丢弃策略(如:主动队列管理 AQM),以减少网络拥塞的发生。
如何标识一个TCP连接:
在确定最大连接数之前,先来看看系统如何标识一个tcp连接。系统用一个4四元组来唯一标识一个TCP连接:{local ip, local port,remote ip,remote port}
。
client最大tcp连接数:
client每次发起tcp连接请求时,除非绑定端口,通常会让系统选取一个空闲的本地端口(local port),该端口是独占的,不能和其他tcp连接共享。本地端口个数最大只有65536(2^16),端口0有特殊含义,不能使用,这样可用端口最多只有65535
,所以在全部作为client端的情况下,最大tcp连接数为65535,这些连接可以连到不同的服务端。
server最大tcp连接数:(理论上)
server通常固定在某个本地端口上监听,等待client的连接请求。不考虑地址重用(unix的SO_REUSEADDR选项)的情况下,即使server端有多个ip,本地监听端口也是独占的,因此server端tcp连接4元组中只有remote ip(也就是client ip)和remote port(客户端port)是可变的,因此最大tcp连接为客户端ip数×客户端port数,对IPV4,不考虑ip地址分类等因素,最大tcp连接数约为2的32次方(ip数)×2的16次方(port数)
,也就是server端单机最大tcp连接数
约为2的48次方
。
实际server的tcp连接数:
面给出的是理论上的单机最大连接数,在实际环境中,受到机器资源、操作系统等的限制,特别是sever端,其最大并发tcp连接数远不能达到理论上限。在unix/linux下限制连接数的主要因素是内存和允许的文件描述符个数(每个tcp连接都要占用一定内存,每个socket就是一个文件描述符),另外1024以下的端口通常为保留端口。在默认2.6内核配置下,经过试验,每个socket占用内存在15~20k之间。
对server端,通过增加内存、修改最大文件描述符个数等参数,单机最大并发TCP连接数超过10万 是没问题的
三次握手过程
第一次握手: TCP客户端进程
向TCP服务端进程
发出连接请求报文段,首部的同部位SYN=1
、初始序号seq=x
,SYN=1的报文段不能携带数据,但要消耗掉一个序列号。此时TCP客户端进程进入SYN-SENT(同步-发送)状态
。
第二次握手: TCP服务端进程
收到连接请求报文段后,如果同意连接,则向TCP客户端进程
发送确认-连接请求报文,报文首部的同步位SYN=1
、确认位ACK=1
、确认号ack=x+1
、初始序号seq=y
。此时TCP服务端进程进入SYN-RCVD(同步-收到)状态
。
第三次握手: TCP客户进程
收到TCP服务端进程
的确认后,要向TCP服务端进程
给出确认报文段,首部确认位ACK=1
、确认号ack=y+1
、序号seq=x+1
,该报文段是可以携带数据的。TCP连接已经建立,TCP客户端进程
进入ESTABLISHED状态
(established:已建立连接
)。当TCP服务端进程收到TCP客户端进程
的确认后,也进入ESTABLISHED状态
。
不可以两次握手!
主要是为了防止已失效的连接请求报文突然又传到TCP服务器进程,从而导致错误。
如果使用的是两次握手建立连接,假设有这样一种场景。
Linux内核协议栈为一个tcp连接管理使用两个队列。
一个是半连接队列(用来保存处于SYN_SENT
和SYN_RECV
状态的请求)。
一个是全连接队列(用来保存处于established
状态的请求),如果队列满了就会出现丢包现象。
这里在补充一点关于SYN-ACK 重传次数的问题:
服务器发送完SYN-ACK包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传。如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。
ISN即初始序列号。
当一端为建立连接而发送它的SYN时,它为连接选择一个初始序号。ISN随时间而变化,因此每个连接都将具有不同的ISN。ISN可以看作是一个32比特的计数器,每4ms加1 。这样选择序号的目的在于防止在网络中被延迟的分组在以后又被传送,而导致某个连接的一方对它做错误的解释。
三次握手的其中一个重要功能是客户端和服务端交换 ISN(Initial Sequence Number),以便让对方知道接下来接收数据的时候如何按序列号组装数据。如果 ISN 是固定的,攻击者很容易猜出后续的确认号,因此 ISN 是动态生成的。
其实第三次握手的时候,是可以携带数据的。但是,第一次、第二次握手不可以携带数据
为什么这样呢?大家可以想一个问题,假如第一次握手可以携带数据的话,如果有人要恶意攻击服务器,那他每次都在第一次握手中的 SYN 报文中放入大量的数据。因为攻击者根本就不理服务器的接收、发送能力是否正常,然后疯狂着重复发 SYN 报文的话,这会让服务器花费很多时间、内存空间来接收这些报文。
也就是说,第一次握手不可以放数据,其中一个简单的原因就是会让服务器更加容易受到攻击了。而对于第三次的话,此时客户端已经处于 ESTABLISHED 状态。对于客户端来说,他已经建立起连接了,并且也已经知道服务器的接收、发送能力是正常的了,所以能携带数据也没啥毛病。
服务器端的资源分配是在二次握手时分配的,而客户端的资源是在完成三次握手时分配的,所以服务器容易受到SYN洪泛攻击。SYN攻击就是Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server则回复确认包,并等待Client确认,由于源地址不存在,因此Server需要不断重发直至超时,这些伪造的SYN包将长时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络拥塞甚至系统瘫痪。SYN 攻击是一种典型的 DoS/DDoS 攻击。
检测 SYN 攻击非常的方便,当你在服务器上看到大量的半连接状态时,特别是源IP地址是随机的,基本上可以断定这是一次SYN攻击。
常见的防御 SYN 攻击的方法有如下几种:
首先我们需要知道几个概念:
第一次握手:建立连接时,客户端发送SYN包(seq=x)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
第二次握手:服务器收到SYN包,将SYN和ACK标识都置为1,然后设置(seq=y,ack=x+1),向客户端发送一个SYN+ACK包,此时服务器进入SYN_RECV状态.
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包,将ACK置为1,S此时无需SYN,(seq=x+1,ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
所以 :
这题中,第三次的seq = x + 1 = 2000,ack = y + 1 = 1000,说明第二次的seq = y = 1999,ack = x + 1 = 1000
四次挥手过程
第一次挥手: 客户端
向服务端
发送连接释放报文
(FIN=1,序号seq=u),并停止再发送数据,进入FIN-WAIT-1
(终止等待1)状态,等待服务端的确认。
第二次挥手: 服务端
收到连接释放报文后即发送确认报文
(ACK=1,确认号ack=u+1,序号seq=v),服务端进入CLOSE-WAIT
(关闭等待状态)。客户端
收到服务端
的确认后,进入FIN-WAIT-2
(终止等待2)状态,等待服务端向自己发送连接释放报文。此时客户端到服务端这个方向的连接就释放了,TCP处于半关闭状态
。
第三次挥手: 服务端
向客户端
发送连接释放报文
(FIN=1,ACK=1,确认号ack=u+1,序号seq=w),服务端
进入LAST-ACK
(最后确认)状态,等待客户端
的确认。
第四次挥手: 客户端
收到连接释放报文后即发送 确认报文
(ACK=1,确认号ack=w+1,序号seq=u+1),客户端进入TIME-WAIT
(时间等待)状态,此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL
后,客户端才进入CLOSED
状态。
MSL(Maximun Segment Lifetime)意思是最长报文段寿命,一个MSL建议是2分钟。
为什么客户端在TIME-WAIT状态必须等待2MSL的时间?
假如客户端
收到服务端
发送的连接释放报文
后,并向服务端
发送普通的TCP确认报文
后,不再等待2MSL的时间,直接进入CLOSED(关闭)状态。 然后该TCP确认报文
在网络组丢失了,这必然会造成服务端
进程对之前发送的TCP连接释放报文的超时重发,但由于客户端处于关闭状态,因此不会理睬该报文段,这必然会造成服务端进程反复重传TCP连接释放报文,而无法进入关闭状态。
挥手为什么需要四次?三次可不可以?
因为当服务端收到客户端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。
但是关闭连接时,当服务端收到FIN报文时,很可能并不会立即关闭SOCKET(因为服务端可能还有些数据没有发送完),所以只能先回复一个ACK报文,告诉客户端,“你发的FIN报文我收到了”。只有等到我服务端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
因为当服务端收到客户端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。
但是关闭连接时,当服务端收到FIN报文时,很可能并不会立即关闭SOCKET(因为服务端可能还有些数据没有发送完),所以只能先回复一个ACK报文,告诉客户端,“你发的FIN报文我收到了”。只有等到我服务端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
TCP保活计时器,tcp keepaliveTCP。
双方(客户端和服务端)已建立了连接,但后来客户端的主机突然发生故障。显然,服务器以后就不能再收到客户端发来的数据。因此,应当有措施使服务器不要再白白等待下去。这就需要使用保活计时器了。
服务器每收到一次客户的数据,就重新设置保活计时器,时间的设置通常是两个小时
。若两个小时都没有收到客户端的数据,服务端就发送一个探测报文段
,以后则每隔 75 秒钟发送一次。若连续发送 10个
探测报文段后仍然无客户端的响应,服务端就认为客户端出了故障,接着就关闭这个连接。
TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。
UDP用户数据报
UDP不属于连接协议,具有资源消耗少,处理速度快的优点,所以通常音频,视频和普通数据在传送时,使用UDP较多,因为即使丢失少量的包,也不会对接受结果产生较大的影响。
传输层无法保证数据的可靠传输,只能通过应用层来实现了。实现的方式可以参照tcp可靠性传输的方式,只是实现不在传输层,实现转移到了应用层。
最简单的方式是在应用层模仿传输层TCP的可靠性传输。下面不考虑拥塞处理,可靠UDP的简单设计。
详细说明:发送端发送数据时,生成一个随机seq=x,然后每一片按照数据大小分配seq。数据到达接收端后接收端放入缓存,并发送一个ack=x的包,表示对方已经收到了数据。发送端收到了ack包后,删除缓冲区对应的数据。时间到后,定时任务检查是否需要重传数据。
目前利用udp实现了可靠的数据传输的开源程序有RUDP、RTP、UDT。
1、RUDP(Reliable User Datagram Protocol)
RUDP 提供一组数据服务质量增强机制,如拥塞控制的改进、重发机制及淡化服务器算法等,从而在包丢失和网络拥塞的情况下, RTP 客户机(实时位置)面前呈现的就是一个高质量的 RTP 流。在不干扰协议的实时特性的同时,可靠 UDP 的拥塞控制机制允许 TCP 方式下的流控制行为。
2、RTP(Real Time Protocol)
RTP为数据提供了具有实时特征的端对端传送服务,如在组播或单播网络服务下的交互式视频音频或模拟数据。应用程序通常在 UDP 上运行 RTP 以便使用其多路结点和校验服务;这两种协议都提供了传输层协议的功能。但是 RTP 可以与其它适合的底层网络或传输协议一起使用。如果底层网络提供组播方式,那么 RTP 可以使用该组播表传输数据到多个目的地。
3、UDT(UDP-based Data Transfer Protocol)
基于UDP的数据传输协议(UDP-basedData Transfer Protocol,简称UDT)是一种互联网数据传输协议。UDT的主要目的是支持高速广域网上的海量数据传输,而互联网上的标准数据传输协议TCP在高带宽长距离网络上性能很差。
其实 DNS 的整个过程是既使用 TCP 又使用 UDP。
当进行区域传送(主域名服务器向辅助域名服务器传送变化的那部分数据)时会使用 TCP,因为数据同步传送的数据量比一个请求和应答的数据量要多,而 TCP 允许的报文长度更长,因此为了保证数据的正确性,会使用基于可靠连接的 TCP。
当客户端向 DNS 服务器查询域名 ( 域名解析) 的时候,一般返回的内容不会超过 UDP 报文的最大长度,即 512 字节。用 UDP 传输时,不需要经过 TCP 三次握手的过程,从而大大提高了响应速度,但这要求域名解析器和域名服务器都必须自己处理超时和重传从而保证可靠性。
基于可靠的TCP协议:
HTTP、HTTPS、FTP、TELNET、SMTP
基于不可靠的UDP协议:
TFTP、DNS、DHCP、TFTP、SNMP(简单网络管理协议)、RIP
TCP应用场景:
效率要求相对低,但对准确性要求相对高的场景。因为传输中需要对数据确认、重发、排序等操作,相比之下效率没有UDP高。举几个例子:文件传输(准确高要求高、但是速度可以相对慢)、接受邮件、远程登录。
UDP应用场景:
效率要求相对高,对准确性要求相对低的场景。举几个例子:QQ聊天、在线视频、网络语音电话(即时通讯,速度要求高,但是出现偶尔断续不是太大问题,并且此处完全不可以使用重发机制)、广播通信(广播、多播)
17
表示UDP
报文, 如果是6
表示TCP
报文。假设客户端分别发送了两个数据包D1和D2给服务器,由于服务器一次读取的字节数是不确定的,故可能存在以下4中情况:
如果客户端连续不断的向服务端发送数据包时,服务端接收的数据会出现两个数据包粘在一起的情况。
基于上面两点,在使用 TCP 传输数据时,才有粘包或者拆包现象发生的可能。一个数据包中包含了发送端发送的两个数据包的信息,这种现象即为粘包。
接收端收到了两个数据包,但是这两个数据包要么是不完整的,要么就是多出来一块,这种情况即发生了拆包和粘包。拆包和粘包的问题导致接收端在处理的时候会非常困难,因为无法区分一个完整的数据包。
分包机制一般有两个通用的解决方法:
UDP 没有粘包问题,但是有丢包和乱序。不完整的包是不会有的,收到的都是完全正确的包。传送的数据单位协议是 UDP 报文或用户数据报,发送的时候既不合并,也不拆分。
2xx - 客户端请求已成功。
200 - 服务器已成功处理了请求。 通常,这表示服务器提供了请求的网页
201 - 已创建,请求成功并且服务器创建了新的资源
202 - 已接受,但尚未处理
203 - 非权威性信息,服务器已成功处理了请求,但返回的信息可能来自另一来源
204 - 无内容,服务器成功处理了请求,但没有返回任何内容
205 - 重置内容,服务器成功处理了请求,但没有返回任何内容
206 - 部分内容,服务器成功处理了部分 GET 请求
3xx - 重定向
302 - 对象已移动
304 - 未修改
307 - 临时重定向
404 -Not Found 代表客户端错误,指的是服务器端无法找到所请求的资源
400 -请求无效,服务器不理解请求的语法
403 - 禁止访问 ,服务器拒绝请求
405 - 资源被禁止,禁用请求中指定的方法
406 - 无法接受 ,无法使用请求的内容特性响应请求的网页
407 - 要求代理身份验证 ,此状态代码与 401(未授权)类似,但指定请求者应当授权使用代理
408 - 请求超时,服务器等候请求时发生超时
409 - 冲突,服务器在完成请求时发生冲突。 服务器必须在响应中包含有关冲突的信息
410 - 已删除,如果请求的资源已永久删除,服务器就会返回此响应。
411 - 需要有效长度, 服务器不接受不含有效内容长度标头字段的请求。
412 - 未满足前提条件, 服务器未满足请求者在请求中设置的其中一个前提条件。
413 - 请求实体过大,服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。
414 - 请求的 URI 过长, 请求的 URI(通常为网址)过长,服务器无法处理。
415 - 不支持的媒体类型, 请求的格式不受请求页面的支持。
416 - 请求范围不符合要求,如果页面无法提供请求的范围,则服务器会返回此状态代码。
417 - 未满足期望值,服务器未满足”期望”请求标头字段的要求
500 - 内部服务器错误,无法完成请求
501 - 未实现 ,服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码
502 - 网关错误 ,服务器作为网关或代理,从上游服务器收到无效响应
503 - 服务不可用,服务器目前无法使用,通常,这只是暂时状态
504 - 网关超时, 服务器作为网关或代理,但是没有及时从上游服务器收到请求
505 - HTTP 版本不受支持, 服务器不支持请求中所用的 HTTP 协议版本
HTTP/1.0
HTTP/1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求。
这种方式就好像我们打电话的时候,只能说一件事儿一样,说完之后就要挂断,想要说另外一件事儿的时候就要重新拨打电话。
HTTP/1.0中浏览器与服务器只保持短暂的连接,连接无法复用。也就是说每个TCP连接只能发送一个请求。发送数据完毕,连接就关闭,如果还要请求其他资源,就必须再新建一个连接。
我们知道TCP连接的建立需要三次握手,是很耗费时间的一个过程。所以,HTTP/1.0版本的性能比较差。
HTTP1.0 其实也可以强制开启长链接,例如接受Connection: keep-alive
这个字段,但是,这不是标准字段,不同实现的行为可能不一致,因此不是根本的解决办法。
HTTP/1.1
同时
发送多个请求。这样就进一步改进了HTTP协议的效率。有了持久连接和管道,大大的提升了HTTP的效率。但是服务端还是顺序执行的,效率还有提升的空间。HTTP/2
HTTP/2 为了解决HTTP/1.1中仍然存在的效率问题,HTTP/2 采用了多路复用
。即在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,而且不用按照顺序一一对应。能这样做有一个前提,就是HTTP/2进行了二进制分帧,即 HTTP/2 会将所有传输的信息分割为更小的消息和帧(frame),并对它们采用二进制格式的编码。
Http2中的多路复用
多路复用代替原来的序列和阻塞机制。所有就是请求的都是通过一个 TCP 连接并发完成。因为在多路复用之前所有的传输是基于基础文本的,在多路复用中是基于二进制数据帧的传输、消息、流,所以可以做到乱序的传输。多路复用对同一域名下所有请求都是基于流,所以不存在同域并行的阻塞。多次请求如下图:
总结
在 HTTP/2 中,有两个非常重要的概念,分别是帧(frame)和流(stream)。
帧代表着最小的数据单位,每个帧会标识出该帧属于哪个流,流也就是多个帧组成的数据流。
HTTP2 采用二进制数据帧传输,取代了 HTTP1.x 的文本格式,二进制格式解析更高效
多路复用代替了 HTTP1.x 的序列和阻塞机制,所有的相同域名请求都通过同一个 TCP 连接并发完成。同一 Tcp 中可以发送多个请求,对端可以通过帧中的标识知道属于哪个请求。通过这个技术,可以避免 HTTP 旧版本中的队头阻塞问题,极大的提高传输性能。
在 HTTP 中响应体的 Connection 字段指定为 keep-alive
connetion:keep-alive;
HTTP 如何实现长连接?
通过在头部(请求和响应头)设置 Connection: keep-alive,HTTP1.0协议支持,但是默认关闭,从HTTP1.1协议以后,连接默认都是长连接
在什么时候会超时?
谈下你对 HTTP 长连接和短连接的理解?
在 HTTP/1.0 中默认使用短连接。也就是说,客户端和服务器每进行一次 HTTP 操作,就建立一次连接,任务结束就中断连接。当客户端浏览器访问的某个 HTML 或其他类型的 Web 页中包含有其他的 Web 资源(如:JavaScript 文件、图像文件、CSS 文件等),每遇到这样一个 Web 资源,浏览器就会重新建立一个 HTTP 会话。
而从 HTTP/1.1 起,默认使用长连接,用以保持连接特性。使用长连接的 HTTP 协议,会在响应头加入这行代码:Connection:keep-alive
在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输 HTTP 数据的 TCP 连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。
Keep-Alive 不会永久保持连接,它有一个保持时间。
HTTP 长连接、短连接使用场景是什么?
长连接:
长连接多用于操作频繁
,点对点的通讯
,而且连接数不能太多情况。例如: 数据库的连接用长连接
短连接:
而像 WEB 网站的 http 服务一般都用短链接,因为长连接对于服务端来说会耗费一定的 资源,而像 WEB 网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源, 如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下需用短连接。
HTTP通信机制是在一次完整的HTTP通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤:
1. 建立TCP连接
在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接,该连接是通过TCP来完成的,该协议与IP协议共同构建Internet,即著名的TCP/IP协议族,因此Internet又被称作是TCP/IP网络。HTTP是比TCP更高层次的应用层协议,根据规则,只有低层协议建立之后才能进行更高层协议的连接,因此,首先要建立TCP连接,一般TCP连接的端口号是80。
2. Web浏览器向Web服务器发送请求命令
一旦建立了TCP连接,Web浏览器就会向Web服务器发送请求命令。例如:GET/sample/hello.jsp HTTP/1.1。
3. Web浏览器发送请求头信息
浏览器发送其请求命令之后,还要以头信息的形式向Web服务器发送一些别的信息,之后浏览器发送了一空白行来通知服务器,它已经结束了该头信息的发送。
4. Web服务器应答
客户机向服务器发出请求后,服务器会客户机回送应答, HTTP/1.1 200 OK ,应答的第一部分是协议的版本号和应答状态码。
5. Web服务器发送应答头信息
正如客户端会随同请求发送关于自身的信息一样,服务器也会随同应答向用户发送关于它自己的数据及被请求的文档。
6. Web服务器向浏览器发送数据
Web服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据。
7. Web服务器关闭TCP连接
一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者服务器在其头信息加入了这行代码:Connection:keep-alive
TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。
如果连接建立后,不通信是不知道网络已经断开的(在未设置Keep-Alive的情况下),除非你用send发了一个包出去,这时候一般会超时,如果中间路由器能够检测到网络出现故障的话,也会返回给你一个“网络不可达”或“主机不可达”的错误。
所以,要检测网络连接状况,必须发包才能知道,每隔一段时间发一个包以检测网络情况,即所谓“心跳”。
区别:
参数位置:
GET 和 POST 的请求都能使用额外的参数,但是 GET
的参数是以查询字符串出现在 URL 中,而 POST
的参数存储在实体主体中。
因为 URL 只支持 ASCII 码,因此 GET 的参数中如果存在中文等字符就需要先进行编码。例如 中文 会转换为 %E4%B8%AD%E6%96%87
,而空格会转换为 %20
。POST 参数支持标准字符集。
GET /test/demo_form.asp?name1=value1&name2=value2 HTTP/1.1Copy to clipboardErrorCopied
POST /test/demo_form.asp HTTP/1.1
Host: w3schools.com
name1=value1&name2=value2Copy to clipboardErrorCopied
参数类型:
GET只允许ASCII字符,POST没有限制
传输的数据大小:
安全性(对于传输的数据来说):
POST的安全性与GET相比相对较高,GET的参数会暴露在URL上,而POST的参数则是在请求体中保存。
然而,从传输的角度来说,他们都是不安全的,因为 HTTP 在网络上是明文传输的,只要在网络节点上捉包,就能完整地获取数据报文,要想安全传输,就只有加密
幂等性区别:
幂等性:就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。
在正确实现的条件下,GET
,HEAD
,PUT
和 DELETE
等方法都是幂等的,而 POST
方法不是。
是否可缓存:
如果要对响应进行缓存,需要满足以下条件:
GET
和 HEAD
,但是 PUT 和 DELETE 不可缓存,POST
在多数情况下不可缓存的。各自应用场景?
在GET请求中浏览器会对URL中非西文字符进行编码,这样做的目的就是为了 避免歧义
。
现在考虑这样一个问题,如果我们的参数值中就包含 = 或 & 这种特殊字符的时候该怎么办?例如:
“name1=value1”,其中value1的值是“va&lu=e1”字符串,那么实际在传输过程中就会变成这样“name1=va&lu=e1”。这样,我们的本意是只有一个键值对,但是服务端却会解析成两个键值对,这样就产生了歧义。
那么,如何解决上述问题带来的歧义呢?解决的办法就是对参数进行URL编码:例如,我们对上述会产生歧义的字符进行URL编码后结果:“name1=va%26lu%3De1”,这样服务端会把紧跟在“%”后的字节当成普通的字节,就是不会把它当成各个参数或键值对的分隔符
幂等性:就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。
get表达的是一种幂等的,只读的,纯粹的操作,不会因为多次点击而产生了副作用,因此绝大部分get请求(通常超过90%)都可以直接被缓存,这能大大减少web服务器负担。
而post所表达的语义是非幂等的,有副作用的操作,所以必须交由web服务器处理,不能缓存。
URL,即统一资源定位符 (Uniform Resource Locator ),URL 其实就是我们平时上网时输入的网址,它标识一个互联网资源,并指定对其进行操作或获取该资源的方法。例如 https://leetcode-cn.com/problemset/all/ 这个 URL,标识一个特定资源并表示该资源的某种形式是可以通过 HTTP 协议从相应位置获得。
而 URI 则是统一资源标识符,URL 是 URI 的一个子集,两者都定义了资源是什么,而 URL 还定义了如何能访问到该资源。URI 是一种语义上的抽象概念,可以是绝对的,也可以是相对的,而URL则必须提供足够的信息来定位,是绝对的。简单地说,只要能唯一标识资源的就是 URI,在 URI 的基础上给出其资源的访问方式的就是 URL。
403:服务器拒绝请求
导致403状态码的常见原因有:
500:服务器遇到错误,无法完成请求(一般是服务端代码错误)
Forward 和 Redirect 代表了两种请求转发方式:直接转发
和间接转发
。
在学习Servlet和JSP时,经常会使用到forward和redirect,我们先来看这两者在Servlet中的调用方式:
1.forward
request.getRequestDispatcher("new.jsp").forward(request, response); //转发到new.jsp
2.redirect
response.sendRedirect("new.jsp"); //重定向到new.jsp
很明显一个是用request对象调用,一个是用response对象调用,那么,这两者有什么区别呢?
一、数据共享方面
二、地址栏显示方面
三、本质区别
转发是服务器行为
,重定向是客户端行为
。
转发过程: 客户浏览器发送http请求—>web服务器接受此请求—>调用内部的一个方法在容器内部完成请求处理和转发动作—>将目标资源 发送给客户;在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的request。在客 户浏览器路径栏显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的。转发行为是浏览器只做了一次访问请求。
重定向过程: 客户浏览器发送http请求—>web服务器接受后发送302状态码响应及对应新的location给客户浏览器—>客户浏览器发现 是302响应,则自动再发送一个新的http请求,请求url是新的location地址—>服务器根据此请求寻找资源并发送给客户。在这里 location可以重定向到任意URL,既然是浏览器重新发出了请求,则就没有什么request传递的概念了。在客户浏览器路径栏显示的是其重定向的路径,客户可以观察到地址的变化的。重定向行为是浏览器做了至少两次访问请求。
重定向,其实是两次request:第一次,客户端request A,服务器响应,并response回来,告诉浏览器,你应该去B。这个时候IE可以看到地址变了,而且历史的回退按钮也亮了。重定向可以访问自己web应用以外的资源。在重定向的过程中,传输的信息会被丢失。
官方的比较简洁的说明:
301 redirect: 301 代表永久性转移(Permanently Moved)
302 redirect: 302 代表暂时性转移(Temporarily Moved )
他俩都表示重定向
详细来说,301和302状态码都表示重定向,就是说浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址,这个地址可以从响应的Location首部中获取(用户看到的效果就是他输入的地址A瞬间变成了另一个地址B)——这是它们的共同点。他们的不同在于。
301表示旧地址A的资源已经被永久地移除了(这个资源不可访问了);
302表示旧地址A的资源还在(仍然可以访问),这个重定向只是临时地从旧地址A跳转到地址B。
什么是重定向啊?
就是地址A跳转到地址B啦。百度百科的解释:重定向(Redirect)就是通过各种方法将各种网络请求重新定个方向转到其它位置(如:网页重定向、域名的重定向、路由选择的变化也是对数据报文经由路径的一种重定向)。
可是,为什么要进行重定向啊?什么时候需要重定向呢?
这种情况下,如果不做重定向,则用户收藏夹或搜索引擎数据库中旧地址只能让访问客户得到一个404页面错误信息,访问流量白白丧失;再者某些注册了多个域名的网站,也需要通过重定向让访问这些域名的用户自动跳转到主站点等。
那么,什么时候进行301或者302跳转呢?
使用301跳转的场景:
使用302的场景:
当一个网站或者网页24—48小时内临时移动到一个新的位置,这时候就要进行302跳转
1、 客户端发送自己支持的加密规则给服务器,代表告诉服务器要进行连接了;
2、 服务器从中选出一套加密算法和 hash 算法以及自己的身份信息(地址等)以证书的形式发送给浏览器,证书中包含服务器信息,加密公钥,证书的办法机构;
3、客户端收到网站的证书之后要做下面的事情:
4、服务器接收到客户端传送来的信息,要做下面的事情:
5、如果计算法 hash 值一致,握手成功。
优点:
缺点:
为了避免数据在传输过程中被替换,比如黑客修改了你的报文内容,但是你并不知道,所以我们让发送端做一个数字签名,把数据的摘要消息进行一个加密,比如 MD5,得到一个签名,和数据一起发送。然后接收端把数据摘要进行 MD5 加密,如果和签名一样,则说明数据确实是真的。
对称加密中,双方使用公钥进行解密。虽然数字签名可以保证数据不被替换,但是数据是由公钥加密的,如果公钥也被替换,则仍然可以伪造数据,因为用户不知道对方提供的公钥其实是假的。所以为了保证发送方的公钥是真的,CA 证书机构会负责颁发一个证书,里面的公钥保证是真的,用户请求服务器时,服务器将证书发给用户,这个证书是经由系统内置证书的备案的.
【计算机网络微课堂】
【计算机网络面试题】
【计算机网络面试题汇总】
【60道计算机网络面试题(附答案,背诵版)】
【在浏览器地址栏输入一个URL后回车,背后会进行哪些技术步骤?】
【HTTP 请求头与请求体】
这篇文章创作占用了我三个周的时间, 前两周看的 B站上的计网视频【计算机网络微课堂】, 后面一个周又借鉴一些优秀博主写的文章进行总结。
如果这篇文章有帮助到你,还希望能点个赞,谢谢!!!