1.DHCP 协议 操作流程
DHCP(Dynamic Host Configuration Protocol),动态主机配置协议,是一个应用层协议。当我们将客户主机ip地址设置为动态获取方式时,DHCP服务器就会根据DHCP协议给客户端分配IP,使得客户机能够利用这个IP上网。
DHCP的实现
DHCP的实现分为4步,分别是:
主机新加入网络时,获取IP的流程1. 新的client加入网络时,会使用0.0.0.0作为源地址,发送discover广播报文,查询网络上有哪些DHCP server,以及这些DHCP server 能Offer哪些IP地址
2. DHCP服务器接收到DHCP Discover报文后,回应Offer报文,提供IP地址(可能包含DNS等其他信息)给client
3. client 根据收到的Offer报文,选择一个DHCP server,并选择它提供的IP地址。然后广播Request报文,向DHCP Server请求该IP地址,同时向本地网络(尤其是其他DHCP Server)公告自己已经选择了某个DHCP Server的某个IP地址。
4. DHCP Server 回应ACK报文,将IP地址分配给Client端 (特殊情况:DHCP Server在发送Offer报文和接收到Request的短暂时间内把IP分配给了其他主机)
5. DHCP Client 收到ACK报文后,会针对获得的IP地址发送ARP Request,进行IP地址冲突检测。
6. 如果IP地址已经被其他主机使用,则Client放弃该IP地址,并向Server发送DHCP DECLINE报文告诉Server该地址不能使用。然后一段时间后(一般10s)再此尝试获取该IP地址
7. 如果Client仍然无法使用该IP地址,则发送DHCP RELEASE报文,放弃该地址。
2.IP协议的转发流程
仅从网络层去看这整个数据传输的过程
- A发出目的地为C的IP数据报,查询本地路由表发现下一跳为E
- A将数据报发送给E
- E查询本地路由表发现下一跳为F,将数据报发送给F
- F查询本地路由表发现目的地C,是和自己直接连接的,然后将数据报发送给C
结合数据链路层和网络层
第一步:
A发出目的地为C的IP数据报,查询路由表发现下一跳为E
A将IP数据报交给数据链路层,并告知下一跳IP地址是E
数据链路层就会查找ARP表,寻找E对应的MAC地址E1,如果没有找到则会发送ARP请求获取E的MAC地址E1
数据链路层填充源MAC地址A和目的MAC地址E1
数据链路层通过物理层将数据发送给E1
第二步:
E的数据链路层接收到数据帧,把数据帧传输给网络层
E查询路由表,发现下一跳为F
E把数据交给数据链路层并告知下一跳的IP地址为F
E的数据链路层就去查找E的ARP表,寻找F对应的MAC地址F1,如果没有找到则会发送ARP广播请求获取F的MAC地址F1
E的数据链路层封装数据帧并发送(此时源MAC地址和目的MAC地址就会发生变化,源MAC地址为E,目的MAC地址为F1)
第三步:
F的数据链路层接收到数据帧,把数据帧交给网络层
F查询路由表,发现下一跳为C
F把数据交给数据链路层,并告知目的IP地址为C
数据链路层查找本地ARP缓存表,寻找C对应的MAC地址C1,如果没有找到则发送ARP广播请求获取C的MAC地址C1
F的数据链路层封装数据帧并发送给C
从上边的整个过程中可以发现
数据帧每一跳的MAC地址都在变化(源MAC地址和目的MAC地址)
IP数据报每一跳的IP地址始终不变
3.TCP/IP四层模型
1.网络接口层
1).物理层(Physical Layer)
物理层确保原始的数据可在各种物理媒体上传输。物理层记住两个重要的设备名称,中继器(Repeater,也叫放大器)和集线器。
2).数据链路层(Data Link Layer)
该层的作用包括:物理地址寻址、封装成帧、透明传输、差错检验等。 两个重要设备名称:网桥和交换机。
2.网际层(网络层(Network Layer))
路径选择、路由及逻辑寻址。网络层的目的是实现两个端系统之间的数据透明传送,具体功能包括寻址和路由选择、连接的建立、保持和终止等。它提供的服务使传输层不需要了解网络中的数据传输和交换技术
重要的设备:路由器。
主要协议:IP、ICMP、IGMP、RIP和OSPF等
3.运输层(传输层(Transport Layer))
传输层负责将上层数据分段并提供端到端的、可靠的或不可靠的传输以及端到端的差错控制和流量控制问题;
重要设备:网关
主要协议:TCP和UDP
4.应用层
为操作系统或网络应用程序提供访问网络服务的接口,如:发送文件传输和电子邮件等。主要协议:Telnet、FTP、e-mail和HTTP等
4.TCP三次握手
第一次握手
客户主动(active open)去connect服务器,并且发送SYN 假设序列号为J,服务器是被动打开(passive open)
第二次握手
服务器在收到SYN后,它会发送一个SYN以及一个ACK(应答)给客户,ACK的序列号是 J+1表示是给SYN J的应答,新发送的SYN K 序列号是K
第三次握手
客户在收到新SYN K, ACK J+1 后,也回应ACK K+1 以表示收到了,然后两边就可以开始数据发送数据了
5.TCP四次挥手
1)客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
2)服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
3)客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
4)服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
5)客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2*MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
6)服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。
6.HTTP协议
转载:https://zhuanlan.zhihu.com/p/45173862
HTTP
协议(超文本传输协议HyperText Transfer Protocol),它是基于TCP协议的应用层传输协议,简单来说就是客户端和服务端进行数据传输的一种规则。
注意:客户端与服务器的角色不是固定的,一端充当客户端,也可能在某次请求中充当服务器。这取决与请求的发起端。HTTP协议属于应用层,建立在传输层协议TCP之上。客户端通过与服务器建立TCP连接,之后发送HTTP请求与接收HTTP响应都是通过访问Socket接口来调用TCP协议实现。
HTTP
是一种无状态 (stateless) 协议, HTTP
协议本身不会对发送过的请求和相应的通信状态进行持久化处理。这样做的目的是为了保持HTTP协议的简单性,从而能够快速处理大量的事务, 提高效率。
然而,在许多应用场景中,我们需要保持用户登录的状态或记录用户购物车中的商品。由于HTTP
是无状态协议,所以必须引入一些技术来记录管理状态,例如Cookie
。
HTTP请求
由上图可以看到,http请求由请求行,消息报头,请求正文三部分构成。
HTTP请求状态行
请求行由请求
Method
,URL
字段和HTTP Version
三部分构成, 总的来说请求行就是定义了本次请求的请求方式, 请求的地址, 以及所遵循的HTTP协议版本例如:GET /example.html HTTP/1.1 (CRLF)
HTTP协议的方法有:
GET
: 请求获取Request-URI所标识的资源
POST
: 在Request-URI所标识的资源后增加新的数据
HEAD
: 请求获取由Request-URI所标识的资源的响应消息报头
PUT
: 请求服务器存储或修改一个资源,并用Request-URI作为其标识
DELETE
: 请求服务器删除Request-URI所标识的资源
TRACE
: 请求服务器回送收到的请求信息,主要用于测试或诊断
CONNECT
: 保留将来使用
OPTIONS
: 请求查询服务器的性能,或者查询与资源相关的选项和需求
HTTP请求头
消息报头由一系列的键值对组成,允许客户端向服务器端发送一些附加信息或者客户端自身的信息,主要包括:
HTTP请求正文
只有在发送
POST
请求时才会有请求正文,GET
方法并没有请求正文。HTTP get方式请求报文
HTTP响应
与HTTP请求类似,先上一张图:
HTTP响应也由三部分组成,包括状态行,消息报头,响应正文。
HTTP响应状态行
状态行也由三部分组成,包括HTTP协议的版本,状态码,以及对状态码的文本描述。例如:
HTTP/1.1 200 OK (CRLF)
HTTP响应状态码
状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:
1xx
:指示信息 - 表示请求已接收,继续处理
2xx
:成功 - 表示请求已被成功接收、理解、接受
3xx
:重定向 - 要完成请求必须进行更进一步的操作
4xx
:客户端错误 - 请求有语法错误或请求无法实现
5xx
:服务器端错误 - 服务器未能实现合法的请求常见状态代码、状态描述、说明:
200
: OK - 客户端请求成功
400
: Bad Request - 客户端请求有语法错误,不能被服务器所理解
401
: Unauthorized - 请求未经授权,这个状态代码必须和WWW-Authenticate
报头域一起使用
403
: Forbidden - 服务器收到请求,但是拒绝提供服务
404
: Not Found - 请求资源不存在,eg:输入了错误的URL
500
: Internal Server Error - 服务器发生不可预期的错误
503
: Server Unavailable - 服务器当前不能处理客户端的请求,一段时间后,可能恢复正常HTTP响应状态码说明
HTTP响应报文
HTTP的五大特点
- 支持客户/服务器模式。
- 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有
GET
、HEAD
、POST
。每种方法规定了客户与服务器联系的类型不同。由于HTTP
协议简单,使得HTTP
服务器的程序规模小,因而通信速度很快。- 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由
Content-Type
加以标记。- 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。早期这么做的原因是请求资源少,追求快。后来通过
Connection: Keep-Alive
实现长连接- 无状态:
HTTP
协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
非持久连接和持久连接
在实际的应用中,客户端往往会发出一系列请求,接着服务器端对每个请求进行响应。对于这些请求/响应,如果每次都经过一个单独的TCP连接发送,称为非持久连接。
反之,如果每次都经过相同的TCP连接进行发送,称为持久连接。
非持久连接在每次请求|响应之后都要断开连接,下次再建立新的TCP连接,这样就造成了大量的通信开销。例如前面提到的往返时间
(RTT)
就是在建立TCP连接的过程中的代价。非持久连接给服务器带来了沉重的负担,每台服务器可能同时面对数以百计甚至更多的请求。持久连接就是为了解决这些问题,其特点是一直保持TCP连接状态,直到遇到明确的中断要求之后再中断连接。持久连接减少了通信开销,节省了通信量。
7.HTTPS
HTTP的不足
- 通信使用明文(不加密),内容可能会被窃听
- 不验证通信方的身份,因此有可能遭遇伪装
- 无法证明报文的完整性,所以有可能已遭篡改
HTTPS介绍
HTTP
协议中没有加密机制,但可以通 过和SSL
(Secure Socket Layer, 安全套接层 )或TLS
(Transport Layer Security, 安全层传输协议)的组合使用,加密HTTP
的通信内容。属于通信加密,即在整个通信线路中加密。
HTTP + 加密 + 认证 + 完整性保护 = HTTPS(HTTP Secure )
HTTPS
采用共享密钥加密(对称)和公开密钥加密(非对称)两者并用的混合加密机制。若密钥能够实现安全交换,那么有可能会考虑仅使用公开密钥加密来通信。但是公开密钥加密与共享密钥加密相比,其处理速度要慢。所以应充分利用两者各自的优势, 将多种方法组合起来用于通信。 在交换密钥阶段使用公开密钥加密方式,之后的建立通信交换报文阶段 则使用共享密钥加密方式。
HTTPS
握手过程的简单描述如下:
- 浏览器将自己支持的一套加密规则发送给网站。
服务器获得浏览器公钥
- 网站从中选出一组加密算法与HASH算法,并将自己的身份信息以证书的形式发回给浏览器。证书里面包含了网站地址,加密公钥,以及证书的颁发机构等信息。
浏览器获得服务器公钥
- 获得网站证书之后浏览器要做以下工作:
(a). 验证证书的合法性(颁发证书的机构是否合法,证书中包含的网站地址是否与正在访问的地址一致等),如果证书受信任,则浏览器栏里面会显示一个小锁头,否则会给出证书不受信的提示。
(b). 如果证书受信任,或者是用户接受了不受信的证书,浏览器会生成一串随机数的密码(接下来通信的密钥),并用证书中提供的公钥加密(共享密钥加密)。
(c) 使用约定好的HASH计算握手消息,并使用生成的随机数对消息进行加密,最后将之前生成的所有信息发送给网站。浏览器验证 -> 随机密码 服务器的公钥加密 -> 通信的密钥 通信的密钥 -> 服务器
- 网站接收浏览器发来的数据之后要做以下的操作:
(a). 使用自己的私钥将信息解密取出密码,使用密码解密浏览器发来的握手消息,并验证HASH是否与浏览器发来的一致。
(b). 使用密码加密一段握手消息,发送给浏览器。服务器用自己的私钥解出随机密码 -> 用密码解密握手消息(共享密钥通信)-> 验证HASH与浏览器是否一致(验证浏览器)
HTTPS的不足- 加密解密过程复杂,导致访问速度慢
- 加密需要认向证机构付费
- 整个页面的请求都要使用HTTPS