这么多年来,网络请求一直是一个app的重头戏,毕竟没了网络,app就成了单机版的了,今天想聊聊我们的老朋友okhttp。
那首先,我们先补充复习一些基础知识:
1、OSI模型(Open System Interconnection)
我们以前学习过网络的七层网络模型,简单回忆一下有哪七层:
=》应用层:面向计算机用户,提供应用程序和网络之间的接口,向用户提供服务,完成用户希望在网上完成的各种工作;
=》表示层:处理来自应用层的命令和数据,对各种语法解释,按照规格传给会话层,处理编码、数据可视转换和加密解密;
=》会话层:用户应用程序和网络之间的接口,向两个实体表示层提供连接和连接方法,不同实体之间的表示层连接叫做会话,因此主要功能是维护和协调会话之间的数据通信;
=》传输层:为会话层和网络层提供传输服务,从会话层获得数据,在必要时进行分割,然后传送给网络层,主要起到建立、维护和取消传输连接功能,负责两节点的可靠传输;
=》网络层:通过路由算法,为报文选择最适当的路径,在网络层数据转换为数据包,通过路径选择等控制,将信息从一个网络设备传送到另一个网络设备;
=》数据链路层:数据链路层的数据传输单元为帧,就是将网络层转发的数据封装为帧,传输给物理层,以及分析物理层传输过来的数据帧;
=》物理层:为数据链路层提供数据帧和接收数据帧然后管理电脑通信设备和网络媒体之间的互通(针脚、集线器、中继器、网卡...)。
2、TCP/IP分层模型
=》网络接口层:负责接收从上一层交来的数据报并将数据报通过底层的物理网络发送出去;
=》网络层:对应OSI网络层,负责数据包装、寻址、路由和交换报文,只管传送数据,不管成功与否;
=》传输层:位于应用层和网络层之间,为两台主机提供端到端的通信(有两个不同的传输协议:TCP传输控制协议和UDP用户数据报协议);
=》应用层:主要是面向用户的交互,集成了osi分层模型中的应用、表示、会话三层功能。
3、TCP和UDP的对比:
| UDP | TCP | |
|---|---|---|
| 是否连接 | 无连接 | 面向连接 |
| 是否可靠 | 不可靠传输,不使用流量控制和拥塞控制 | 可靠传输,使用流量控制和拥塞控制 |
| 连接对象个数 | 支持一对一,一对多,多对一和多对多交互通信 | 只能是一对一通信 |
| 传输方式 | 面向报文 | 面向字节流 |
| 首部开销 | 首部开销小,仅8字节 | 首部最小20字节,最大60字节 |
| 适用场景 | 适用于实时应用(IP电话、视频会议、直播等) | 适用于要求可靠传输的应用,例如文件传输 |
4、TCP三次握手,四次挥手
先了解下TCP里面的6位控制位:
=》URG(urgent紧急):紧急标志位,表示此报文段中有紧急数据,接收端收到后要先处理紧急数据,然后处理普通数据;
=》ACK(acknowledgement确认):1表示确认号合法,0表示数据段不包含确认信息,确认号被忽略;
=》PSH(push推送):1表示请求的报文在接收方收到时,会尽快交付接收应用进程,而不在等到整个缓存区都填满后再交付给应用进程;
=》RST(reset重置):1表示出现错误,需要释放链接,再重新建立链接;
=》SYN(synchronous同步):1表示链接请求或者同意报文,当SYN = 1而 ACK = 0时,表明这是一个链接请求报文段,若对方同意建立链接,则再响应的报文段中使SYN = 1和ACK = 1;
=》FYN(finish终止):释放连接,提出断开连接的一方将FIN置为1表示断开连接。
下面是TCP鼎鼎大名的三次握手四次挥手:

