TCP/IP 协议族

网络分层模型

一系列协议所组成的一个网络分层模型。

为什么要分层?由于网络的不稳定所以需要分层
一个客户端向服务器发送请求,会经过很多个节点,会进行选择路经过那些节点,最优的路就是路由
image.png
例如:请求或者响应,某个节点断掉了。
image.png
对于大数据可以切成块来进行传递,如下图所示:例如大数据是:abcdedsdsddsdsdsd (举例) 将数据分成4块进行传输,传输1成功拿到回执,传输2成功拿到回执,传输3 失败了没有拿到回执,就会重新传输3,如果不进行分块传输,这么大的数据一旦在某个节点传输失败,就会重新传输整个数据,而分块传输,只需要重新传输四分之一的数据即可。
网络 | TCP/IP 协议族 - 图3

由于分块传输,就需要进行分层

应用层:HTTP FTP DNS 发送请求/响应 传递报文、文件等这些都需要分块传输,如果各自给HTTP FTP等做分块传输,可以是可以但是太浪费了,而是将分块传输做成通用的一个功能,将分块传输抽出一层,也就是传输层。HTTP和FTP等不用亲自去做分块了,而是交给传输层进行切块和拼接数据。
传输层: TCP协议、UDP协议 负责数据的分块传输和拼接.保证数据的稳定传输。

如下图:客户端通过HTTP向服务端发送数据,HTTP -> 传输层,传输层把数据进行切块发送到服务器的传输层,服务器的传输层会验证数据是否分块全部传输完毕了,如果数据完整则把数据拼接到一起传递到HTTP层,服务器处理数据。如果数据不完整,会有客户端的传输层进行重新发送数据。HTTP这层不管数据的拆分和组成而是交给下一层传输层进行管理

网络 | TCP/IP 协议族 - 图4

TCP协议: 将数据分块传输,失败重试机制。接收拼接分块数据完整后才会传给HTTP。

UDP协议:常用于直播、游戏,获取最新的状态,不需要重传失败的数据。传完之后不用管了,不管成功失败都不需要重传。

TCP 和 UDP 都需要网络,有共同的下层需求,在抽离一层就是网络层。传输层不负责传输数据,只需要将数据分块和拼接,数据传输交给网络层。

网络层:IP 协议是在网络层的。以最小单位来接受和发送分块的数据。
网络 | TCP/IP 协议族 - 图5

整个过程:加入客户端通过HTTP去请求接口,传输层拿到数据进行分块,然后一块一块的给网络层去发送数据。接收方的网络层接收到数据,就丢给传输层,当传输层收到数据,通过网络层发送给发送方的网络层,告诉发送方的传输层接收到几号数据了。当接收方的传输层判断数据完整了,然后给应用层。后台拿到消息后重复该过程。

数据链路层:以太网、WiFi 为网络提供物理支持的。
网络 | TCP/IP 协议族 - 图6

TCP/IP 协议族:一系列协议所组成的一个网络分层模型,因为现实网络的不可靠性,具体分层:

  • Application Layer 应用层:HTTP FTP DNS
  • Transport Layer 传输层:TCP UDP
  • Intent Layer 网络层:IP
  • Link Layer 数据链路层:以太网、WIFI

TCP 协议的主要作用:保证网络数据可靠传输 IP协议的主要作用:解决在网络上传输包的问题,例如网络寻址、以包为单位发送网络数据

TCP 连接

连接:例如上述将的分块传输,将数据分割成一块一块的进行传输,如果没有建立连接,就需要这样发送:第一块数据:我是谁谁,我要给你发送消息了,消息是:xxxx,第二块数据:我是谁谁,我要给你发送消息了,消息是:xxx 等等,每次发送都需要状态信息, 如果建立TCP连接,是有状态的知道了对方的身份,直接发送消息即可,不用在每次去发送状态信息了,因为已经认识你了。

互相认识就是连接,而建立这种认识就是建立连接。如果不建立连接不知道你是谁,直接发送消息就会扔掉

TCP 连接:TCP是有状态的交互,在Java中Socket是对TCP端口的具象化。TCP连接的建立与关闭。
Socket 就是插口的意思,如下图通过连接线去插入插口进行连接,看图片更能理解Socket的意义
image.png

  • TCP连接的建立

image.png

  • TCP 连接关闭,数据和端口会占用资源,不用的时候要及时释放

    TCP 断开连接为什么需要四次挥手? 因为在客户端停止向服务器发送消息时,也许服务器还有消息需要向客户端发送,因此在它对客户端的「Fin」(即「我不再给你发送消息」,这个词不必记住)消息进行回应时,不需要立即附加上「我也不再向你发送消息」。在稍后服务器的消息发送完毕之后,才需要向客户端发送通知。

image.png

TCP 长连接

为什么要有长连接?如果长时间不发送消息,网关就会关闭连接。那么要如何保持长链接呢?
网络 | TCP/IP 协议族 - 图10

长连接的实现方式:心跳

心跳就是每隔一段时间发送消息,让网关不去关闭连接。可以通过OKhttp的webSocket来实现心跳

每隔5秒,发送一次心跳包,检查连接是否断开
image.png
创建WebSocket:
image.png
发送心跳消息:
image.png