TCP是什么?
要弄清楚一个新的事物我们首先要知道他是干什么的,以及使用场景.
浏览器相信大家都用过吧,那么大家有没有想过我们点击一个网页内容是怎么呈现给我们的呢?怎么确保传输的网页数据不丢失呢?
三次握手
-
一开始,客户端和服务端都处于
CLOSE
状态。先是服务端主动监听某个端口,处于LISTEN
状态(服务器不开启监听,怎么知道有人要发消息给我呢,服务器不能睡着呀!😴)
-
第一次握手:客户端接着把第一个报文
SYN
(seq = j)发送给服务端,表示向服务端发起连接,该报文不包含应用层数据,之后客户端处于SYN-SENT
状态(客户端告诉服务器我要来啦🏃♂️) -
第二次握手:服务端收到客户端的
SYN
报文后,确认收到ack
(seq=j+1),并且告诉客户端我收到了发送一个SYN
包(seq=k)即SYN+ACK
包,之后服务端处于SYN-RCVD
状态。(服务器确认客户端来了,并且告诉客户端我知道你来了) -
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。(客户端知道服务器知道他来了,并且告诉服务器我知道你知道了)
SYN:同步序列编号(Synchronize Sequence Numbers)
ACK:确认字符(Acknowledge character)在数据通信中,接收站发给发送站的一种传输类控制字符。表示发来的数据已确认接收无误。
Seq:随机初始化序号(client_isn)
什么时候我浏览器断开连接呢?是页面渲染完断开还是一直页面关闭就断开呢?
-
TCP连接在一段时间内是不会断的,因为建立新连接太耗资源,等待时间久,多个HTTP请求会复用TCP通道,过了最大允许的时间就会自动断开,和页面渲染是分开的,没有等待关系。
-
根据Connection请求头,如果是keep-alive服务器就保持住tcp连接,如果没有或是close则服务器response传输完后主动关闭tcp连接。当然现在浏览器都是http1.1都默认是keep-alive的,在浏览器tab关闭时,tcp连接关闭。
四次挥手
-
现在建立了连接可以传输数据啦!那么传输完了,我关闭了浏览器服务器怎么知道我关闭了呢?这就要介绍一下四级挥手了。
-
客户端告诉服务器我要断开了,发送一个
FIN
-
服务器收到客户端的消息,我得处理完消息呀我先确认你收到吧,发送一个
ack
(先发送ACK的目的是为了防止在这段时间内,对方重传FIN报文段) -
服务器处理完了数据,并且告诉客户端,我也要断开了发送一个
FIN
-
客户端收到ack断开连接,服务器断开连接
TCP 里面是什么东西
知道了TCP的应用场景和传输数据,那么我们接下来介绍一下TCP里面是什么。
TCP 实战
-
TCP实战
之后会更新TCP的小实战,敬请期待哦。
如果有的不对的地方欢迎大佬批评指正。
博客来源:TCP 详解