三次握手指的是客户端和服务端再建立一个TCP连接时,总共发出3个包,主要是为了确认双发的接受能力和发送能力是否正常并做一些初始化的准备操作。
第一次握手:客户端发送SYN=1,seq=x的报文给服务端,发送完毕后进入SYN_END状态;(服务端可以了解到:客户端的发送能i、服务端的接收能力都是正常的)
第二次握手:服务端收到报文后,发回ACK=1,ack=x+1的确认报文,报文中也有SYN=1,seq=y的信息用于客户端确认,发送完毕后进入SYN_RCVD状态;(客户端可以了解到:服务端的接收能力和发送能力正常,客户端的发送能力和接收能力正常,但是服务端并不知道客户端的接收能力或者服务端的发送能力是否正常)
第三次握手:客户端接收到报文后,发送ACK=1,ack=y+1的确认报文,发送完毕后客户端进入ESTABLISHED状态,服务端接收到报文后,进入ESTABLISHED状态,连接就此建立完成。(服务端可以了解到:客户端的接收能力和发送能力正常,服务端的发送能力和接收能力正常)
三次握手可以想象下两位大爷打电话的场景:
老王,听得到么?
我听的到,老李,你听得到么?
我也听得到,老王,那我们开始聊天吧!
说明下三次握手?
首先,握手是为了传输数据前的确认,这样是为了避免资源被浪费掉,而为什么要是三次呢?分析下握手是需要确认什么,主要就是确认双方的发送能力和接收能力是否正常,如果握手次数过少,无法完成这样的效果,次数太多则浪费性能。
三次握手都可以携带数据么?
第一次和第二次都不能携带,第三次是可以携带的。第一次不能携带的原因是为了避免服务器受到攻击,如果每次客户端的第一次握手时都携带数据,服务端需要花费大量的时间和内存来存储和处理该数据。同理第二次也不能携带数据。至于第三次,因为这时候客户端已经处理ESTABLISHED状态,对于客户端来说连接已经建立了,并且也得知服务端的接收能力和发送能力都正常,所以可以携带数据。
SYN攻击?
有人恶意攻击服务器,使用不存在的IP地址对服务器发送请求并发送SYN包,正常情况下,服务端需要回复确认包,并等待客户端确认,但是服务端发送确认包时因为客户端的ip不可用,服务端就会不断的重发直到超时,如果是大批量的这种请求,服务端就会一直忙着处理这些非正常的请求,导致请求队列无法存放正常的请求,这样对正常的请求来说,服务器是瘫痪的状态。(摘抄网上的预防SYN攻击的方法:1、缩短SYN超时时间;2、增加最大半连接数;3、过滤网关防护;4、SYN cookies技术
说明下四次挥手?
三次握手主要就是为了确认连接然后进行数据传输,那么挥手也是为了结束这两个操作。
第一次挥手:客户端发送FIN=1,seq=x的包给服务端,表示自己没有数据要进行传输了,准备断开数据连接,发送完毕后,客户端进入FIN_WAIT_1状态;
第二次挥手:服务端收到请求后,发回ACK=1,ack=x+1的确认包,表示确认断开数据连接,发送完毕后,服务端进入CLOSE_WAIT状态。然后客户端收到了服务端返回的确认包,就进入了FIN_WAIT_2状态,至此数据传输连接正式断开;
第三次挥手:服务端发送FIN=1,seq=y的包给客户端,表示自己没有数据要传输给客户端了,发送完毕后服务端进入LAST_ACK状态,等待客户端的确认包;
第四次挥手:客户端收到服务端关闭连接的请求包后,发送ACK=1,ack=y+1的确认包给服务端,并进入TIME_WAIT状态(此状态是为了防止服务端没收到确认包,客户端需要重传确认包),服务端收到确认包后,进入了CLOSED状态,服务端到客户端的连接就此断开。
四次挥手是因为TCP的连接时全双工的,双方都可以主动传输数据,某一端的断开都需要告知另一端,才好做相应操作。
我们需要了解的网络基础大概就这些了,下篇一起复习下HTTP和HTTPS相关的内容吧。
网络请求基础:TCP/IP、三次握手与四次挥手解析
本文介绍了网络请求的基础知识,包括OSI模型和TCP/IP分层模型,重点讲解了TCP的三次握手和四次挥手过程,以及SYN攻击的概念。此外,还提到了TCP与UDP的对比,为后续讨论HTTP和HTTPS奠定了基础。
593

被折叠的 条评论
为什么被折叠?



