一、网络编程
1、网络体系
TCP/IP模型 | OSI模型 | 功能 | 协议簇 |
应用层 | 应用层 | 为应用程序提供服务 | HTTP FTP DNS SMTP TFTP |
表示层 | 数据格式化转化,数据加密 | ||
会话层 | 建立,管理和维护会话 | ||
传输层 | 传输层 | 建立/管理和维护端对端的连接 | TCP UDP |
网络层 | 网络层 | IP地址及路由选择 | IP |
链路层 | 链路层 | 提供介质访问和链路管理 | ARP RARP |
物理层 | 物理传输 |
二、Tcp
1、三次握手
解析:
-
客户端请求建立连接:客户端发送(SYN=1,seq=J) 报文给服务器端,进入SYN_SEND状态,connect主动打开
-
服务端应答客户端,并请求建立连接:服务器端收到SYN报文,accept被动打开,回应一个(SYN=1,seq=K,ACK=1,ack=x+1)报文,进入SYN_RECV状态,connect返回,客户端收到报文,进入Established状态
-
客户端针对服务端请求确认应答:客户端收到服务器端的SYN报文,回应一个(ACK=1,ack=K+1)报文,进入Established状态,accept返回
2、三次握手的漏洞
SYN洪泛攻击
客户端利用伪造的IP地址向服务器发送请求(第一次握手),而服务端的响应(第二次握手)的报文将永远发送不到真实的客户端,服务端在等待第三次握手,但是第三次握手是不会有的,因此在这种半开的连接过程中会消耗资源。
解决方案:
无效连接监控释放
延缓TCB分配方法
防火墙
3、四次挥手
解析:
1.某个应用进程首先调用close,称该端执行“主动关闭”(active close)。该端的TCP于是发送一个FIN分节,表示数据发送完毕。
2. 接收到这个FIN的对端执行 “被动关闭”(passive close),这个FIN由TCP确认。
注意:FIN的接收也作为一个文件结束符(end-of-file)传递给接收端应用进程,放在已排队等候该应用进程接收的任何其他数据之后,因为,FIN的接收意味着接收端应用进程在相应连接上再无额外数据可接收。
3. 一段时间后,接收到这个文件结束符的应用进程将调用close关闭它的套接字。这导致它的TCP也发送一个FIN
4. 接收这个最终FIN的原发送端TCP(即执行主动关闭的那一端)确认这个FIN
4、TCP可靠性的保证
通过序列号和确认应答机制提高可靠性
数据超时重传是发送端在某个数据包发送出去,在一段固定时间后如果没有收到对该数据包的确认应答,则(假定该数据包在传输过程中丢失)重新发送该数据包。而数据确认应答是指接收端在成功接收到一个有效数据包后,发送一个确认应答数据包给发送端主机,该确认应答数据包中所包含的应答序列号即指已接收到的数据中最后一个字节的序列号加1,加1 的目的在于指出此时接收端期望接收的下一个数据包中第一个字节的序列号。数据超时重传和数据确认应答以及对每个传输的字节分配序列号是TCP 协议提供可靠性数据传输的核心本质。
5、TCP协议中的窗口机制
发送方和接收方都会维护一个数据帧的序列,这个序列被称作窗口
发送方的窗口由接收方确认
目的:
确保数据不丢失,如果发送的数据丢失了可以重新发。
控制发送速度,以免接收方的缓存不够大导致溢出,同时控制流量也可以避免网络拥塞。
6、全双工
全双工是客户端和服务端能同时发送数据,TCP是全双工
三、UDP
udp是将数据及源和目的封装成数据包中(大小限制在64k),不需要建立连接,速度快,不可靠
四、HTTP
HTTP(Hyper Text Transfer Protocol)即超文本传输协议。HTTP协议是建立在TCP协议上的一种协议。Http连接最显著的特点是客户端发送的每次请求都需要服务器会送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接“,使用TCP端口默认是80
2、HTTP请求的传输过程
3、一次完整http请求过程
首先进行DNS域名解析(本地浏览器缓存、操作系统缓存或者DNS服务器
(1)三次握手建立TCP连接
(2)客户端向服务端发送请求命令 Get /www.xx.com/http/1.1
(3)客户端发送请求头信息
(4)服务器应答 Http/1.1 200 OK
(5)服务器向客户端发送数据
(6)服务器关闭TCP连接
4、报文结构
4.1、请求报文
4.2、响应报文
常见返回码:
5、常见header
header头 | 域值 | 解析 |
Connection | Keep-Alive close | Keep-Alive表示长连接,close表示关闭 |
Keep-Alive | timeout=5, max=100 | timeout=5表示TCP通道可以保持5秒,max=100,表示这个长连接最多接收100次请求就断开 |
Range | 断点续传 | |
Cache-Control | no-cache no-store max-age=<seconds> | no-cache表示发布缓存副本之前,强制要求缓存把请求提交给原始服务器进行验证(协商缓存验证) no-store不使用任何缓存 max-age 缓存存储的最大周期,超过这个时间缓存被认为过期(单位秒 |
last-Modified | ||
Content-Length | ||
Content-Type |
5.1、长连接的建立
(1)建立HTTP长连接,HTTP请求头包含如下内容:Connection:Keep-Alive
(2)服务端同意建立长连接,HTTP响应头包含如下内容:Connection:Keep-Alive
(3)关闭连接时,HTTP头包含:Connection:Close
6、HTTP的缺陷
(1)通信使用明文,容易被窃听
(2) 不能验证通信方身份,
(3)无法验证报文的完整性,可能遭到篡改
7、HTTP各版本区别
版本 | 差异 |
HTTP1.0 | 短连接 |
HTTP1.1 | Keep-Alive;增加Options,put,delete方法;增加一些cache的特性 |
HTTP2.0 | 多路复用(二进制分帧) |
多路复用:
不会改动HTTP 的语义,HTTP 方法、状态码、URI 及首部字段,等等这些核心概念上一如往常,却能致力于突破上一代标准的性能限制,改进传输性能,实现低延迟和高吞吐量。而之所以叫2.0,是在于新增的二进制分帧层。在二进制分帧层上, HTTP 2.0 会将所有传输的信息分割为更小的消息和帧,并对它们采用二进制格式的编码 ,其中HTTP1.x的首部信息会被封装到Headers帧,而我们的request body则封装到Data帧里面
六、HTTPS
HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer)是安全的超文本传输协议,网景公司设计了SSL(Secure Socket Layer)协议用于对Http协议传输的数据进行加密,保证会话过程中的安全性。
使用TCP端口默认为443
1、名词简介
(1)密钥
密钥是一参数,作为加密和解密算法中输入的参数。
(2)对称加密
对称加密又叫做私钥加密,发送发和接收方使用同个密钥加密和解密;特点是算法公开,加密和解密速度快,适合对大数据进行加密。
常见的对称假面算法:DES,3DES,AES,Blowfish,IDEA,RC5,RC6
(3)非对称加密
非对称加密也叫做公钥加密。他使用一对密钥:公钥和私钥,一个用来加密,另一个就用来解密。特点是加密和解密花费时间长,速度慢,只适合对少量数据进行加密。
常见的公钥加密算法有:RSA,ELGamal,背包算法,Rabin
2、SSL协议
SSL协议用到了对称加密,也用到了非对称加密,在建立传输链路时,首先使用非对称加密方式加密某个密钥(简称A,后面传输数据用的对称加密密钥),然后发送给服务端,链路建立好后,使用客户端生成的A密钥进行数据加密。
3、SSL建立连接过程
(1)客户端向服务端发送信息,信息包括随机值A和客户端支持的加密算法
(2)服务端响应客户端的握手信息,包括随机值B和协商的加密算法
(3)服务端发送第二个响应报文,它是数字证书
(4)客户端解析证书,由客户端的TLS来完成,检验数字证书的合法性,公钥是否有效,如果证书没有问题,然后生成一个随机值C(预主密钥)
(5)客户端数字证书通过后,通过随机值A,随机值B和随机值C组装成会话秘钥D,然后通过数字证书的公钥加密
(6)客户端传送加密信息,服务端通过自己的私钥解密,得到会话秘钥D
(7)客户端通过会话秘钥加密一条信息给服务端,验证服务端是否正常接收客户端加密的消息
(8)同样服务端也会通过会话秘钥加密一条消息回传给客户端,如果客户端能够正常收到,表示SSL层连接建立完成了
4、数字签名
(1) 怎么保证服务端给客户端的公钥是真实的公钥,而不是中间人伪造的?
(2) 证书如何安全传输,被掉包了怎么办
数字签名:服务端将要传输的信息进行hash,得到独一无二的字符,通常把hash之后的内容称为信息摘要message diget,hash技术是不可逆的,然后把信息摘要用自己的私钥进行加密,再传输给客户端,客户端使用公钥就可以进行正确的解码。
5、数字证书
数字证书内容包括了加密码服务器的公钥,权威机构的信息,服务器域名,还有经过CA私钥签名之后的证书内容(先通过Hash函数计算得到证书数字摘要,然后用权威机构私钥加密数字摘要得到数字签名),签名计算方法以及证书对应的域名。
七、代码
(1)tcp实现----socket代码
服务端
//1创建服务,并监听一个端口
ServiceSocket socket= new ServiceSocket(10000);
//2获取连接过来的客户端对象
Socket s=socket.accept();//该方法是阻塞式
//3服务端要使用对应的客户端对象,并读取读取流
InputStream in=s.getInputStream();
//这是服务端给客户端发送的输出流
OutputStream out=s.getOutputStream();
out.write(“我也来了”.getBytes());
//4关闭资源(可选)
socket.close();
客户端
//1、创建socket服务,里面既包含输出流,也包含输入流
Socket s=new Socket(“192.168.0.1”,10000);
//为了发送数据,应该获取socket流
OutputStream out=s.getOutputStream();
out.write(“我来了”.getBytes());
//关闭资源
s.close();
2、udp实现
DatagramSocket用来初始化DatagramSocket
DatagramPacket(包裹),用来发送(发送的包需要ip)和接受封装的消息。
//1创建udp socket对象
DatagramSocket ds=new DatagramSocket();
//2封装成发送数据包(包含数据,inetAddress,端口号)
byte[] buf=”我要发数据了”.getBytes();
InetAddress inetAddress=InetAddress.getByName(“192.168.0.1”);
DatagramPacket dp=new DatagramPacket(buf,buf.length,inetAddress,1000);
//3通过socket将已有的数据包发送出去
ds.send(dp);
//4关闭资源
Ds.close;
接收流程
//1创建udp socket对象,通常会监听一个端口,默认是系统随机分配的
DatagramSocket ds=new DatagramSocket(1000);
//2封装接收数据包
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,buf.length;
//3通过服务的receive方法将数据存入数据包中,receive阻塞式
ds.receive(dp);
//4通过数据包获取想要的信息(inetAddress,端口号,消息)
String ip= dp.getAddress().getHostAddress();
String data=new String(dp.getData(),0dp.getLength());
Int port=dp.getPort();
//5关闭资源
ds.close();
3、java提供网络功能四大类
InetAddress 用于标识网络上的硬件资源,表示互联网协议(IP)地址
Url 统一资源定位符,通过url可以直接读取获写入网络上的数据
Sockets 使用TCP协议实现网络通信的Scoket相关的类
DatagramSocket 使用UDP协议,将数据保存在数据报中,通过网络进行通信
(1)InetAddress没有构造方法,所以无法new,但提供了一些静态方法,返回的就是该对象
InetAddress address=InetAddress .getLocalHost();//获取本机的InetAddress实例
InetAddress address=InetAddress .getByName(“1.1.1.10”);//根据ip获取InetAddress实例
InetAddress address=InetAddress .getByName(“zhao”);//根据主机名获取InetAddress实例
(2)URL
Url由两部分组成:协议名称和资源名称,中间用冒号隔开 如: http://www.baid.com