一:协议层
网络中的计算机与终端间要想正确的传送信息和数据,必须在数据传输的顺序、数据的格式及内容等方面有一个约定或规则,这种约定或规则称做协议。
下面看一个协议层的模型图:
可以看到七层协议各自负责不同的内容,那么为什么要将协议分层呢?有以下几个好处
- 人们可以很容易的讨论和学习协议的规范细节
- 层间的标准接口方便了工程模块化
- 创建了一个更好的互连环境
- 降低了复杂度,使程序更容易修改,产品开发的速度更快
- 每层利用紧邻的下层服务,更容易记住各层的功能
二:TCP协议
TCP协议属于传输层,不同主机的应用层之间经常需要可靠的、像管道一样的连接,TCP协议就起到了这个作用
在TCP层,有个FLAGS字段,这个字段有以下几个标识:SYN, FIN, ACK, PSH, RST, URG
其中,对于我们日常的分析有用的就是前面的五个字段
- SYN表示建立连接
- FIN表示关闭连接
- ACK表示响应
- PSH表示未分片的数据传输
- RST表示连接重置
这就是我们常说的TCP是有状态的,而UDP是无状态的
既然TCP协议给建立了一个连接管道,那么它是怎么建立连接的呢?有状态又是怎么一回事呢?
这就要说到TCP的三次握手了:
- 第一次握手:客户端发送位码为SYN=1,ACK = 0,随机产生seq number的数据包到服务器,seq = 0,服务器由SYN=1知道,客户端要求建立联机
- 第二次握手: 服务器收到请求后要确认联机信息,向客户端发送ack number=(客户端的seq+1,及ack = x+1),SYN=1,ACK=1,随机产生seq number的包,seq = y
- 第三次握手: 客户端收到后检查ack 是否正确,即第一次发送的seq number+1,以及位码SYN是否为1,若正确,客户端会再发送ack number=(服务器的seq+1,及ack = y+1),ACK=1,seq = x+1,服务器收到后确认ack的值和ACK=1无误,则连接建立成功
ACK 是tcp首部的一个标志位,TCP协议规定,只有ACK=1时有效,也规定连接建立后所有发送的报文的ACK必须为1。ack实际是tcp首部里面的序号。
用通俗的话来讲,如果A是客户端,B是服务器,那么三次握手就表示着:
- 第一次:A对B说,我要和你开启传输数据通道
- 第二次:B对A说,好的,我知道了
- 第三次:A对B说,好的,我知道你知道了
完成三次握手,客户端与服务器开始传输数据
那么,当传输数据结束时,就需要关闭连接通道了,那么应该如何关闭呢?这就是TCP的四次挥手了
为什么需要四次挥手呢?原因是因为TCP协议是双通道传输协议,所以需要客户端和服务器都关闭连接通道。
- 第一次挥手:首先客户端和服务器的TCP进程都处于established状态, 当客户端的应用程序传送完报文段,就会去主动关闭连接。客户端会停止发送报文段(但是还会接收),并向服务器发送[FIN = 1,seq=u]数据,之后进入FIN-WAIT-1状态
- 第二次挥手:服务器接收到客户端发送的请求之后,会通知应用进程,客户端已经不再发送数据,同时服务器会向客户端发送ACK确认数据[ACK=1,seq=v,ack=u+1 ],服务器进入CLOSE-WAIT状态,客户端接收到服务器发送的数据之后,客户端进入FIN-WAIT-2状态;此时客户端到服务器方的连接已经关闭了(即半连接状态)
- 当服务器的应用进程发现自己也没有数据需要传送,服务器的应用进程就会发出被动关闭的请求,服务器此时向客户端发送[FIN=1,ACK=1,seq=w,ack=u+1]数据,并且进入LAST-ACK状态
- 客户端接收到服务器发送的数据之后,向服务器发送ACK确认数据[ACK =1,seq=u+1,ack=w+1],进入TIME-WAIT状态,等待2MSL之后正常关闭连接进入CLOSED状态;服务器接收到客户端发送的确认之后进入CLOSED状态。服务器到客户端方的连接关闭!至此,TCP连接才真正全部关闭!
请求关闭不一定先是客户端发起的,也可能是服务器端先发起的
为什么要等待2MSL:客户端等待了2MSL后依然没有收到回复,则证明服务器端已正常关闭,最后,客户端也可以关闭连接。
MSL的意思是报文最大生存时间,RFC 793中规定MSL为2分钟,实际应用中常用的是30秒,1分钟和2分钟等。
三:UDP协议
UDP协议是一个无状态的协议
UDP的传输,相当于客户端给服务器传送数据时,客户端只管将数据传输出去,而不管服务器能不能接受到;服务器向客户端传输数据时也是同样的方式。
由于UDP传输是无连接的,所以传输速度较快;如果一方的数据报丢失,那另一方将无限等待,解决办法是设置一个超时;
TCP协议和UDP协议的区别
- TCP基于连接,UDP无连接
- TCP要求系统资源较多,UDP较少
- UDP程序结构较简单
- 流模式(TCP)与数据报模式(UDP)
- TCP保证数据正确性,UDP可能丢包
- TCP保证数据顺序,UDP不保证
那么什么是流模式和数据报模式呢?
- 打个比方比喻TCP,你家里有个蓄水池,你可以里面倒水,蓄水池上有个龙头,你可以通过龙头将水池里的水放出来,然后用各种各样的容器装(杯子、矿泉水瓶、锅碗瓢盆)接水。 上面的例子中,往水池里倒几次水和接几次水是没有必然联系的,也就是说你可以只倒一次水,然后分10次接完。另外,水池里的水接多少就会少多少;往里面倒多少水,就会增加多少水,但是不能超过水池的容量,多出的水会溢出
- 结合TCP的概念,水池就好比接收缓存,倒水就相当于发送数据,接水就相当于读取数据。好比你通过TCP连接给另一端发送数据,你只调用了一次write,发送了100个字节,但是对方可以分10次收完,每次10个字节;你也可以调用10次write,每次10个字节,但是对方可以一次就收完。(假设数据都能到达)但是,你发送的数据量不能大于对方的接收缓存(流量控制),如果你硬是要发送过量数据,则对方的缓存满了就会把多出的数据丢弃。 这种情况是设置非阻塞I/O模型,会把内存耗尽,因为socket是存在内核中的
- UDP和TCP不同,发送端调用了几次write,接收端必须用相同次数的read读完。UPD是基于报文的,在接收的时候,每次最多只能读取一个报文,报文和报文是不会合并的,如果缓冲区小于报文长度,则多出的部分会被丢弃。也就说,如果不指定MSG_PEEK标志,每次读取操作将消耗一个报文
- 为什么呢?其实,这种不同是由TCP和UDP的特性决定的。TCP是面向连接的,也就是说,在连接持续的过程中,socket中收到的数据都是由同一台主机发出的(劫持什么的不考虑),因此,知道保证数据是有序的到达就行了,至于每次读取多少数据自己看着办
- 而UDP是无连接的协议,也就是说,只要知道接收端的IP和端口,且网络是可达的,任何主机都可以向接收端发送数据。这时候,如果一次能读取超过一个报文的数据,则会乱套。比如,主机A向发送了报文P1,主机B发送了报文P2,如果能够读取超过一个报文的数据,那么就会将P1和P2的数据合并在了一起,这样的数据是没有意义的
四:HTTP 和HTTPS
超文本传输协议(HTTP,HyperText Transfer Protocol)
HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer)
HTTP:
是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少
HTTPS:
是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL\TLS层,HTTPS的安全基础是SSL\TLS,因此加密的详细内容就需要SSL\TLS
HTTP工作流程:
- 首先是TCP三次握手建立起连接通道
- 然后客户端发送HTTP请求报文
- 服务器发送响应HTTP报文
- TCP四次挥手关闭连接通道
HTTPS工作流程:
- 首先是TCP三次握手建立起连接通道
- 服务器将CA证书发送给客户端
- 客户端会校验CA证书是否有效
- 加密传输报文,客户端发送加密后的报文和加密方式到服务器
- 获得加密报文后解密报文,然后加密响应报文,发送给客户端
- 最后关闭连接通道
那么什么是CA证书?
采用https的服务器必须从CA (Certificate Authority)申请一个用于证明服务器用途类型的证书。该证书只有用于对应的服务器的时候,客户端才信任此主机。所以所有的银行系统网站,关键部分应用都是https 的。客户通过信任该证书,从而信任了该主机。其实这样做效率很低,但是银行更侧重安全。这一点对局域网对内提供服务处的服务器没有任何意义。局域网中的服务器,采用的证书不管是自己发布的还是从公众的地方发布的,其客户端都是自己人,所以该局域网中的客户端也就肯定信任该服务器
加密报文和解密报文:
这里分为对称加密和非对称加密:
- 对称加密,即客户端用一个密钥加密报文,然后客户端用相同的密钥去解密报文(可能会被截取报文解密之后串改内容)
- 非对称加密,客户端用密钥的公钥加密,而服务器用密钥的私钥来解密
两种协议区别:
- https协议需要到CA申请证书,一般免费证书较少,因而需要一定费用
- http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议
- http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443
- http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全
SSL 和 TLS
TLS的主要目标是使SSL更安全,并使协议的规范更精确和完善。TLS 在SSL v3.0 的基础上,提供了以下增强内容:
- 更安全的MAC算法
- 更严密的警报
- “灰色区域”规范的更明确的定义
TLS对于安全性的改进