Java 基础之网络编程(一)
前言
文本已收录至我的 GitHub 仓库,欢迎 Star:https://github.com/bin392328206/six-finger
种一棵树最好的时间是十年前,其次是现在
絮叨
昨天把 IO 流讲完了,可能大家不会怎么喜欢看,因为说,这么简单的东西,谁不会呢?哈哈 博主确实不会,也是说不会,只能说要用的时候得百度,但是我想着自己过一遍,所以复习一下吧,万丈高楼平地起吧,慢慢来吧。今天讲的也是一个个最基础的概念吧,也没怎么深入,后面如果有需要在深入吧,毕竟计算机网络是一门大学问。
概述
计算机网络是通过传输介质、通信设施和网络通信协议,把分散在不同地点的计算机设备互连起来的,实现资源共享和数据传输的系统。网络编程就是编写程序使互联网的两个(或多个)设备(如计算机)之间进行数据传输。Java 语言对网络编程提供了良好的支持。通过其提供的接口我们可以很方便地进行网络编程。
从其中我们可以提取到以下内容:
计算机网络的作用:资源共享和信息传递。
计算机网络的组成:
计算机硬件:计算机(大中小型服务器,台式机、笔记本等)、外部设备(路由器、交换机等)、通信线路(双绞线、光纤等)。
计算机软件:网络操作系统(Windows 2000 Server/Advance Server、Unix、Linux 等)、网络管理软件(WorkWin、SugarNMS 等)、网络通信协议(如 TCP/IP 协议栈等)。
计算机网络的多台计算机是具有独立功能的,而不是脱离网络就无法存在的。
OSI 参考模型
通过计算机网络可以实现不同计算机之间的连接与通信,但是计算机网络中实现通信必须有一些约定即通信协议,对速率、传输代码、代码结构、传输控制步骤、出错控制等制定标准。就像两个人想要顺利沟通就必须使用同一种语言一样,如果一个人只懂英语而另外一个人只懂中文,这样就会造成没有共同语言而无法沟通。
国际标准化组织(ISO,即 International Organization for Standardization)定义了网络通信协议的基本框架,被称为 OSI(Open System Interconnect,即开放系统互联)模型。要制定通讯规则,内容会很多,比如要考虑 A 电脑如何找到 B 电脑,A 电脑在发送信息给 B 电脑时是否需要 B 电脑进行反馈,A 电脑传送给 B 电脑的数据格式又是怎样的?内容太多太杂,所以 OSI 模型将这些通讯标准进行层次划分,每一层次解决一个类别的问题,这样就使得标准的制定没那么复杂。OSI 模型制定的七层标准模型,分别是:应用层,表示层,会话层,传输层,网络层,数据链路层,物理层。
OSI 七层协议模型如图所示:
物理层
物理层处于 OSI 的最底层,是整个开放系统的基础。物理层涉及通信信道上传输的原始比特流(bits),它的功能主要是为数据端设备提供传送数据的通路以及传输数据。
数据链路层
数据链路层的主要任务是实现计算机网络中相邻节点之间的可靠传输,把原始的、有差错的物理传输线加上数据链路协议以后,构成逻辑上可靠的数据链路。需要完成的功能有链路管理、成帧、差错控制以及流量控制等。其中成帧是对物理层的原始比特流进行界定,数据链路层也能够对帧的丢失进行处理。
网络层
网络层涉及源主机节点到目的主机节点之间可靠的网络传输,它需要完成的功能主要包括路由选择、网络寻址、流量控制、拥塞控制、网络互连等。
传输层
传输层起着承上启下的作用,涉及源端节点到目的端节点之间可靠的信息传输。传输层需要解决跨越网络连接的建立和释放,对底层不可靠的网络,建立连接时需要三次握手,释放连接时需要四次挥手。
会话层和表示层
会话层的主要功能是负责应用程序之间建立、维持和中断会话,同时也提供对设备和结点之间的会话控制,协调系统和服务之间的交流,并通过提供单工、半双工和全双工 3 种不同的通信方式,使系统和服务之间有序地进行通信。
表示层关心所传输数据信息的格式定义,其主要功能是把应用层提供的信息变换为能够共同理解的形式,提供字符代码、数据格式、控制信息格式、加密等的统一表示。
应用层
应用层为 OSI 的最高层,是直接为应用进程提供服务的。其作用是在实现多个系统应用进程相互通信的同时,完成一系列业务处理所需的服务。
TCP/IP 参考模型
TCP/IP,即 Transmission Control Protocol/Internet Protocol 的简写,中译名为传输控制协议/因特网互联协议,是 Internet 最基本的协议,Internet 国际互联网络的基础。
TCP/IP 协议是一个开放的网络协议簇,它的名字主要取自最重要的网络层 IP 协议和传输层 TCP 协议。TCP/IP 协议定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。TCP/IP 参考模型采用 4 层的层级结构,每一层都呼叫它的下一层所提供的协议来完成自己的需求,这 4 个层次分别是:网络接口层、网络层(IP 层)、传输层(TCP 层)、应用层。
网络接口层
TCP/IP 协议对网络接口层没有给出具体的描述,网络接口层对应着 OSI 参考模型的物理层和数据链路层
网络层(IP 层)
网络层是整个 TCP/IP 协议栈的核心。它的功能是把分组发往目标网络或主机。同时,为了尽快地发送分组,可能需要沿不同的路径同时进行分组传递。因此,分组到达的顺序和发送的顺序可能不同,这就需要上层必须对分组进行排序。网络层除了需要完成路由的功能外,也可以完成将不同类型的网络(异构网)互连的任务。除此之外,互联网层还需要完成拥塞控制的功能。
传输层(TCP 层)
TCP 层负责在应用进程之间建立端到端的连接和可靠通信,它只存在与端节点中。TCP 层涉及两个协议,TCP 和 UDP。其中,TCP 协议提供面向连接的服务,提供按字节流的有序、可靠传输,可以实现连接管理、差错控制、流量控制、拥塞控制等。UDP 协议提供无连接的服务,用于不需要或无法实现面向连接的网络应用中。
应用层
应用层为 Internet 中的各种网络应用提供服务。
网络协议
如同人与人之间相互交流是需要遵循一定的规则(如语言)一样,计算机之间能够进行相互通信是因为它们都共同遵守一定的规则,即网络协议。
OSI 参考模型和 TCP/IP 模型在不同的层次中有许多不同的网络协议,如图所示:
网络协议之间的关系图如下:
IP 协议(属于网络层)
IP 协议的作用在于把各种数据包准备无误的传递给对方,其中两个重要的条件是 IP 地址和 MAC 地址。由于 IP 地址是稀有资源,不可能每个人都拥有一个 IP 地址,所以我们通常的 IP 地址是路由器给我们生成的 IP 地址,路由器里面会记录我们的 MAC 地址。而 MAC 地址是全球唯一的。举例,IP 地址就如同是我们居住小区的地址,而 MAC 地址就是我们住的那栋楼那个房间那个人。IP 地址采用的 IPv4 格式,目前正在向 IPv6 过渡
iP 协议 负责把一段数据包 从一个网段转发到另外一个网段 也就是 不同路由之间转换
TCP 协议(属于传输层)
TCP(传输控制协议)是面向连接的传输层协议。TCP 层是位于 IP 层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是 IP 层不提供这样的流机制,而是提供不可靠的包交换。TCP 协议采用字节流传输数据。
TCP 的报文格式
TCP 报文段包括协议首部和数据两部分,协议首部的固定部分是 20 个字节,首部的固定部分后面是选项部分。
下面是报文段首部各个字段的含义:
源端口号以及目的端口号:各占 2 个字节,端口是传输层和应用层的服务接口,用于寻找发送端和接收端的进程,一般来讲,通过- - 端口号和 IP 地址,可以唯一确定一个 TCP 连接,在网络编程中,通常被称为一个 socket 接口。
序号:Seq 序号,占 4 个字节、32 位。用来标识从 TCP 发送端向 TCP 接收端发送的数据字节流。发起方发送数据时对此进行标记。
确认序号:Ack 序号,占 4 个字节、32 位。包含发送确认的一端所期望收到的下一个序号。只有 ACK 标记位为 1 时,确认序号字段才有效,因此,确认序号应该是上次已经成功收到数据字节序号加 1,即 Ack=Seq + 1。
数据偏移:占 4 个字节,用于指出 TCP 首部长度,若不存在选项,则这个值为 20 字节,数据偏移的最大值为 60 字节。保留字段占 6 位,暂时可忽略,值全为 0。
标志位,6 个
URG(紧急):为 1 时表明紧急指针字段有效
ACK(确认):为 1 时表明确认号字段有效
PSH(推送):为 1 时接收方应尽快将这个报文段交给应用层
RST(复位):为 1 时表明 TCP 连接出现故障必须重建连接
SYN(同步):在连接建立时用来同步序号
FIN(终止):为 1 时表明发送端数据发送完毕要求释放连接
接收窗口:占 2 个字节,用于流量控制和拥塞控制,表示当前接收缓冲区的大小。在计算机网络中,通常是用接收方的接收能力的大小来控制发送方的数据发送量。TCP 连接的一端根据缓冲区大小确定自己的接收窗口值,告诉对方,使对方可以确定发送数据的字节数。
校验和:占 2 个字节,范围包括首部和数据两部分。
选项是可选的,默认情况是不选。
TCP 三次握手与四次挥手
TCP 是面向连接的协议,因此每个 TCP 连接都有 3 个阶段:连接建立、数据传送和连接释放。连接建立经历三个步骤,通常称为“三次握手”。
TCP 三次握手过程如下:
第一次握手(客户端发送请求)
客户机发送连接请求报文段到服务器,并进入 SYN_SENT 状态,等待服务器确认。发送连接请求报文段内容:SYN=1,seq=x;SYN=1 意思是一个 TCP 的 SYN 标志位置为 1 的包,指明客户端打算连接的服务器的端口;seq=x 表示客户端初始序号 x,保存在包头的序列号(Sequence Number)字段里。
第二次握手(服务端回传确认)
服务器收到客户端连接请求报文,如果同意建立连接,向客户机发回确认报文段(ACK)应答,并为该 TCP 连接分配 TCP 缓存和变量。服务器发回确认报文段内容:SYN=1,ACK=1,seq=y,ack=x+1;SYN 标志位和 ACK 标志位均为 1,同时将确认序号(Acknowledgement Number)设置为客户的 ISN 加 1,即 x+1;seq=y 为服务端初始序号 y。
第三次握手(客户端回传确认)
客户机收到服务器的确认报文段后,向服务器给出确认报文段(ACK),并且也要给该连接分配缓存和变量。此包发送完毕,客户端和服务器进入 ESTABLISHED(TCP 连接成功)状态,完成三次握手。客户端发回确认报文段内容:ACK=1,seq=x+1,ack=y+1;ACK=1 为确认报文段;seq=x+1 为客户端序号加 1;ack=y+1,为服务器发来的 ACK 的初始序号字段+1。
注意:握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。用白话来说就是客户端给服务端发消息说我要和你建立连接了,服务端收到消息说。我同意你建立连接,返回报文给客服端,然后客户端再发送一条消息给服务端说我 知道你的返回了,然后就可以发数据了。
思考一个问题,为啥要三次,看上去两次握手也可以了
如果只有两次握手,那么到这里,连接就建立了,但是此时客户端并没有任何数据要发送,而服务端还在傻傻的等候佳音,造成很大的资源浪费。所以需要第三次握手,只有客户端再次回应一下,就可以避免这种情况。
TCP 四次挥手过程如下:
由于 TCP 连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个 FIN 来终止这个方向的连接。收到一个 FIN 只意味着这一方向上没有数据流动,一个 TCP 连接在收到一个 FIN 后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
1. TCP 客户端发送一个 FIN,用来关闭客户端到服务端的数据传送,客户端进入 FIN_WAIT_1 状态。发送报文段内容:FIN=1,seq=u;FIN=1 表示请求切断连接;seq=u 为客户端请求初始序号。
2. 服务端收到这个 FIN,它发回一个 ACK 给客户端,确认序号为收到的序号加 1。和 SYN 一样,一个 FIN 将占用一个序号;服务端进入 CLOSE_WAIT 状态。发送报文段内容:ACK=1,seq=v,ack=u+1;ACK=1 为确认报文;seq=v 为服务器确认初始序号;ack=u+1 为客户端初始序号加 1。
3. 服务器关闭客户端的连接后,发送一个 FIN 给客户端,服务端进入 LAST_ACK 状态。发送报文段内容:FIN=1,ACK=1,seq=w,ack=u+1;FIN=1 为请求切断连接,ACK=1 为确认报文,seq=w 为服务端请求切断初始序号。
4. 客户端收到 FIN 后,客户端进入 TIME_WAIT 状态,接着发回一个 ACK 报文给服务端确认,并将确认序号设置为收到序号加 1,服务端进入 CLOSED 状态,完成四次挥手。发送报文内容:ACK=1,seq=u+1,ack=w+1;ACK=1 为确认报文,seq=u+1 为客户端初始序号加 1,ack=w+1 为服务器初始序号加 1。
注意:为什么连接的时候是三次握手,关闭的时候却是四次挥手?
因为当服务端收到客户端的 SYN 连接请求报文后,可以直接发送 SYN+ACK 报文。其中 ACK 报文是用来应答的,SYN 报文是用来同步的。但是关闭连接时,当服务端收到 FIN 报文时,很可能并不会立即关闭 socket,所以只能先回复一个 ACK 报文,告诉客户端,“你发的 FIN 报文,我收到了”。只有等到服务端所有的报文都发送完了,我才能发送 FIN 报文,因此不能一起发送,故需要四步挥手。
UDP 协议(传输层)
UDP,用户数据报协议,它是 TCP/IP 协议簇中无连接的运输层协议。
UDP 是一个非连接的协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP 传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP 把每个消息段放在队列中,应用程序每次从队列中读一个消息段。
由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务器可同时向多个客户端传输相同的消息。
UDP 信息包的标题很短,只有 8 个字节,相对于 TCP 的 20 个字节信息包的额外开销很小。
吞吐量不受拥挤控制算法的调节,只受应用软件生成数据的速率、传输带宽、源端和终端主机性能的限制。
UDP 使用尽量最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态表。
UDP 是面向报文的。发送方的 UDP 对应用程序交下来的报文,在添加首部受就向下交付给 IP 层。既不拆分,也不合并,而是保留这些 报文的边界,因此,应用程序需要选择合适的报文大小。
UDP 协议格式
UDP 协议由两部分组成:首部和数据。其中,首部仅有 8 个字节,包括源端口和目的端口、长度(UDP 用于数据报的长度)、校验和。
TCP 与 UDP 的区别
TCP 基于连接,UDP 是无连接的;
对系统资源的要求,TCP 较多,UDP 较少;
UDP 程序结构较简单;
TCP 是流模式,而 UDP 是数据报模式;
TCP 保证数据正确性,而 UDP 可能丢包;TCP 保证数据顺序,而 UDP 不保证;
HTTP 协议(应用层)
HTTP,超文本传输协议,它是互联网上应用最为广泛的一种网络协议。HTTP 是一种应用层协议,它是基于 TCP 协议之上的请求/响应式的协议。HTTP 协议是 Web 浏览器和 Web 服务器之间通信的标准协议。HTTP 指定客户端与服务器如何建立连接、客户端如何从服务器请求数据,服务器如何响应请求,以及最后如何关闭连接。HTTP 连接使用 TCP/IP 来传输数据。
对于从客户端到服务器的每一个请求,都有 4 个步骤:
默认情况下,客户端在端口 80 打开与服务器的一个 TCP 连接,URL 中还可以指定其他端口。
客户端向服务器发送消息,请求指定路径上的资源。这个资源包括一个首部,可选地(取决于请求的性质)还可以有一个空行,后面是这个请求的数据。
服务器向客户端发送响应。响应以响应码开头,后面是包含数据的首部、一个空行以及所请求的文档或错误消息。
服务器关闭连接。
HTTP 报文
HTTP 协议是基于 TCP 协议之上的请求/响应式协议,下面主要介绍 HTTP 报文的格式,HTTP 报文主要有请求报文和响应报文两种。
首先看 HTTP 请求报文的格式:
HTTP 请求报文由请求行、首部行和实体主体组成,由浏览器发送给服务器。上面这张图中 SP 表示空格,cr lf 表示回车和换行。下图是谷歌浏览器内访问服务器查看的 HTTP 请求例子:
HTTP 响应报文格式:
上面这张图是 HTTP 响应报文,它由状态行、首部行和实体主体组成。下图为 HTTP 响应报文例子:
HTTP 和 HTTPS 的区别
HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的 HTTP 通道,简单来说就是 HTTP 的安全版。即 HTTP 下加入 SSL 层,HTTPS 的安全基础是 SSL,因此加密的详细内容就需要 SSL。它是一个 URL scheme(抽象标识符体系),句法类同 http:体系,用于安全的 HTTP 数据传输。https:URL 表明它使用了 HTTP,但 HTTPS 存在不同于 HTTP 的默认端口及一个加密/身份验证层(在 HTTP 与 TCP 之间)。
超文本传输协议 HTTP 协议被用于在 Web 浏览器和网站服务器之间传递信息。HTTP 协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了 Web 浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此 HTTP 协议不适合传输一些敏感信息,比如信用开号、密码等。
为了解决 HTTP 协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议 HTTPS。为了数据传输的安全,HTTPS 在 HTTP 的基础上加入了 SSL 协议,SSL 依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。
HTTPS 和 HTTP 的区别主要为以下四点:
https 协议需要到 ca 申请证书,一般免费证书很少,需要缴费。
http 是超文本传输协议,信息是明文传输,https 则是具有安全性的 ssl 加密传输协议。
http 和 https 使用的是完全不同的连接方式,用的端口也不一样,前者是 80,后者是 443。
http 的连接很简单,是无状态的;https 协议是有 ssl+http 协议构建的可进行加密传输、身份认证的网络协议,比 http 协议安全。
结尾
今天讲的只是一些基本概念,大家先把基本概念搞清楚,明天我们从代码层面来理解一下这些东西
版权声明: 本文为 InfoQ 作者【自然】的原创文章。
原文链接:【http://xie.infoq.cn/article/1820fc86057ed2c1971947903】。文章转载请联系作者。
评论