TCP/IP、http、https
tcp/ip三次握手与四次挥手
首先介绍一下TCP中的六个标志位:
SYN: 表示建立连接
FIN: 表示关闭连接
ACK: 表示响应
PSH: 表示有DATA数据传输
RST: 表示连接重置
URG: 表示紧急指针有效
第一次握手:建立连接时,客户端发送SYN包到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN,同时自己发送一个SYN包,即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK,此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手,客户端与服务器开始传送数据。
由于TCP连接时进行全双工工作的,因此每个方向都必须单独进行关闭。
- TCP发送一个FIN,用来关闭客户端到服务端的连接。
- 服务端收到这个FIN,返回一个ACK,确认收到序号为收到序号+1,和SYN一样,一个FIN将占用一个序号。
- 服务端发送一个FIN到客户端,服务端关闭客户端的连接。
- 客户端发送ACK报文确认,并将确认的序号+1,这样关闭完成。
面试常见问题
- 为什么连接的时候是三次握手,关闭的时候是四次挥手?
因为服务端收到客户端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当服务端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉客户端,“你发送的FIN报文我收到了”。只有等到服务端所有的报文都发送完了才能发送FIN报文,因此不能一起发送,所以需要四次挥手。 - 如果已经建立了连接,但是客户端突然故障了怎么办?
TCP设有一个保活计时器。服务器每收到一次客户端的请求后都会重新复位这个计时器,通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75分钟发送一次。若一连发送10个探测报文仍然没有反应,服务器就认为客户端出了故障,接着就关闭连接。 - 为什么四次挥手时TIME_WAIT状态要经过2MSL(最大报文生存时间)才能返回到CLOSE状态?
按道理四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假想网络是不可靠的,有可能最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。在客户端发送出最后的ACK回复,但该ACK可能丢失,如果服务端没有接收到,将不断重复发送FIN片段。所以客户端不能立即关闭,必须确认服务端接受到了ACK。客户端会在发送出ACK之后进入到TIME_WAIT状态。客户端会设置一个计数器,等待2MSL的时间,如果在该时间内再次受到FIN,那么服务端会重发ACK并再次等待2MSL。如果直到2MSL,客户端都没有再次受到FIN,那么客户端推断ACK已经被成功接收,则结束TCP连接。
HTTP与TCP/IP区别
TCP/IP协议是传输层协议,主要解决数据如何在网络中传输;
HTTP是应用层协议,主要解决如何包装数据。
WEB使用HTTP协议作为应用层协议,以封装HTTP文本信息,然后使用TCP/IP做传输层协议将它发送到网络上。
OSI(Open System Interconnect)模型:
HTTPS和HTTP的区别
- https协议需要ca申请证书或自制证书。
- http的信息是明文传输,https则是具有安全性的ssl加密。
- http是直接与tcp进行数据传输,而https是经过一层ssl(OSI表示层),用的端口也不一样,前者是80(需要国内备案),后者是443.
- http的连接很简单,是无状态的;https协议是由SSL+HTTP协议构建的可进行加密传输协议,比https协议安全。
注意https加密是在传输层
https报文是在被包装成tcp报文的时候完成加密的过程,无论是https的header域,还是body域都是会被加密的。
HTTPS连接过程
https在传输数据之前需要客户端与服务端之间进行一次握手,在握手过程中将确立双发加密传输数据的密码信息。TLS/SSL协议使用了非对称加密,对称加密以及HASH算法,握手过程如下:
- 客户端将自己支持的一套加密规则发送给网站。
- 服务端从中选出一组加密算法与HASH算法,并将自己的身份信息以证书的形式发回给客户端。证书里面包含了网站地址,加密公钥,以及证书的颁发机构等信息。
-
客户端获得网站证书之后浏览器要做一下工作:
a) 验证证书的合法性(颁发证书的机构是否合法,证书中包含的网站地址是否与正在访问的地址一致等),如果证书受信任,则浏览器栏里面会显示一个小锁头,否则会给出证书不受信的提示。
b) 如果证书受信任,或者是用户接受了不受信的证书,客户端会生成一串随机数的密码,并用证书中提供的公钥加密。
c) 使用约定好的HASH算法计算握手消息,并使用生成的随机数对消息进行加密,最后将之前生成的所有信息发送给网站。 -
服务端接受客户端的数据之后要做一下的操作:
a) 使用自己的私钥将信息解密去除密码,使用密码解密客户端发来的握手消息,并验证HASH是否与客户端发来的一致。
b) 使用密码加密一段握手消息,发送给客户端。 - 客户端解密并计算握手消息的HASH,如果与服务端发来的HASH一致,此时握手过程结束,之后所有的通信数据将由之前客户端生成的随机密码并利用对称加密算法进行加密。
参考
简述TCP协议的六个标志位和三次握手与四次挥手的过程及原理
HTTPS 工作原理和 TCP 握手机制
http和https 握手过程详解