Java网络编程一

1、网络协议

计算机网络是什么?

        随着计算机技术发展,计算机的体积和价格都在下降,之前计算机多用于研究机构,现价段逐步进入一般的公司用于办公。原来计算机回见传输数据需要通过软盘等第三方存储介质进行转存人们需要将数据直接通通过通信线路传输,来缩短传输时间,于是计算机网络开始诞生,并逐渐发展为现在巨大的Internet。

定义和分类:

计算机网络的标准定义是:利用通信线路将地理上分散的、具有独立功能的计算机想 捅和通信设备按不停的形式连接起来,以功能完善的网络软件及协议实现资源共享和信息传递的系统。

计算机网络从覆盖范围上花费为三类:局域网、城域网、广域网。局域网LAN(作用范围一般为几十米到几公里)、城域网(介于LAN、WAN之间)、广域网(作用一般为几十到几千公里)。当然计算进网络划分还可以照信息的交换方式(电路交换、保温减缓、报文分组交换)来分等等方式。

计算机网络发展简史:

1、诞生阶段,20世纪60年代中期之前的第一代计算机网络是以单个计算机为中心的远程连接系统。端是一天计算机的外部设备包括显示器和键盘,无CPU和内存。随着远程中断的增多,在主机前增加了前端机。当时,人们把计算机网络定义为“以传输信息为目的而连接起来,实现远程信息处理或进一步到达资源共享的系统”,但这样的通信系统已具备了网络的雏形。

        2、ARPANET,多个主机通过通信线路互联起来。60年代初,当时美国国防部为了保证美国本土防御力量和海外防御无阻黄在受到前苏联第一次和打击以后让然具有一定的生存和反击能力,认为有必要设计出一种分散的只会系统:它由一个个分担的只会点组成,当部分只会点被摧毁后,其他点让能正常工作,并且在这些点之间能够染过那些已被摧毁的只会点儿继续保持联系。为了对这一构思进行验证,10969年,美国国防部高级研究计划署(DOD/DARPA)自助建立了一个名为ARPANET(即“阿帕网”)的网络,将多个大学的计算机主机连接起来,位于各个节点的大型计算机采用分组交换技术,通过专门的通信交换机和专门的通信线路此昂胡连接。E-mail、FTP和Inlnet在ARPANET上已经诞生

        3、开放性的标准化体系结构,OSI诞生。ARPANET星期后,计算机网络发展迅猛,各计算机公司相继推出自己的网络体系结构及实现这些结构的软硬件产品。由于没有同一的标准,不同厂商的产品之间互联很困难,人们迫切需要一种开放性的标准化实用网络环境,这样应运而生了两者国际通用的最重要的体系结构,为了实现网络设备的相互通信,ISO和IEEE(电气和电子工程师写回,是世界上最大的非盈利专业技术协会,其会员人数超过40万,遍布160 多个国际。IEEE致力于电气、电子、计算机工程和与科学有关的领域的开发和研究)相继提出了OSI参考模型以及TCP/IP模型。有TCP/IP今早地指定了可行性较强的协议,提出了应对技术快速革新协议,并即使进行后期改良的方案,因此打败了OSI模型,称为事实上的标准。

        4、Internet互联网

        20世纪90年代至今的第四代计算机网络,1993年是因特网发展过程中非常重要的一年,早这一年中因特网完成了目前位置所有技术的创新,www(万维网)和浏览器的应用使因特网上有了一个令人耳目一新的平台:人们在因特网上所看到的的内容不仅仅只是文字、图像、声音、动画,甚至还有了电影。计算机网络的普及与应用正向全人类展开其新的一页,也诞生了很多巨大的互联网公司。

计算机网络体系结构:

TCP/IP协议族 :

        我们通常所说的TCP/IP协议并不只是TCP和IP协议,而是指TCP/IP协议族,如下:

TCP/IP网络传输中数据 :

        传输过程大致可以这样说,发送端每经过一层给数据加一个对应的首部包,接收端每经过一层解析解析对应的首部包,就是装包拆包过程。

