Android 开发需要了解的TCP/IP和Http知识

TCP/IP、Http协议和socket之间的区别

网络由下往上分为(OSI七层模型),实际中使用更多的是右边的TCP/IP参考模型:

这里写图片描述

对于TCP/IP四层模型我们可以简单的理解为:

  • 网络接入层:将需要互相连接的节点接入网络中,从而为数据传输提供条件。
  • 网际互联层:找到要传输数据的目标节点。(IP协议)
  • 传输层:实际传输数据。(TCP、UDP协议)
  • 应用层:使用接受到的数据(HTTP、HTTPS、DNS协议)

从这里我们可以简单的了解到,IP协议对应网际互联层,只负责找到地址;TCP协议对应传输层,负责具体的传输工作;HTTP协议对应应用层,负责对接收到的数据进行解析;三者从本质上来说,没有可比性。

而我们平时说的最多的socket是什么呢?实际上socket是对TCP/IP协议的封装,socket本身不是协议,而是一个调用接口(API),我们通过socket实现TCP/IP协议,但socket跟TCP/IP协议没有必然联系。

WEB使用HTTP协议作应用层协议,以封装HTTP文本信息,然后使用TCP/IP协议作传输层协议将它发到网络上


一、TCP/IP协议

建立一个TCP连接需要进行“三次握手”,而断开一个TCP连接时需要进行四次挥手,过程如图:
这里写图片描述

**seq:**表示所传数据的序号。TCP传输每一个字节都有一个序号,发送数据时会将数据的第一个序号发送给对方,接收方会按序号检查是否接收完整了,如果没有接收完整就需要重新传送,以保持数据的完整性。
**ack:**表示确认号,接收端用它来给发送端反馈已经成功接收到的数据信息,它的值为希望接受的下一个数据包起始序号,也就是ack值所代表的序号前面数据已经成功接收到了。
**ACK:**确认位,只有ACK=1的时候ack才起作用。正常通信时ACK为1,第一次发起请求时应为没有需要确认接收的数据所以ACK为0。
**SYN:**同步位,用于在建立连接时同时序号。刚开始建立连接时并没有历史接收数据,所以ack也就没办法设置,这时按照正常的就无法运行了,SYN的作用就是来解决这个问题的,当接收端接收到SYN=1的报文时就会直接将ack设置为接收到的seq+1的值,注意这里面的值并不是校验后设置的,而是根据SYN直接设置的,这样正常的机制就可以运行了,所以SYN叫同步位。需要注意的是,SYN会在前面再次握手时都为1,这是因为通信的双方的ack都需要设置一个初始值。

1、第一次握手:客户端向服务端发送syn包,将标志位SYN位置置为1,并随机产生一个seq=x,并将该数据包发送给服务端(即syn包),客户端进入SYN_SENT状态,等待服务端确认。
2、第二次握手:服务器收到syn包,由标志位SYN=1知道客户端请求建立连接,服务端将标志位SYN和确认位ACK都置为1,将确认号ack =x+1,随即产生一个值seq = y,并将该包发送给客户端(即syn+ack包),服务器进入syn_send状态。
3、第三次握手:客户端收到服务器的syn+ack包,检查ACK是否为1,确认号ack是否为x+1,如果正确则将ACK置为1,ack=y+1,并向服务器发送该确认包,此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才开始正式传送数据。

理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP连接都会一直保持下去。

断开连接时服务器和客户端均可以主动发起断开TCP连接的请求,断开过程需要经过“四次握手”,断开连接的可以是客户端,也可以是服务端,这里用客户端断开来举例:

TCP四次挥手图解

1、客户端发送一个FIN=M给服务器,用来关闭客户端到服务端的数据传送,客户端进入FIN_WAIT_1状态,意思是客户端没有数据要发送给服务端 了,但是服务端依然可以向客户端发送数据。
2、服务端收到FIN后,先发送ack=M+1给客户端,告诉客户端你的请求我收到了,但我还没准备好,请你继续等我的消息。这个时候客户端进入FIN_WAIT_2状态,继续等待服务器的报文。
3、当服务器确认所有数据已发送完成,则向客户端发送FIN=N,此时客户端和服务端均不再发送数据。
4、客户端收到FIN=N后,就知道可以关闭连接了,于是发送ack=N+1通知服务端并进入TIME_WAIT状态,客户端等待2MSL后没有收到回复则自动关闭连接。

上面是一方主动关闭,另一方被动关闭的情况,实际中还会出现同时发起主动关闭的情况。

同时挥手图解

TCP和UDP的区别

  • TCP:面向连接,可靠的,速度慢效率低,适用于需要传输可靠的数据时使用。
  • UDP:无连接,不可靠,速度快、效率高,适用于高效传输忽略可靠性时使用。

二、Http协议

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

  • Http的请求过程
    1、域名解析
    2、发起TCP的3次握手
    3、建立TCP连接后发起Http请求
    4、服务器端响应Http请求,并回传数据
    5、客户端获取数据并解析展示在前端界面

  • Http的报文格式
    这里写图片描述
    请求报文首行是请求行,包括方法(请求类型)、URL和Http版本;
    响应报文首行是状态行,包括Http版本、状态码和简短原因(可无)
    头部保存一些键值对的属性,用冒号分割
    主体保存具体内容,请求报文中主要保存POST类型的数据,响应报文中保存页面想要的结果。
    首行、头部和主题以及头部各项内容用回车换行分割,头部和主体之间有两个连续的回车换行。
    请求报文中的方法是指:GET、POST、PUT、HEAD、DELETE等类型
    响应报文中的状态码是reponse中的status,一共可分为5类:

     1xx:信息性状态码;
     2xx:成功状态码,如200表示成功
     3xx:重定向状态码,如301表示重定向
     4xx:客户端错误状态码,如404表示没有找到请求的资源
     5xx:服务端错误状态码,如500表示内部错误
    
  • Http的特点
    HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。

     1)在HTTP 1.0中,客户端的每次请求都要求建立一次单独的连接,在处理完本次请求后,就自动释放连接。
     2)在HTTP 1.1中则可以在一次连接中处理多个请求,并且多个请求可以重叠进行,不需要等待一个请求结束后再发送下一个请求。
    

由于HTTP在每次请求结束后都会主动释放连接,因此HTTP连接是一种“短连接”,要保持客户端程序的在线状态,需要不断地向服务器发起连接请求。
通常的做法是即使不需要获得任何数据,客户端也保持每隔一段固定的时间向服务器发送一次“保持连接”的请求,服务器在收到该请求后对客户端进行回复,表明知道客户端“在线”。若服务器长时间无法收到客户端的请求,则认为客户端“下线”,若客户端长时间无法收到服务器的回复,则认为网络已经断开。


三、Https协议

Https是一种Http加密安全版的协议,在Http连接的基础上,对数据采用SSL的加密方式,使得在没有密钥的情况下,根本无法破解其中的数据,保证了其中的安全性。它仍然使用的http进行数据的传输,不同的是https传输的数据都是经过tcp和http之间的ssl层进行加密的。

Http与Https差异比较

1、https协议需要到ca申请证书,一般免费证书很少,需要交费。 
2、http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。 
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。 
4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
  • 4
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值