TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。
位码即tcp标志位,有6种标示:
- SYN(synchronous建立联机)
- ACK(acknowledgement 确认)
- PSH(push传送)
- FIN(finish结束)
- RST(reset重置)
- URG(urgent紧急)
- Sequence number(顺序号码)
- Acknowledge number(确认号码)
图解如下图所示
三次握手
第一次握手:建立连接。客户端发送连接请求报文段,将
SYN
位置为1,Sequence Number
为x;然后,客户端进入SYN_SEND
状态,等待服务器的确认;
(例: 客户端发送发送SYN
=1,Sequence Number
= 123456)第二次握手:服务器收到
SYN
报文段。服务器收到客户端的SYN
报文段,需要对这个SYN
报文段进行确认,设置Acknowledgment Number
为x+1(Sequence Number
+1);同时,自己自己还要发送SYN
请求信息,将SYN
位置为1,Sequence Number
为y;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态;
(例: 服务端发送SYN
=1,ACK
=1,Acknowledgment Number
=123457,Sequence Number
=7654321)第三次握手:客户端收到服务器的
SYN+ACK
报文段。然后将Acknowledgment Number
设置为y+1,向服务器发送ACK
报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。
(例:ACK
=1,Acknowledgment Number
=7654322)
完成了三次握手,客户端和服务器端就可以开始传送数据。以上就是TCP三次握手的总体介绍。
四次挥手
当客户端和服务器通过三次握手建立了TCP连接以后,当数据传送完毕,肯定是要断开TCP连接的啊。那对于TCP的断开连接,这里就有了神秘的“四次分手”。
第一次挥手:主机1(可以使客户端,也可以是服务器端),设置
Sequence Number
和Acknowledgment Number
,向主机2发送一个FIN
报文段;此时,主机1进入FIN_WAIT_1
状态;这表示主机1没有数据要发送给主机2了;
(例: 主机1发给主机2Sequence Number
=123456,Acknowledgment Number
=654321, FIN=1)第二次挥手:主机2收到了主机1发送的FIN报文段,向主机1回一个
ACK
报文段,Acknowledgment Number
为Sequence Number
加1;主机1进入FIN_WAIT_2
状态;主机2告诉主机1,我“同意”你的关闭请求;
(例: 主机2发给主机1Acknowledgment Number
=123457,ACK
=1)第三次挥手:主机2向主机1发送
FIN
报文段,请求关闭连接,同时主机2进入LAST_ACK
状态;
(例: 主机2发给主机1Sequence Number
=654321, FIN=1, ACK=1)第四次挥手:主机1收到主机2发送的
FIN
报文段,向主机2发送ACK
报文段,然后主机1进入TIME_WAIT
状态;主机2收到主机1的ACK
报文段以后,就关闭连接;此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机1也可以关闭连接了。
(例: 主机1发给主机2Acknowledgment Number
=654322, ACK=1)
SSL四次握手
- 客户端请求建立SSL链接,并向服务端发送一个随机数–Client random和客户端支持的加密方法,比如RSA公钥加密,此时是明文传输。
- 服务端回复一种客户端支持的加密方法、一个随机数–Server random、授信的服务器证书和非对称加密的公钥。
- 客户端收到服务端的回复后利用服务端的公钥,加上新的随机数–Premaster secret 通过服务端下发的公钥及加密方法进行加密,发送给服务器。
- 服务端收到客户端的回复,利用已知的加解密方式进行解密,同时利用Client random、Server random和Premaster secret通过一定的算法生成HTTP链接数据传输的对称加密key – session key。
此后的HTTP链接数据传输即通过对称加密方式进行加密传输。
参考链接:
http://www.mahaixiang.cn/internet/1233.html
http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html
http://www.ruanyifeng.com/blog/2014/09/illustration-ssl.html
https://blog.csdn.net/zxk364961978/article/details/54809008
https://www.cnblogs.com/zmlctt/p/3690998.html
https://github.com/jawil/blog/issues/14