JAVA--网络通讯

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013234928/article/details/89416717

网络通讯

关于这一块,就大致连接一个TCP/IP 的3次握手和4次挥手过程吧。日后详细整理。


1、网络模型

OSI分层模型和TCP/IP分层模型

img

4层模型与协议的对应关系

应用层   ------------     Telnet、FTP(文本传输协议)、HTTP、SMTP(邮件传输协议)
传输层   ------------     TCP(传输控制协议)、UDP(用户数据报协议)
网络层   ------------     IP(网络之间的互联协议)
链路层   ------------     ARP、RARP

2、TCP 协议

TCP:传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议。


1> TCP 传输方式

三次握手建立连接

  • server端调用socket(),bind(),listen()创建监听套接字并完成初始化,然后调用accept()阻塞式等待客户连接。
  • 客户端创建一个套接字初始化后,调用connect连接server,
  • 连接过程:
    • 客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认(client:我想要连接你),
    • 服务器收到syn包后,应答一个SYN-ACK,进入SYN_RECV状态(server:好,我准备好了,你连接吧)
    • 客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(client:太好了,我连接好了),此包发送完毕,客户端和服务器进入ESTABLISHED(established)(TCP连接成功)状态,完成三次握手。

数据传输过程:建立连接后,TCP可以提供全双工的通信,server先读再写,client先写在读,用read()和write()阻塞式的等待一个写一个读。一直循环下去。

