Android需要知道的TCPIP和Http知识

2022-11-30 11:00:35 浏览数 (1)

相信大家在出去面试的时候,经常会被问到一些基础问题,这些问题,平时开发过程中我们并不会太注意,但是一些大公司在面试时会经常问,今天给大家总结下在Android/iOS开发中会被问到的关于TCPIP和Http相关的知识。

左边是标准的OSI参考模型,共7层;右边是TCP/IP参考模型,分为4层。而TCP/IP作为实际的指导协议,在实际的开发中使用得最多。对于TCP/IP的4层模型可以简单地理解为: 网络接入层:将需要相互连接的节点接入网络中,从而为数据传输提供条件。 网络互联层:找到要传输数据的目标节点。(IP协议) 传输层:实际传输数据。(TCP 、UDP协议) 应用层:使用接收到的数据。(HTTP、HTTPS、DNS协议)

TCP/IP协议

TCP/IP协议通常放在一起来说,不过它们是两个不同的协议,所起的作用也不一样。IP协议是用来查找地址的,对应着网际互联层,TCP协议是用来规范传输规则的,对应着传输层。IP只负责找到地址,具体传输工作交给TCP来完成。 TCP在传输之前会进行三次沟通,一般称为“三次握手”,传完数据断开的时候,要进行四次沟通,一般称为“四次挥手”。要理解这个过程首先需要理解TCP中的两个序号和三个标志位的含义: seq:sequence number的缩写,表示所传数据的序号。TCP传输时每一个字节都有一个序号,发送数据时会将数据的第一个序号发送给对方,接收方会按序号检查是否接收完整了,如果没有接收完整就需要重新传送,这样就可以保证数据的完整性。

ack:asknoledgement number的缩写,表示确认号。接收端用它来给发送端反馈已经成功接收到的数据信息,它的值为希望接收的下一个数据包起始序号,也就是ack值所代表的序号前面数据已经成功接收到了。

ACK:确认位,只有ACK=1的时候ack才起作用。正常通信时ACK为1,第一次发起请求时因为没有需要确认接收的数据所以ACK为0。

SYN:同步位,用于在建立连接时同时序号。刚开始建立连接时并没有历史接收数据,所以ack也就没办法设置,这时按照正常的就无法运行了,SYN的作用就是来解决这个问题的,当接收端接收到SYN=1的报文时就会直接将ack设置为接收到的seq 1的值,注意这里面的值并不是校验后设置的,而是根据SYN直接设置的,这样正常的机制就可以运行了,所以SYN叫同步位。需要注意的是,SYN会在前面再次握手时都为1,这是因为通信的双方的ack都需要设置一个初始值。

FIN:终止位,用来在数据传输完毕后释放连接。

整个传输过程可以用下图来表示:

图中上部分为三次握手,下部分为四次挥手。TCP的传输是双全工模式,也就是说传输的双方是对等的,可以同时传输数据,所以无论连接还是关闭都需要对双方同时进行。 三次握手和四次挥手保证了连接的可靠性,不过凡事有利就有弊,这种模式也有它的缺点,首先是在传输效率上会比较低,另外三次握手的过程中客户端需要发送两次数据才可以建立连接,容易被DDOS攻击(SYN Flood攻击)。

UDP也是用于传输层的协议,和TCP的主要区别是,TCP是有连接的,UDP是没有连接的。UDP协议拿到地址后就传了,因此TCP协议传输的数据更可靠,而UDP协议传输的速度更快。

HTTP协议的底层传输默认使用的是可靠的TCP协议,不过它对互联网的高速发展带来了很大的制约,Google制定了一套基于UDP和QUIC(Quick UDP Intent Connection)协议,这种协议基于TCP和UDP之间的,但未广泛使用。

TCP/IP协议只是一套规则,并不能具体工作,而Socket是TCP/IP协议的一个具体的实现。

HTTP协议

HTTP是应用层的协议,在TCP/IP协议接收到数据之后需要通过HTTP协议来解析才可以使用。

HTTP协议中的报文结构很重要。HTTP中报文分为请求报文(request messaget)和响应报文(response message)两种类型,这两种类型都包括三部分:首行、头部和主体。模型如下图所示:

请求报文的首行是请求行,包括方法(请求类型)、URL和HTTP版本三项内容,响应请求的首行是状态行,包括HTTP版本、状态码和简短原因三项内容,其中原因可有可无。 头部保存一些键值对的属性,用冒号“:”分割。

主体保存具体内容,请求报文中主要保存POST类型的数据,响应报文中保存页面要显示的结果。首行、头部和主体以及头部的各项内容用回车换行(rn)分割,另外头部和主体之间多一个空行,也就是有两个连续的回车换行。

请求报文中的方法指GET、HEAD、POST、PUT、DELETE等类型。

响应报文中的状态码是reponse中的status,一共可以分为5类:

  • 1xx:信息性状态码;
  • 2xx:成功状态码,如200表示成功;
  • 3xx:重定向状态码,如301表示重定向;
  • 4xx:客户端错误状态码,如404表示没有找到请求的资源;
  • 5xx:服务端错误状态码,如500表示内部错误。

0 人点赞