TCP和UDP: 

        在上述表格中,网际协议IP是TCP/IP中非常重要的协议。负责对数据加上IP地址(有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址))和其他的数据以确定传输的目标。

        而TCP和UDP都是传输层的协议,传输层主要是为两台主机上的应用程序提供端到端的通信。

        但是TCP和UDP最大不同的地方是,TCP提供了可靠的数据传输服务,TCP是面向连接的,也就是说,利用TCP通信的两台主机首先要经历一个建立连接的过程,等到连接建立后才开始传输数据,而且传输过程中采用“带重传的肯定确认”技术实现传的可靠性。TCP还采用一种称为“滑动窗口”的方式进行流量控制,发送完成后还会关闭连接。所以TCP要比UDP可靠的多。

        UDP,是把数据直接发送出去,而不管对方是不是在接收,也不管对方是否能接收的了,也不需要接收确认,属于不可靠的传输,可能会出现丢包现象,实际应用中要求程序员编程验证。

        注意:我们一些常见的网络应用基本上都属于TCP和UDP的,这两个协议又会使用IP网络层协议。但是我们完全可以绕过传输层的TCP/UDP,直接使用IP,比如Linux中的LVS,甚至直接访问链路层,比如tcpdump程序就是直接和链路层进行通讯的。

地址和端口号:

        我们常说MAC地址和IP地址。

        MAC地址全程叫做媒体访问控制地址,也称为库欲望地址(LAN Address),MAC地址,以太网地址或者物理地址,由网络设备制造商生产时写在硬件内部。MAC地址与网络无关,也即无论将带有这个地址的硬件(如网卡、集线器、路由器等)接入到网络的何处,都有相同的MAC地址,它由厂商写在网卡的BIOS里,从理论上讲,除非盗来硬件(网卡),否则是没有办法冒名顶替的。

        MAC地址共48位(6个字节)。前24位由IEEE决定如何分配,后24位由实际生成该网络设备的厂商自行指定。例如:FF:FF:FF:FF:FF:FF。

IP地址:

        IP地址(Internet Protocol Address)是全称叫做互联网协议地址,它的本义是为互联网的每一个网络和每一台主机设备配置一个唯一的累计地址,用来与物理地址作区分。

IP地址与MAC地址的区别

        1、IP地址是可用更改的,MAC地址是固定的

        2、两者长度不一样,MAC48位,IP地址是32位

        3、它们的寻址协议层不同,IP是在网络层,MAC是在链路层

        4、分配依据不同,IP地址的分配是基于我们自身定义的网络拓扑,MAC地址的分配是基于                                                            制造商。

端口号:

        在传输层也有类似于地址的概念,那就是端口号。端口号用来识别同一台计算机中进行通信的应用程序。因此,它也被称为程序地址。

        一台计算机上可以同时运行多个程序。传输层协议正是利用这些端口号识别本机中正在进行通信的应用程序,并准确的将数据传输。

        端口号的确定:

        1)标准既定的端口号:这种方法也叫静态方法。它是每个应用程序都有其指定的端口号。并不是说可以随意使用任何一个端口号。例如:HTTP、FTP、TELNET等广为使用的应用协议中所使用的端口号就是固定的。这些端口号被称为知名端口号,分布在0~1023之间;除了知名端口号之外,还有一些端口号被正式注册,它们分布在1024~29151之间,不过这些端口号可用于任何通信用途

        2)时序分配法:服务器有必要确定监听端口号,以让客户端程序访问服务器上的服务。但是使用服务的客户端没必要确定端口号。在这种方法下,动态分配的端口号范围在49151~65535之间。

         我们可以通过源IP地址、目标IP地址、协议号、目标端口号、源端口号这个五个元素识别一个通信。

 TCP概述

        TCP(Transmission Control Protacol)是面向连接的通信协议,通过三次握手建立连接,然后才能开始数据的读写,通讯完成时要拆除连接,由于TCP是面向连接的所以只能用于端到端的通讯。

        TCP提供的是一种可靠的数据流服务,数据有可能被拆分后发送,那么采用超时重传机制是和应答确认机制是组成TCP可靠传输的关键设计。

TCP的基本特性:

        1)面向连接

                TCP是只有两端建立了连接才能通信

        2)可靠性

                可靠性是因为有超时重传和应答确认机制,超时重传中的超时并不是确定的,操作系统会根据上一次数据的传输所花的时间设置下一次的超时时间;应答确认是双方都确认了收到了消息的机制,这样就保证了可靠性

        3)超时重传

                比如网络有延迟,有些数据包没有准时传送完成,就会超时重传

        4)数据排序

                在数据传输的过程了A端的数据(1 2 3 4 5)传到B端之后可能是(1 5 3 2 4)的顺序,B端着这种情况下会进行数据排序成(1 2 3 4 5)

        5)流量控制

                比如在网络不稳定的时候(1M/S->200k/S),这时在数据传输的时候,会进行流量控制。传输的数据最大带宽就是200K/S

        6)全双工

                全双工是指,客户端和服务端在建立连接之后都可以同时进行通信

