网络编程
一、 概念
1) TCP/IP参考模型
应用层(application) smtp,ftp,telnet
传输层(transport) 解释数据(tcp)
网络层(ip) 定位IP地址和确定连接路径
链路层(link) 与硬件驱动对话
2) IP与端口
IP地址
每个internet上的主机和路由器都有一个IP地址,它包括网络号和主机号,所有IP地址都是32位的
端口(port)
有65535个端口,0号是保留端口
1-1024是固定端口,又叫有名端口,即被某些程序固定使用,一般程序员不使用
21-- ftp使用
22—SSH远程登录协议
23—telnet使用
25—smtp服务使用
80—iis使用
7—echo使用
1025—65535是动态端口,这些端口,程序员可以使用
3) 注意事项
1、在计算机(尤其是做服务器)要尽可能的少开端口
2、一个端口只能被一个程序监听,使用netstat–an可以查看本机有哪些端口在监听,再结合任务管理器关闭不安全的端口
二、数据传输过程与Socket原理图
数据传输过程:
Socket原理图:
三、服务器端与客户端代码(多线程)
建立TCP客户端
package com.yuhui;
import java.io.*;
import java.net.*;
public class MyClient {
public Socket s;
public boolean sendLoginInfoToServer(Objecto) {
boolean b= false;
try {
//socket()就是去连接某个服务器端口
//127.0.0.1表示服务器的ip,9999表示服务器的端口
s = new Socket("127.0.0.1",9999);
// 发送数据
ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());
oos.writeObject(o);
// 接受数据
ObjectInputStream ois = new ObjectInputStream(s.getInputStream());
Message ms= (Message) ois.readObject();
b = true;
} catch (Exception e) {
e.printStackTrace();
}
return b;
}
}
建立TCP服务器端
一般,我们把服务器端写成是分发Socket的,也就是总是在运行,创建一个TCP服务器端程序的步骤:
创建一个ServerSocket
从ServerSocket接受客户连接请求
创建一个服务线程处理新的连接
在服务线程中,从socket中获得I/O流
对I/O流进行读写操作,完成与客户的交互
关闭I/O流
关闭Socket
输入输出流必须flush()。
ServerSocket server = newServerSocket(post)
Socket connection =server.accept();
ObjectInputStream put=newObjectInputStream(connection.getInputStream());
ObjectOutputStreamoput=new ObjectOutputStream(connection.getOutputStream());
处理输入和输出流;
关闭流和socket
典型的服务器端代码:
public class Server1 {
public static void main(String[] args) throws Exception {
ServerSocket ss=new ServerSocket(9000);
while(true){
Socket s=ss.accept();//获得一个Socket对象。
Thread t=new Thread1(s);//分发Socket。
t.start();
}
}
}
class Thread1 extends Thread{
Socket s;
public Thread1(Socket s){
this.s=s;
}
public void run(){
try {
OutputStream o=s.getOutputStream();
PrintWriter out=new PrintWriter(o);
out.println("Hello Client");
out.flush();
s.close();
} catch (IOException e) {
// TODO Auto-generated catch block e.printStackTrace();
}
}
}
四、网络协议
1)HTTP
1、简介
HTTP是 hypertext transfer protocol(超文本传输协议)的简写,它是 TCP/IP 协议集中的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程以及数据本身的格式。
2、会话方式
浏览器与WEB服务器的连接过程是短暂的,每次连接只处理一个请求和响应。对每一个页面的访问,浏览器与WEB服务器都要建立一次单独的连接。
浏览器到WEB服务器之间的所有通讯都是完全独立分开的请求和响应对。
3、请求消息、响应消息结构
请求消息的结构:
一个请求行、若干消息头、以及实体内容,其中的一些消息头和实体内容都是可选的,消息头和实体内容之间要用空行隔开。
HTTP响应消息
响应消息的结构:
一个状态行、若干消息头、以及实体内容 ,其中的一些消息头和实体内容都是可选的,消息头和实体内容之间要用空行隔开。
1、 Get、Post请求区别
(1)在客户端,Get方式在通过URL提交数据,数据在URL中可以看到;POST方式,数据放置在HTMLHEADER内提交。
(2)GET方式提交的数据最多只能有1024字节,而POST则没有此限制。
(3) 安全性问题。正如在(1)中提到,使用 Get 的时候,参数会显示在地址栏上,而 Post 不会。
5、Session与Cookies
Cookies:是针对每一个网站的信息,每一个网站只对应一个,其它网站不能访问。这个文件是保存在客户端的,每次你打开相应网站,浏览器会查找这个网站的cookies,如果有就会将这个文件发送出去。Cookies文件的内容大致包含这些信息如用户名,密码,设置等。
Session:是针对每一个用户的,只要客户机访问,程序就会为这个客户新增一个session。Session里主要保存的是用户的登录信息,操作信息等。这个session在用户访问结束后会被自动消失(如果超时也会)
区别:
② session是存储在服务器端的,cookies是存储在客户端,所以session的安全性要高于cookie
① session里的信息是通过存放在会话cookie里的sessionId获取的
③因为session是存放在服务器里的,所以session里的东西不断增加会增加服务器的负担,我们会把一些重要的东西放在session里,不太重要的放在客户端的cookie里
④cookie分为两大类,会话cookie和持久化cookie,他们的生命周期和浏览器是一致的,浏览器关了会话cookie也就消失了,而持久化会存储在客户端硬盘中
⑤当浏览器关闭的时候会话cookie也就消失所以我们的session也就消失了,session在什么情况下丢失,就是在服务器关闭的时候,或者是session过期(30分钟默认)
2)HTTPS
1、工作原理
HTTPS在传输数据之前需要客户端(浏览器)与服务端(网站)之间进行一次握手,在握手过程中将确立双方加密传输数据的密码信息。TLS/SSL协议不仅仅是一套加密传输的协议,更是一件经过艺术家精心设计的艺术品,TLS/SSL中使用了非对称加密,对称加密以及HASH算法。握手过程的具体描述如下:
1.浏览器将自己支持的一套加密规则发送给网站。
2.网站从中选出一组加密算法与HASH算法,并将自己的身份信息以证书的形式发回给浏览器。证书里面包含了网站地址,加密公钥,以及证书的颁发机构等信息。
3.浏览器获得网站证书之后浏览器要做以下工作:
a) 验证证书的合法性(颁发证书的机构是否合法,证书中包含的网站地址是否与正在访问的地址一致等),如果证书受信任,则浏览器栏里面会显示一个小锁头,否则会给出证书不受信的提示。
b) 如果证书受信任,或者是用户接受了不受信的证书,浏览器会生成一串随机数的密码,并用证书中提供的公钥加密。
c) 使用约定好的HASH算法计算握手消息,并使用生成的随机数对消息进行加密,最后将之前生成的所有信息发送给网站。
4.网站接收浏览器发来的数据之后要做以下的操作:
a) 使用自己的私钥将信息解密取出密码,使用密码解密浏览器发来的握手消息,并验证HASH是否与浏览器发来的一致。
b) 使用密码加密一段握手消息,发送给浏览器。
5.浏览器解密并计算握手消息的HASH,如果与服务端发来的HASH一致,此时握手过程结束,之后所有的通信数据将由之前浏览器生成的随机密码并利用对称加密算法进行加密。
这里浏览器与网站互相发送加密的握手消息并验证,目的是为了保证双方都获得了一致的密码,并且可以正常的加密解密数据,为后续真正数据的传输做一次测试。另外,HTTPS一般使用的加密与HASH算法如下
非对称加密算法:RSA,DSA/DSS
对称加密算法:AES,RC4,3DES
HASH算法:MD5,SHA1,SHA256
HTTPS对应的通信时序图如下:
2、HTTPS与HTTP区别
①https协议需要到ca申请证书,一般免费证书很少,需要交费。
②http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。
③http的连接很简单,是无状态的 。
④HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议, 要比http协议安全。
3)TCP/IP
1、三次握手(建立连接协议)
TCP三次握手
Q : 为什么要三次握手, 两次不可以吗?
A : 试想一下, A第一次发送请求连接, 但是在网络某节点滞留了, A超时重传, 然后这一次一切正常, A跟B就愉快地进行数据传输了. 等到连接释放了以后, 那个迷失了的连接请求突然到了B那, 如果是两次握手的话, B发送确认, 它们就算是建立起了连接了. 事实上A并不会理会这个确认, 因为我压根没有要传数据啊. 但是B却傻傻地以为有数据要来, 苦苦等待. 结果就是造成资源的浪费.
更加接地气的解释就是 : A打电话给B
第一次握手 : 你好, 我是A, 你能听到我说话吗
第二次握手 : 听到了, 我是B, 你能听到我说话吗
第三次握手 : 听到了, 我们可以开始聊天了
因此,三次握手其实就是为了检测双方的发送和接收能力是否正常
2、四次挥手(连接终止协议)
TCP四次挥手
四种状态:主动打开、被动打开、主动关闭、被动关闭
Q : 为什么要四次挥手, 而不是两次, 三次?
A :首先, 由于TCP的全双工通信, 双方都能作为数据发送方. A想要关闭连接, 必须要等数据都发送完毕, 才发送FIN给B. (此时A处于半关闭状态)
然后, B发送确认ACK, 并且B此时如果要发送数据, 就发送(例如做一些释放前的处理)
再者, B发送完数据之后, 发送FIN给A. (此时B处于半关闭状态)
然后, A发送ACK, 进入TIME-WAIT状态
最后, 经过2MSL时间后没有收到B传来的报文, 则确定B收到了ACK了. (此时A, B才算是处于完全关闭状态)
PS : 仔细分析以上步骤就知道为什么不能少于四次挥手了.
Q : 为什么要等待2MSL(Maximum Segment Lifetime)时间, 才从TIME_WAIT到CLOSED?
A : 在Client发送出最后的ACK回复,但该ACK可能丢失。Server如果没有收到ACK,将不断重复发送FIN片段。所以Client不能立即关闭,它必须确认Server接收到了该ACK。Client会在发送出ACK之后进入到TIME_WAIT状态。Client会设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么Client会重发ACK并再次等待2MSL。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。
更加接地气的解释 :
第一次挥手 : A告诉B, 我没数据发了, 准备关闭连接了, 你要发送数据吗
第二次挥手 : B发送最后的数据
第三次挥手 : B告诉A, 我也要关闭连接了
第四次挥手 : A告诉B你可以关闭了, 我这边也关闭了
4) 其他
1、滑动窗口机制
由发送方和接收方在三次握手阶段,互相将自己的最大可接收的数据量告诉对方。也就是自己的数据接收缓冲池的大小。这样对方可以根据已发送的数据量来计算是否可以接着发送。
在处理过程中,当接收缓冲池的大小发生变化时,要给对方发送更新窗口大小的通知。
2、拥塞避免机制
拥塞:对资源的需求超过了可用的资源。若网络中许多资源同时供应不足,网络的性能就要明显变坏,整个网络的吞吐量随之负荷的增大而下降。
拥塞控制:防止过多的数据注入到网络中,使得网络中的路由器或链路不致过载。
拥塞控制方法:
- 慢开始 + 拥塞避免;
- 快重传 + 快恢复。
3、地址解析
浏览器中输入:“www.xxx.com” 之后都发生了什么?请详细阐述。
- 由域名→IP 地址
寻找 IP 地址的过程依次经过了浏览器缓存、系统缓存、hosts 文件、路由器缓存、 递归搜索根域名服务器。 - 建立 TCP/IP 连接(三次握手具体过程)
- 由浏览器发送一个 HTTP 请求
- 经过路由器的转发,通过服务器的防火墙,该 HTTP 请求到达了服务器
- 服务器处理该 HTTP 请求,返回一个 HTML 文件
- 浏览器解析该 HTML 文件,并且显示在浏览器端
- 这里需要注意:
- HTTP 协议是一种基于 TCP/IP 的应用层协议,进行 HTTP 数据请求必须先建立 TCP/IP 连接
- 可以这样理解:HTTP 是轿车,提供了封装或者显示数据的具体形式;Socket 是发动机,提供了网络通信的能力。
- 两个计算机之间的交流无非是两个端口之间的数据通信 , 具体的数据会以什么样的形式展现是以不同的应用层协议来定义的。
4、常见HTTP状态码
- 1xx(临时响应)
- 2xx(成功)
- 3xx(重定向):表示要完成请求需要进一步操作
- 4xx(错误):表示请求可能出错,妨碍了服务器的处理
- 5xx(服务器错误):表示服务器在尝试处理请求时发生内部错误
- 常见状态码:
- 200(成功)
- 304(未修改):自从上次请求后,请求的网页未修改过。服务器返回此响应时,不会返回网页内容
- 401(未授权):请求要求身份验证
- 403(禁止):服务器拒绝请求
- 404(未找到):服务器找不到请求的网页
5、TCP与UDP区别
①TCP提供的是面向连接的、可靠的数据流传输;UDP提供的是非面向连接的、不可靠的数据流传输
②TCP提供可靠的服务,通过TCP连接传送的数据,无差错、不丢失、不重复、按序到达;UDP尽最大努力交付,即不保证可靠支付
③TCP面向字节流;UDP面向报文
④TCP首部开销20字节;UDP的首部开销小,只有8个字节
上一篇: Java字节码实战