IP 协议
通信的时候,双方必须知道对方的标识,好比发邮件必须知道对方的邮件地址。互联网上每个计算机的唯一标识就是IP地址,类似123.123.123.123。如果一台计算机同时接入到两个或更多的网络,比如路由器,它就会有两个或多个IP地址,所以,IP地址对应的实际上是计算机的网络接口,通常是网卡。
IP协议负责把数据从一台计算机通过网络发送到另一台计算机。数据被分割成一小块一小块,然后通过IP包发送出去。由于互联网链路复杂,两台计算机之间经常有多条线路,因此,路由器就负责决定如何把一个IP包转发出去。IP包的特点是按块发送,途径多个路由,但不保证能到达,也不保证顺序到达。
一个IP包除了包含要传输的数据外,还包含源IP地址和目标IP地址,源端口和目标端口。
IP 是网络层协议,TCP UDP 同属传输层协议,传输层高于网络层,HTTP是应用层,高于传输层,最底层是链路层
TCP 协议
TCP协议则是建立在IP协议之上的。TCP协议负责在两台计算机之间建立可靠连接,保证数据包按顺序到达。
TCP协议会通过握手建立连接,然后,对每个IP包编号,确保对方按顺序收到,如果包丢掉了,就自动重发。
当TCP发出一个报文段后,它会启动一个定时器,等待目的端发确认收到这个报文段,如果没能及时收到该确认信息,则将重发这个报文段。
当TCP接收端收到发送端发来的TCP报文段时,它将发送一个确认,这个确认不是立即发送的,通常会推迟几分之一秒。
TCP将保持它首部和数据的校验和。这是一个端到端的校验和,如果收到的报文段的校验和有差错,TCP将丢弃该报文段,同时不发送确认收到的消息,从而使发送端超时重发。
最可靠的方式就是只要得不到确认,就重新发送数据,直到得到确认为止。
- TCP协议提供面向连接的服务,通过它建立的是可靠地连接
- Socket 和 ServerSocket 类实现
- 服务端对于每一个连接都需要创建新的线程来处理
TCP 连接三次握手
请求—应答—再次确认
- 客户端发送: 标志位和序号
- 服务器端发送: 发送序号、确认序号、标识位
- 客户端发送: 发送序号、确认序号、标志位
TCP 四次挥手
- 客户端发送: FIN 用来关闭客户端到服务端的数据传送
- 服务端发送: 发送还需要发送的数据给客户端
- 服务端发送: FIN 用了关闭服务端到客户端的数据传送
- 客户端发送: 发送确认序号给服务端,服务端停止,完成
四次挥手原因
服务端收到客户端的断开请求后,可以发送数据和确认码,这两部分分开发送,所以多一次。
UDP协议
使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就可以直接发数据包。但是,能不能到达就不知道了。
虽然用UDP传输数据不可靠,但它的优点是和TCP比,速度快,对于不要求可靠到达的数据,就可以使用UDP协议。
- 面向非连接的,属不可靠协议,UDP套接字在使用前不需要进行连接。
- 多个请求都放在一个消息队列中一次处理不需要创建新的线程
- DatagrameSocket 和 DatagramPacket 类来实现,DatagramPacket 为 DatagramSocket 的 send 方法的参数和 receive 方法的返回值
- UDP数据报文所能负载的最多数据,亦及一次传送的最大数据为65507个字节
- DatagramPacket的内部消息长度值在接收数据后会发生改变,变为实际接收到的数据的长度值。
- DatagramPacket的getData()方法总是返回缓冲区的原始大小,忽略了实际数据的内部偏移量和长度信息。使用时应该制定 getData 的偏移量和长度
new String(dp_receive.getData(),dp_receive.getOffset(),dp_receive.getOffset() + dp_receive.getLength());
UDP程序在receive()方法处阻塞,直到收到一个数据报文或等待超时。由于UDP协议是不可靠协议,如果数据报在传输过程中发生丢失,那么程序将会一直阻塞在receive()方法处,这样客户端将永远都接收不到服务器端发送回来的数据,但是又没有任何提示。为了避免这个问题,我们在客户端使用DatagramSocket类的setSoTimeout()方法来制定receive()方法的最长阻塞时间,并指定重发数据报的次数,如果每次阻塞都超时,并且重发次数达到了设置的上限,则关闭客户端。
TCP 协议和 UDP 协议区别
速度、是否连接、传输可靠性、应用场合
0. 速度:TCP传输慢,UDP传输快,因为UDP不面向连接
1. 是否连接:面向连接和非连接,可靠与不可靠
2. 对系统资源的要求,TCP较多,UDP较少,TCP需要多个线程
3. UDP程序结构简单,客户端只需要发送接收即可,服务端只需要接收发送即可
4. 流模式和数据报模式,TCP传输使用流模式,UDP使用数据报模式,使用 DatagramePacket 传输数据
5. TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP 不保证
6. TCP适合传输大量数据,UDP不会分片,不适合传输大量数据
HTTP 协议
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。处于应用层
HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。
HTTP 协议特点
简单快速,客户端向服务端请求时,只需传递方法和路径
灵活,HTTP 运行传输任意类型的数据对象,正在传输的类型由 Content-Type 标记即可
无连接,含义是限制每次连接只处理一个请求,服务器处理完客户端请求、并受到客户端应答后立即断开连接,节约传输时间
无状态,指对事务处理没有记忆能力。缺少状态意味着后续处理需要前面的信息则必须重传,导致传输数据量增大。但是在服务器不需要先前信息时应答更快。
HTTP 的 URL
URL 是 URI 的具体实现形式
HTTP 的请求消息 Request
- 请求行 第一部分:请求行,用来说明请求类型,要访问的资源以及所使用的HTTP版本.
- 请求头部 第二部分:请求头部,紧接着请求行(即第一行)之后的部分,用来说明服务器要使用的附加信息
- 空行,请求头部后面的空行是必须的
- 请求数据,请求数据也叫主体,可以添加任意的其他数据。
POST / HTTP1.1
Host:www.wrox.com
User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
Content-Type:application/x-www-form-urlencoded
Content-Length:40
Connection: Keep-Alive
name=Professional%20Ajax&publisher=Wiley
HTTP 的响应 Response
- 状态行,由HTTP协议版本号, 状态码, 状态消息 三部分组成。
- 消息报头,用来说明客户端要使用的一些附加信息,Date:生成响应的日期和时间;Content-Type:指定了MIME类型的HTML(text/html),编码类型是UTF-8
- 空行,消息报头后面的空行是必须的
- 响应正文,服务器返回给客户端的文本信息。
HTTP/1.1 200 OK
Date: Fri, 22 May 2009 06:07:21 GMT
Content-Type: text/html; charset=UTF-8
HTTP 的状态吗
1xx:指示信息--表示请求已接收,继续处理
2xx: 成功,表示请求已被成功接收、理解、处理
3xx:重定向,302 缓存已修改,使用心得请求 304 缓存未修改,使用旧的
4xx:客户端错误--请求有语法错误或请求无法实现
5xx:服务器端错误--服务器未能实现合法的请求
常见状态码
200 OK //客户端请求成功
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
HTTP 工作原理
- 客户端使用 TCP 连接服务端
- 客户端发送 HTTP 请求
- 服务端接受请求并返回 HTTP 响应
- 释放 TCP 连接
- 客户端解析返回内容
HTTP 请求方法
根据HTTP标准,HTTP请求可以使用多种请求方法。
HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
最常用 GET POST PUT DELETE 对应 查、改、增、删
GET 请求指定的页面信息,并返回实体主体。
HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
PUT 从客户端向服务器传送的数据取代指定的文档的内容。
DELETE 请求服务器删除指定的页面。
CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
OPTIONS 允许客户端查看服务器的性能。
TRACE 回显服务器收到的请求,主要用于测试或诊断。
GET 和 POST 区别
数据传输方式 GET 提交数据附在 URL 之后,使用 ? 和 & 符号连接;POST 提交数据在请求体中。GET,提交数据在地址栏中显示。POSt 不会显示
数据传输大小 HTTP 协议没有对传输数据及 URL 长度做限制。但是特定浏览器会限制 URL 长度。所以 GET 方式 URL 长度有限制,POST 对提交数据理论无限制
安全性 POST 的比 GET 安全性高
keep-alive
从 HTTP/1.1 起,默认都开启了 Keep-Alive,保持连接性,当进行一次 HTTP 请求之后,客户端和服务端之间用于传输 HTTP 数据的 TCP 连接不会关闭,如果客户端再次访问这个服务端,会继续使用这一条已经建立的链接,
Keep-Alive 不会永久保持链接,它有一个保持时间,可以在不同服务器软件中设定。
range
HTTP 区间请求时配置
心跳包
创建 TCP 连接,每隔一段时间客户端都向服务器端发送消息提示存活。
心跳包和轮询区别
心跳包采用 TCP Socket 长连接,不需要多次连接
轮询是每次都发送 HTTP 请求,每次都需要创建 TCP 连接,所以轮询对流量资源和电量的消耗更大
参考连接:
http://blog.csdn.net/ns_code/article/details/14105457
http://www.jianshu.com/p/80e25cb1d81a