TCP三次握手:

TCP为什么需要三次握手?

        根据上面的图已经很不难看出了,因为TCP是面向连接的,并且是可靠的 ,只有双方确认应答之后才能保证双方真正的建立了连接。

TCP的3次握手的漏洞-SYN洪泛攻击:

        定义:通过网络服务所在的端口发送大量伪造源地址的攻击报文,发送到服务端,造成服务端上的半开连接队列被占满,服务器一直在处理三次握手的第二次握手,从而阻止其他用户进行访问。

        解决方案:

        1)无效连接监控,这种方法不停监视所有的连接,包括三次握手,反正是所有的连接,当达到一定阈值时拆除这些连接,从而释放系统资源。这种方法对于所有的连接一视同仁,不管正常的还是攻击的,所以不推荐这种方式

        2)延迟TCB分配方法,一般的做完第一次握手之后,服务器就需要为该请求分配一个TCB(连接控制资源),通常这个资源需要200多个字节。延迟TCB的分配,当正常连接建立起来之后再分配TCB则可以有效地减轻服务器资源的消耗

        3)使用防火墙,防火墙在确认了连接的有效性后,才向内部的服务器(Listener)发起SYN请求

TCP四次挥手(分手)

        四次挥手即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发。

        由于TCP是全双工的,因此每个方向都必须要单独进行关闭,这一原则是当甲方完成数据发送任务后,发送一个FIN标志位给乙方来终止这一方向的连接,乙方收到一个FIN只是以为这不会再收到甲方数据,但是乙方依然可以给甲方发送数据,直到乙方也放松了FIN给甲方。首先进行关闭的乙方将执行主动关闭,而另一方则执行被动关闭

为什么TCP的挥手是四次?

         TCP是全双工模式,这意味着,主机1和主机2双方之间都可以发送数据,当主机1发出报文FIN时,只是表示主机1没有数据发送了要关闭,主机2发送一个ACK报文应答给主机1,但是这时候主机1还是可以收到主机2发送的数据;真正要主机2也关闭,需要主机2 没有数据发送了,主机2发送一个FIN报文给主机1,主机1返回ACK应答给主机2,这才算是双方都关闭了

        所以对于全双工模式来说,为了彻底关闭,通常就需要通信两端的4次交互。之所以说通常,是因为步骤1 的FIN可能随数据一起发送了或者被关闭的一端没有数据发送时步骤2和步骤3合并成一步了。

为什么需要TIME_WAIT状态?

        TIME_WAIT状态存在的原因有两点:

        1)可靠的终止TCP连接

        根据前面四次挥手的描述可知,在第三步之后,甲方需要给乙方确认应答,如果这个ACK确认报文丢失了,那么乙方会重发一个FIN报文,如果这时候没有TIME_WAIT状态,那么乙方就关闭连接失败

        2)保证让迟来的TCP报文有足够的时间被识别并丢弃

        在Linux系统上,一个端口不能同时被打开多次,当一个TCP连接处于TIME_WAIT状态时,我们无法使用该连接的端口建立新的连接。反过来思考,假如没有这个TIME_WAIT状态,则应用程序新建的一个连接的端口号和之前的一个连接的端口号一样,这时候新建的连接可能会受到之前一个连接的服务端发过来的消息,这显然不该发生的,这是TIME_WAIT存在的第二个原因。

常用的网络抓包工具:Wireshark和tcpdump

HTTP

        我们使用http来访问Web上的某个资源,比如html/文本、Word、AVI电影、其他资源。官方协议网站:https://tools.ietf.org/html/rfc2608.

        http使用同一资源定位符URI来传输数据和建立连接。URL是一种特殊型的URI,包含了用于查找某个资源的足够信息。

        URL,全程是UniformResourceLocator,中文叫同一组员定位符,是互联网上用来标志某一处资源的地址。

