java知识库——网络篇
在移动互联网欣欣向荣的时代,作为开发人员,网络编程的掌握是很有必要的,这里个人归纳总结了网络的基础知识及java常用的两种通讯方式:http和socket。
1.基本概念:
计算机网络:将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。
主要功能:资源共享、信息传输与集中处理、均衡负荷与分布处理等。
地理划分:局域网(LAN),城域网(MAN),广域网(WAN);
传输介质划分:有线网,光纤网,无线网(代表:无线局域网(WLAN));
数据交换方式划分:电路交换网,报文交换网,分组交换网;
通信方式划分:广播式传输网,点到点式传输网;
服务方式划分:客户机与服务器网,对等网;
网络编程:就是在发送端把信息通过规定好的协议进行组装包,在接收端按照规定好的协议把包进行解析,从而提取出对应的信息,达到通信的目的。
网络通信协议:网络通信协议是一种网络通用语言,为连接不同操作系统和不同硬件体系结构的互联网络引提供通信支持,是一种网络通用语言。
作用:让不同的操作系统、设备可以相互通信;
网络通信协议三要素:语义,语法,时序;语义表示要做什么,语法表示要怎么做,时序表示做的顺序;
常见的网络通信协议有:TCP/IP协议、IPX/SPX协议、NetBEUI协议等;
OSI分层模型:是国际标准化组织(ISO)提出的一个试图使各种计算机在世界范围内互连为网络的标准框架。
TCP协议:(Transmission Control Protocol 传输控制协议) 是一种面向连接的、可靠的、基于字节流的传输层通信协议。
UDP协议:(User Datagram Protocol 用户数据报协议) 是向应用程序提供了一种发送封装的原始IP数据报的方法,发送时无需建立连接,是一种不可靠的传输协议。
IP协议:是将多个包交换网络连接起来,它在源地址和目的地址之间传送一种称之为数据包的东西,它还提供对数据大小的重新组装功能,IP协议是网络层的主要协议,其最大的贡献是提供独一无二的IP地址。
HTTP协议:超文本传输协议,英文全称是Hypertext Transfer Protocol,它是互联网上应用最为广泛的一种网络协议。HTTP是一种应用层协议,它是基于TCP协议之上的请求/响应式的协议,即一个客户端与服务器建立连接后,向服务器发送一个请求;服务器接到请求后,给予相应的响应信息。HTTP协议默认的端口号为80。
Socket:套接字,就是两台主机之间逻辑连接的端点,服务端的叫ServerSocket,客服端的叫Socket,TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据。Socket,本质上就是一组接口,是对TCP/IP协议的封装和应用(程序员层面上)。
2.通信协议分层思想
为什么要分层?
由于节点之间联系很复杂,分层可以将这些复杂成分分成简单的成分,即同层间可以通信,上一层可以调用下一层,而与再下一层不发生关系,利于系统的开发和扩展。
OSI分层模型和TCP/IP分层模型的对应关系
3.TCP协议
TCP的工作流程
1.三次握手
每个TCP连接都有3个阶段:连接建立、数据传送和连接释放。连接建立经历三个步骤,通常称为“三次握手”,如下图。
第一次握手:客服端发送连接请求:SYN=1,seq=x 给服务器,等待服务器确认。
第二次握手:服务器收到连接请求,如果同意建立连接,向客户端发回确认信息:SYN=1,ACK=1,seq=y,ack=x+1 并为该TCP连接分配TCP缓存和变量。
第三次握手:客户端收到服务器的确认信息后,向服务器发出客户端确认信息:ACK=1,seq=x+1,ack=y+1 并也要给该连接分配缓存和变量。此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
2.四次挥手
四次挥手流程图如下:
第一次挥手:客户端发送一个FIN,用来关闭客户端到服务器的数据传送。
第二次挥手:服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。
第三次挥手:服务器关闭客户端的连接,发送一个FIN给客户端。
第四次挥手:客户端发回ACK报文确认,并将确认序号设置为收到序号加1。
4.UDP协议
UDP协议格式
从图中可知,UDP由两部分组成:首部和数据。其中,首部仅有8个字节,包括源端口和目的端口,长度(UDP用于数据报的长度)、校验和。
5.HTTP协议
1.HTTP版本
现在使用的HTTP协议是HTTP/1.1版本,1997年之前采用的是HTTP1.0版本。HTTP连接在1.0版本中采用非持续连接工作方式,1.1版本采用的是持续连接工作方式,持续连接是指服务器在发送响应后仍然在一段时间内保持这条由TCP运输层协议建立起来的连接,使客户机和服务器可以继续在这条连接上传输HTTP报文。(是否采用持续连接工作方式,1.0中默认是关闭的,需要在HTTP头加入"Connection:Keep-Alive",才能启用Keep-Alive。HTTP1.1中默认启用Keep-Alive,如果加入"Connection:close",才关闭。目前大部分浏览器都是用HTTP1.1协议,也就是说默认都会发起Keep-Alive的连接请求了,所以是否能完成一个完整的Keep- Alive连接就看服务器设置情况)
2.响应状态码
HTTP的状态码主要有五大类,如下图:
3.HTTP与HTTPS的区别
HTTPS就是HTTP的安全版;HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。它是一个URI scheme(抽象标识符体系),句法类同http:体系。用于安全的HTTP数据传输。https:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)。
主要区别有4点:
1.HTTPS协议需要到CA申请证书,一般免费证书很少,需要交费。
2.HTTP是超文本传输协议,信息是明文传输,HTTPS则是具有安全性的SSL加密传输协议。
3.HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4.HTTP的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比HTTP协议安全。
4.java中HTTP的主要几种框架
目前比较流行的网络框架是okhttp,参考文献:
四种网络方式对比:http://blog.****.net/zhangcanyan/article/details/51793951
RxJava+OkHttp+Retrofit:http://www.jianshu.com/p/253fe1ef6697
6.Socket
整体流程:
Socket编程主要涉及到客户端和服务器端两个方面,首先是在服务器端创建一个服务器套接字(ServerSocket),并把它附加到一个端口上,服务器从这个端口监听连接。端口号的范围是0到65536,但是0到1024是为特权服务保留的端口号,我们可以选择任意一个当前没有被其他进程使用的端口。
客户端请求与服务器进行连接的时候,根据服务器的域名或者IP地址,加上端口号,打开一个套接字。当服务器接受连接后,服务器和客户端之间的通信就像输入输出流一样进行操作。
socket实例:
服务端代码:
客服端代码: