Socket

来源:互联网 发布:如何在淘宝上赚运费险 编辑:程序博客网 时间:2024/05/23 22:02

1、OSI七层网络模型

OSI七层网络模型从上到下依次是:应用层、表示层、会话层、传输层、网络层、数据链路层和物理层。 
其中应用层、表示层、会话层和传输层被称作主机层,是开发工程师通过开发应用程序处理和实现的内容;而网络层、物理层和数据链路层被称作媒体层,是网络工程师所研究的对象。

2、TCP/IP四层网络模型

TCP/IP四层网络模型从上到下依次是:应用层、传输层、网间层和网络接口层。 
其中应用层包含了七层网络模型中的上三层:应用层、表示层和会话层,传输层对应传输层,网络层对应网间层,网络接口层包含了数据链路层和物理层。

OSI七层网络模型与TCP/IP四层网络模型对应关系、协议以及功能描述,如下图: 
这里写图片描述

网络协议可以补充查看阮一峰大神的两篇博客:互联网协议入门(一)、互联网协议入门(二)

3、HTTP协议与TCP/IP协议概念与关系

HTTP协议:处于应用层,是Web联网的基础,主要负责数据的包装、服务请求和服务应答;关于HTTP协议的介绍可以看:HTTP 协议入门、关于HTTP协议一篇就够了、HTTP协议详解(真的很经典)、HTTP协议报文工作原理及Java中的HTTP通信技术详解 
应用层并非由计算机上运行的实际应用软件组成,而是由向应用程序提供访问网络资源的API组成,应用程序组成的API实现HTTP协议。

TCP/IP协议:处于传输层和网络层,主要负责数据(字节流)的传输,其中TCP负责数据的传输方式,IP负责管理数据传输地址。此处涉及TCP/IP协议三次握手建立连接与四次挥手关闭连接,可以查看:TCP/IP协议三次握手与四次握手流程解析。

TCP/IP协议负责传输数据,支持TCP/IP协议的网络通信的基本操作单元称为套接字(socket),它是网络通信过程中端点的抽象表示。

HTTP协议是应用层,底层通过TCP/IP协议来传输字节流信息,HTTP协议是建立在TCP协议之上的一种应用。

4、Socket套接字与Socket接口编程

Socket概念

套接字(Socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。

应用层通过传输层进行数据通信时,TCP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个 TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了套接字(Socket)接口。应用层可以和传输层通过Socket接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。

Socket是对TCP/IP协议栈操作的抽象,是一个调用接口(API)。Socket套节字对象,是连接两个网络端点的发送器。

HTTP、TCP/IP、Socket的区别,可以查看:TCP/IP SOCKET HTTP及HTTPS之间的关系及各自特性之总结

Java中Socket接口编程

Socket接口编程,建立Socket连接至少需要一对套接字,其中一个运行于客户端,另一个运行于服务器端。如图: 
这里写图片描述

伪例:A应用作为客户端部署在A_IP机器上,端口号为A_PORT,B应用作为服务端部署在B_IP台机器上,端口号为B_PORT,A应用向B应用发送请求

A应用客户端伪代码:

//1、创建客户端Socket,指定目标服务器端地址和端口Socket socket =new Socket(B_IP,B_PORT);//2、获取输出流,用于向服务器端发送字节流信息OutputStream os = socket.getOutputStream();//字节输出流//3、获取输入流,用于读取服务器端的响应信息InputStream is = socket.getInputStream();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

B应用服务端伪代码:

//1、创建一个服务器端Socket,即ServerSocket,指定监听端口ServerSocket serverSocket =newServerSocket(B_PORT);//2、调用accept()方法开始监听,等待客户端的连接Socket socket = serverSocket.accept();//3、获取输入流,用于读取客户端信息InputStream is = socket.getInputStream();//4、获取输出流,用于响应客户端的请求OutputStream os = socket.getOutputStream();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

5、实现应用层HTTP协议的API

前面说到,应用层并非由计算机上运行的实际应用软件组成,而是由向应用程序提供访问网络资源的API组成,也就是说,这些组成的API完成HTTP协议的抽象,实现HTTP协议。 
在java中Socket对象实现了TCP/IP协议,那么实现HTTP协议的API是什么呢?

java中负责实现企业级应用开发的是j2ee规范,j2ee规范始于Servlet接口,B/S架构的应用基于Internet编程,由Servlet抽象实现类HttpServlet实现,也就是说,HttpServlet是HTTP协议处理类的抽象类。

HttpServlet中的doGet(HttpServletRequest req, HttpServletResponse resp)doPost(HttpServletRequest req, HttpServletResponse resp)负责处理http的GET和POST请求,HttpServletRequest和HttpServletResponse用于封装http请求信息(请求报文头、请求报文体)和http响应信息(响应报文头、响应报文体)。

上面第4点,Socket通信是以字节的形式通过输入输出流完成数据传输操作的,同时,HTTP协议是基于TCP/IP协议的。那么http请求和响应也一定是以字节的形式通过输入输出流完成数据传输操作的。

//负责接收请求流数据ServletInputStream sis = request.getInputStream();
  • 1
  • 2
  • 1
  • 2
//负责发送响应流数据,比如write方法向输出流中写入返回页面的内容ServletOutputStream sos = response.getOutputStream();
  • 1
  • 2
  • 1
  • 2

6、后续知识拓展方向

通过前面的5点内容,从网络协议模型细化到HTTP协议与TCP/IP协议的概念和关系,从底层协议实现Socket到上层协议实现HttpServlet,强势将底层协议、上层API实现、j2ee规范贯穿起来,这样再理解B/S架构企业应用就透彻的多了。

但这对一个企业应用开发人员来说,刚刚是个开始,接下来还有很多的路要走:Servlet执行原理与生命周期详解、Servlet容器tomcat源码解析与性能优化,再到底层NIO非阻塞式Socket编程与netty框架使用等等,这是一个持久的知其然并且知其所以然的过程,慢慢来,总会有卓效。

原创粉丝点击