应用层协议HTTP
- Android一般使用Http协议进行网络连接,来发送和接收数据。
- Http协议格式一般分为请求格式和应答格式:
- 请求格式:请求行|请求头部|空白行|请求体
- 响应格式:响应行|响应头部|空白行|响应数据
在请求格式中,通常的请求行中的Method方法包括POST GET HEAD(作用类似与于GET方法) OPTION DELETE PUT等 ,除此之外还包括URL,协议版本(1.0/1.1之类的)等。请求头部中包括一些附加信息,用键值来表示(键:值),包括Host、user-agent、connection等信息。请求体是可选部分,GET请求就可以不用请求体,直接将要传递的数据放在url中。
- POST 和 GET的区别
- GET参数通过url传递,POST放在request body中。
- GET请求在url中传递的参数是有长度限制的,而POST没有。
- GET比POST更不安全,因为参数直接暴露在url中,所以不能用来传递敏感信息。
- GET产生一个TCP数据包;POST产生两个TCP数据包(一个传HEAD一个传data)。
HTTP返回码含义
- 200:客户端请求成功。
- 302:重定向。
- 404:请求资源不存在。
- 400:请求语法错误,服务器无法理解。
- 403:服务器收到请求,但拒绝提供服务。
- 500:服务器内部错误。
- 503:服务器当前不能处理客户端请求,可能需要一段时间后才能恢复正常。
HTTP1.0和HTTP1.1的区别
- 前者暂时连接,传输完成立刻断开;后者在请求头中带有连续传递字段keep active时,会保持连接,让后续传输不必重新连接
- Android中连接类HttpURLConnection.java(HttpClient.java是Apache库中的类,在android M之后被废弃,不再使用)。HttpURLConnection的使用一般如下:
URL url = new URL("http://www.baidu.com");
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
connection.setRequestMethod("GET")
//connection.setRequestMethod("POST")
connection.setConnectTimeout(6000);
connection.setReadTimeout(6000);
InputStream in = connection.getInputStream();//服务端响应耗时操作
//OutputStream out = connection.getOutputStream();//客户端请求耗时操作,最终数据写入实在out.flush()中完成
...
connection.disconnect();//关闭
传输层协议TCP/UDP
HTTP属于应用层的协议,是基于传输层协议TCP(传输控制协议)的。而在传输层,TCP和UDP(用户数据报协议)经常拿来比较。
TCP(Transmission Control Protocol)协议是面向连接的协议。需要三次握手建立连接,需要四次挥手断开连接。
三次握手过程:
- 客户端发送:SYN = 1,ACK = X,端口号(http 的是60)
- 服务端应答:SYN = 1,ACK = X+1;SEQ = Y;
- 客户端确认:ACK = Y+1;SEQ = X+1
四次挥手过程: - 客户端提出停止连接请求:FIN = 1;
- 服务端应答:ACK = 1;
- 服务端发送停止连接请求:FIN = 1;
- 客户端应答:ACK =1;
TCP协议是面向连接的协议,就是为了保证连接可靠稳定。为了达到这一目标,在数据传递时,有确认、窗口、重传、拥塞控制机制。数据传递完后会断开连接节省系统资源。详细来说,在传递数据时,data将被分割成固定长度大小发送,发送时启动定时器,为重传做准备。接受到数据后会校验后确认。在传递时两方都有窗口控制大小,避免拥堵。缺点就是传输慢效率低,容易被攻击(DOS,DDOS)
UDP(User Data protocol)协议是面向无连接协议,尽最大努力完成交付。优点是传输快、安全;缺点是不可靠、很可能丢包