URI和URL的区别:

        URI是个纯粹的句法结构,用于标识Web资源的字符串的各个不同部分。URL是URI一个特例,它包含了未定Web资源的足够信息。其他URI,比如:mailto:cay@horstman.com则不属于定位符,因为根据该标识符无法定位任何资源。

        URI是同一资源标识符,而URL是同一资源定位符。因为笼统地说,每一个URL都是URI,但不一定每个URI都是URL。这是因为URI还包含一个子类,即同一资源名称(URN),它命名资源但不指定如何定位资源,上面的mainlto就是一个URN的示例。

        URL是uniform resource locator,统一资源定位器,它是一种具体的URI,即RL可以用来标识一个资源,而还指明了如何locate这个资源。

一个完整的URL:

        包括一下几个部分:

       https://www.bilibili.coms:8080/v/kichiku?spm_id_from=333.1007.0.0#name

        1、协议部分,https

        2、域名部分,www.bilibili.com

        3、端口号 ,8080

        4、虚拟目录部分,从域名第一个“/”开始到最后一个“/”为止,本示例中的V就是

        5、文件名部分,从域名最后一个“/”开始到“?”为止,本示例中kichiku就是

        6、参数部分,从“?”开始一些“=”的部分就是,本示例spm_id_from=333.1007.0.0

        7、锚部分,从“#”开始到最后都是锚部分

一次完整的http请求

        

DNS劫持和HTTP劫持 

        DNS是Domain Name System的简写,即域名系统,它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网。

        DNS劫持就是通过劫持了DNS服务器,通过某些手段取得域名的解析激励控制权,进而修改此域名的解析结果。DNS劫持通过篡改DNS服务器上的数据返回给用户一个错误的查询结果来实现的。

        一般来说DNS劫持有着三种情况:

        1、错误域名解析到纠错导航页面,导航页面存在广告。判断方法:访问的域名是错误的,而跳转的导航页面也是官方的,如电信的114

        2、错误域名解析到非正常页面,对错误的域名解析到导航页的基础上,有一定几率解析到一些恶意站点,这些恶意站点通过判断你访问的目标HOST、URI、referrer等来确定是否跳转广告页面,这种情况有可能跳转广告页面(域名输错)或者访问页面被加载广告(页面加载时有些元素的域名错误而触发)这种劫持会对用户访问的目标HOST、URI、referrer等会进行判断来确定是否解析恶意站点地址,不易被发现

        3、直接将特点站点解析到恶意或者广告页面,比如我输入百度,给我跳转拿到小黄页面,这种可能是家里的路由被黑,或者系统被入侵了

        DNS劫持常见于使用自动的DNS地址,所以不管有没有被劫持,尽量不要使用运营商默认是DNS。

        HTTP劫持:

        在运营商是路由器节点上,设置协议检测,一旦发现是http请求,而且是HTML类型请求,则拦截。后续做法往往分为两种,1种是类似DNS劫持返回302让用户浏览器跳转到另外是地址,还有1种是在服务器返回HTML数据中插入js或dom节点(广告)。

        有两种http劫持防劫持思路:

        1、使用HTTPS协议加密请求

        2、隐藏http请求的特征,例如使用对称加密算法对整个URL加密。

        

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java网络编程是指使用Java语言进行网络通信和连接的技术。它可以实现网络服务器和客户端之间的数据传输和交互。 Java网络编程的基本原理是通过Java提供的网络编程API来创建网络应用程序。其中,常用的API有Socket、ServerSocket、URLConnection和URL等类。 Java网络编程的优点包括跨平台性强、能够处理多个连接、数据传输可靠性高以及支持各种网络协议等。通过Java网络编程技术,开发人员可以轻松地实现各种网络应用,如多人在线游戏、聊天程序、文件传输等。 当我们需要使用Java网络编程时,需要了解网络编程的基本知识和概念,如IP地址、端口号、TCP/IP协议等。在使用Java网络编程时,通常需要创建一个服务器端和一个客户端。服务器端通过ServerSocket类监听指定的端口,客户端通过Socket类与服务器端进行连接。一旦连接建立,就可以通过输入输出流进行数据的传输和交互。 对于Java网络编程的学习和应用,我们可以参考各种网络编程相关的书籍和教程,其中包括了《Java网络编程指南》、《深入理解Java网络编程》等。此外,也可以参考官方文档和在线资源,如Oracle官方网站等。 总之,Java网络编程是一项重要的技术,它允许我们创建强大的网络应用程序。通过学习和应用Java网络编程技术,我们能够更好地理解和应对网络通信和连接的需求,并且能够实现各种功能丰富的网络应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值