四次挥手关闭连接:

  • 假设Client端发起中断连接请求,也就是发送FIN,seq=u(上次数据的最后一个字节的序号加1)报文,客户端进入FIN-WAIT-1(意思是说"我Client端没有数据要发给你了)
  • Server端接到FIN报文后,收到确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,进入了CLOSE-WAIT",但是服务器若发送数据,客户端依然要接受,“告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息”
  • 客户端收到申请回复,就进入FIN_WAIT-2状态。(在这之前还需要接受服务器发送的最后的数据)
  • 当Server端确定数据已发送完成,则向Client端发送释放报文FIN=1,ack=u+1,等待客户端响应(如果没收到ACK,就一直发),“告诉Client端,可以了,准备好关闭连接了”。
  • Client端收到释放命令报文后,发出收到确认报文ACK=1,ack=w+1,进入了TIME-WAIT(时间等待)状态;等待了2MSL(最大报文段生存时间)后依然没有收到回复(2MSL:最大报文段生存时间),才进入CLOSED状态,
  • 服务器只要收到了客户端发出的确认,立即进入CLOSED状态

为什么连接的时候是三次握手,关闭的时候却是四次握手?

  • 连接时:服务器收到的SYN,然后发送的SYN+ACK报文。其中ACK报文是用来应答
  • 关闭时:服务器手到FIN,然后发送的ACK报文是确认报文。不会立马关闭

已经建立了连接,但是客户端突然出现故障了怎么办?

TCP有一个保活计时器,如果长时间没收到数据(一般为2小时),服务器就会发送一个探测报文段,以后每隔一段时间(75秒)发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。


2> TCP 优缺点

  • TCP的优点 :可靠,稳定
    TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源。
  • TCP的缺点 :慢,效率低
    占用系统资源高,易被攻击TCP在传递数据之前,要先建连接,这会消耗时间,而且在数据传递时,确认机制、重传机制、拥塞控制机制等都会消耗大量的时间,而且要在每台设备上维护所有的传输连接,事实上,每个连接都会占用系统的CPU、内存等硬件资源。

2.3 TCP与UDP的区别

​ UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议

  • UDP的优点:快,比TCP稍安全
    ​ UDP没有TCP的握手、确认、窗口、重传、拥塞控制等机制,UDP是一个无状态的传输协议,所以它在传递数据时非常快。没有TCP的这些机制,UDP较TCP被攻击者利用的漏洞就要少一些。但UDP也是无法避免攻击的,比如:UDP Flood攻击
  • UDP的缺点 :不可靠,不稳定
    ​ 因为UDP没有TCP那些可靠的机制,在数据传递时,如果网络质量不好,就会很容易丢包。

3、UDP协议

UDP:用户数据报协议 ,是无连接,速度快;但不可靠易丢包

主要学两个类:DatagramSocket、DatagramPacket

  • DatagramSocket表示用来发送和接收数据报包的套接字,套接字就是两台机器之间通信的端点,数据报套接字是包投递服务的发送或接收点,就是寄快递和收快递的点
  • DatagramPacket此类表示数据报包,数据报包用来实现无连接包投递服务

DatagramSocket:receive() 和 send();


4、SOCKET(套接字)

​ 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
​ socket是一种"打开—读/写—关闭"模式的实现,以使用TCP协议通讯,服务器和客户端各自维护一个"文件",在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件

1> 简化的实现步骤

  • 创建ServerSocket和Socket
  • 打开链接到Socket的输入/输出流
  • 按照协议对Socket进行读/写操作
  • 关闭输入输出流、关闭Socket
//---------服务的------------
//1.创建一个服务器端的Socket,即ServerSocket,指定绑定的端口
ServerSocket ss=new ServerSocket(8888);
//2.调用accept方法开始监听,等待客户端的连接
Socket so=ss.accept();//accept方法返回Socket实例
//3.获取一个输入流,并读取客户端信息
InputStream is=so.getInputStream();//字节输入流
InputStreamReader isr=new InputStreamReader(is);//将字节输入流包装成字符输入流
BufferedReader br=new BufferedReader(isr);//加上缓冲流,提高效率
String info=null;
while((info=br.readLine())!=null){//循环读取客户端信息
    System.out.println("我是服务器,客户端说:"+info);

}
so.shutdownInput();//关闭输入流
//4.关闭资源
br.close();
isr.close();
is.close();
so.close();
ss.close();

//------------------客户端
//1.创建客户端Socket,指定服务器地址和端口
Socket so=new Socket("localhost", 8888);//端口号要和服务器端相同
//2.获取输出流,向服务器端发送登录的信息
OutputStream os=so.getOutputStream();//字节输出流
PrintWriter pw=new PrintWriter(os);//字符输出流
BufferedWriter bw=new BufferedWriter(pw);//加上缓冲流
bw.write("用户名:admin;密码:123");
bw.flush();
so.shutdownOutput();//关闭输出流
//3.关闭资源
bw.close();
pw.close();
os.close();
so.close();

5、HTTP 协议

HTTP和RPC的优缺点

  • RPC主要用于公司内部的服务调用,性能消耗低,传输效率高,服务治理方便。

  • HTTP主要用于对外的异构环境,浏览器接口调用,APP接口调用,第三方接口调用等。

  • 传输协议:RPC,可以基于TCP协议,也可以基于HTTP协议;HTTP基于HTTP协议

  • 序列化:RPC,可以基于thrift实现高效的二进制传输;HTTP,大部分是通过json来实现的

详解
HTTP:超文本传输协议,依靠 TCP 协议来传输数据,HTTP 对 TCP 连接的分为两种方式:俗称“短连接”和“长连接”

  • 是利用TCP在两台电脑(通常是Web服务器和客户端)之间传输信息的协议。
  • 客户端使用发起HTTP请求给Web服务器,Web服务器发送被请求的信息给客户端。

短连接的操作步骤是:
建立连接——数据传输——关闭连接…建立连接——数据传输——关闭连接
长连接的操作步骤是:
建立连接——数据传输…(保持连接)…数据传输——关闭连接


1> HTTP通信过程

  • 建立TCP连接
  • 客户端发送请求
  • 服务器响应请求
  • 服务器关闭TCP连接

wireshark工具抓包


2> http的请求方式

8种请求方法: GET, POST 、PUT,、DELETE、CONNECT 、HEAD、OPTIONS, , TRACE

HTTP 请求方式详解:

GET 请求指定的页面信息,并返回实体主体。
HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
PUT 从客户端向服务器传送的数据取代指定的文档的内容。
DELETE 请求服务器删除指定的页面。
CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
OPTIONS 允许客户端查看服务器的性能。
TRACE 回显服务器收到的请求,主要用于测试或诊断。

post 和get 的区别

  • GET提交:
    请求的数据会附在URL之后
    GET提交的数据大小有限制(因为浏览器对URL的长度有限制)
  • POST提交:
    把提交的数据放置在是HTTP包的包体中
    POST的安全性要比GET的安全性高

3> http状态码

1xx:指示信息–表示请求已接收,继续处理
2xx:成功–表示请求已被成功接收、理解、接受
3xx:重定向–要完成请求必须进行更进一步的操作
4xx:客户端错误–请求有语法错误或请求无法实现
5xx:服务器端错误–服务器未能实现合法的请求

常见状态码:

200 OK                        //客户端请求成功
302 Found                     //临时重定向
400 Bad Request               //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized              //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 
403 Forbidden                 //服务器收到请求,但是拒绝提供服务
404 Not Found                 //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error     //服务器发生不可预期的错误
503 Server Unavailable        //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
504 Getaway Timeout           //网关超时,是代理服务器等待应用服务器响应时的超时

4> http和https的区别

​ HTTPS是一种通过计算机网络进行安全通信的传输协议,经由HTTP进行通信,利用SSL/TLS建立全信道,加密数据包。HTTPS使用的主要目的是提供对网站服务器的身份认证,同时保护交换数据的隐私与完整性。

​ 通俗的讲就是:HTTPS是身披SSL外壳的HTTP


扩展:

HTTP 请求

  • 状态行:包括请求方式Method、资源路径URL、协议版本Version;

  • 请求头:包括一些访问的域名、用户代理、Cookie等信息;

  • 请求正文:就是HTTP请求的数据。

    HTTP响应由三部分组成:状态行、响应头、响应正文:

  • 状态行:包括协议版本Version、状态码Status Code、回应短语;

  • 响应头:包括搭建服务器的软件,发送响应的时间,回应数据的格式等信息;

  • 响应正文:就是响应的具体数据。


5> HTTP 协议头字段详解

请求头字段的具体含义
Accept:告诉WEB服务器自己接受什么介质类型,/ 表示任何类型,type/* 表示该类型下的所有子类型,type/sub-type。

Accept-Charset:浏览器申明自己接收的字符集

Accept-Encoding:浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate)

Accept-Language:浏览器申明自己接收的语言

Authorization:授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中。

Connection:表示是否需要持久连接。如果Servlet看到这里的值为“Keep-Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。要实现这一点,Servlet需要在应答中发送一个Content-Length头,最简单的实现方法是:先把内容写入ByteArrayOutputStream,然后在正式写出内容之前计算它的大小。

Content-Length:表示请求消息正文的长度。

Cookie:设置cookie,这是最重要的请求头信息之一

From:请求发送者的email地址,由一些特殊的Web客户程序使用,浏览器不会用到它。

Host:初始URL中的主机和端口。

If-Modified-Since:只有当所请求的内容在指定的日期之后又经过修改才返回它,否则返回304“Not Modified”应答。

Pragma:指定“no-cache”值表示服务器必须返回一个刷新后的文档,即使它是代理服务器而且已经有了页面的本地拷贝。

Referer:包含一个URL,用户从该URL代表的页面出发访问当前请求的页面。

User-Agent:浏览器类型,如果Servlet返回的内容与浏览器类型有关则该值非常有用。

UA-Pixels,UA-Color,UA-OS,UA-CPU:由某些版本的IE浏览器所发送的非标准的请求头,表示屏幕大小、颜色深度、操作系统和CPU类型。

猜你喜欢

转载自blog.csdn.net/u013234928/article/details/89416717