老生常谈…对于大佬们根本都不用看的博客!
对于像我这种菜鸡还是得一步一步的来!如果有错误请大佬们指点指点!
网络编程
介绍
网络编程 ,就是通过某种通信协议,实现两台计算机的通信的程序。接下来让我带你了解网络编程吧!
网络的通信协议
介绍
计算机网络可以让多台计算机进行连接,在同一个网络下的计算机进行连接和通信都要遵守规则,我们称之为网络通信协议,它对数据的传输格式、传输速率、传输步骤等做了统一的规范,双方必须达成一致遵守规范才能完成数据的交换。 接下来就是介绍最熟悉的TCP/IP协议了!不懂?出门百度!
通信协议模型
废话不多说直接上图:
图上共两种协议模型,其中OSI的模型过于理想,没有进行大范围的推广;TCP/IP协议就是现在的国际标准。 TCP/IP协议又称传输控制/因特网互联协议,它定义了计算机如何连入因特网以及数据传输的标准。它采用了4层的分层模型。由上到下咱们简单介绍一下,其他详解随便搜搜都有,太多了其实我也看不下去。
- 应用层:主要负责应用程序的协议;
- 传输层:主要负责网络程序的通信;
- 网络层:主要就是将传输的数据进行分组打包,送到目标计算机或网络;
- 网络访问层:主要就是定义物理传输的通道,大概意思就是网络驱动呗; 根据自己的理解写的,不喜勿喷!详情请出门百度!
传输层有两个重要的TCP 和 UDP 协议,拿出来简单说一说,有很多优秀的文章,可以自行搜索一下。
TCP 和 UDP 协议
UDP的简介
- 统称用户数据报协议
- 非面向连接,不可靠:只管发送,不管数据到不到达,这不是纯纯的看运气?
- 数据大小被限制在64kb以内,超出这个范围的就不发送了
- 数据报是它的基本单位
- 应用场景:视频,音频这些场景。因为丢帧什么的影响不大,如果网络差可苦了曾经上网课的我了。
TCP的简介
- 统称传输控制协议
- 面向连接,可靠: 只要双方进行连接,才能进行发送。如果数据发送失败,他会进行重发,保证数据完整的发送到甲方(嘿嘿,懂得都懂)!
- 应用场景:下载文件、浏览网页等
其中三次握手和四次挥手是它的核心,也是面试的高频问题。我就不放图了,我看多了也吐。就两个角色,一个客户端,一个服务器。
还有一些标识,我介绍一下。
SYN(synchronous建立联机)
ACK(acknowledgement 确认)
seq(Sequence number顺序号码)
ack(Acknowledge number确认号码)
FIN(finish 结束)
三次握手
第一次:客户端携带着SYN和seq向服务器请求连接。
第二次:服务器会拿着SYN,ACK,seq,ack去找是哪个客户端发来的并告诉它可以进行连接。
第三次:客户端拿着SYN,seq,ack告诉服务器它也可以进行连接。
为什么是三次而不是两次呢? 就好比你想去搭讪美女,你不得上来说一句hello? 她回复你hello了,你才能进行下一步深入交流吧!
四次挥手
第一次:客户端拿着FIN,seq去告诉服务器它像断开
第二次:服务器拿着ACK,seq,ack。服务器收到客户端想要断开的想法,将最后的数据传给客户端,然后服务器不再接受任何数据
第三次:服务器发送完成数据后,会带着FIN,ACK,seq,ack去告诉客户端它可以进行断开了
第四次:客户端收到服务器可以断开连接的信息后,然后拿着ACK,seq,ack直接告诉服务器分手。然后服务器就会彻底的断开,客户端等待2MSL后没有接收到服务器的任何信息,就彻底断开
网络编程三要素
通信协议
计算机网络通信必须遵守的规则
IP地址
互联网协议地址(Internet Protocol Address),简称IP,就是服务器所在的位置。自己访问自己的地址就是127.0.0.1。
分类:
- IPv4 :是一个 32 位的二进制数,通常被分为 4 个字节,表示成 a.b.c.d 的形式,例如 192.168.65.100 。其中 a、b 、c 、d 都是 0 ~ 255 之间的十进制整数,那么最多可以表示 42 亿个。
- IPv6 :由于互联网的蓬勃发展,IP 地址的需求量愈来愈大,但是网络地址资源有限,使得IP的分配越发紧张。为了扩大地址空间,拟通过 IPv6 重新定义地址空间,采用 128 位地址长度,每 16 个字节一组,分成 8 组十六进制数,表示成 ABCD:EF01:2345:6789:ABCD:EF01:2345:6789 ,号称可以为全世界的每一粒沙子编上一个网址,这样就解决了网络地址资源数量不够的问题。
端口
通过IP知道了服务器的位置,但是服务器里有很多应用程序,所以出现了端口的概念。每个应用程序都有相应的端口。 端口号:用两个字节表示的整数,它的取值范围是 0~65535
- 公认端口:0 ~ 1023 。被预先定义的服务通信占用,如:HTTP(80),FTP(21),Telnet(23)
- 注册端口:1024 ~ 49151 。分配给用户进程或应用程序。如:Tomcat(8080),MySQL(3306),Oracle(1521)
- 动态/ 私有端口:49152 ~ 65535
在运行的端口号只能是唯一的,如果你再启动一个相同的端口号,你根本起不来!就跟蹲茅坑一样,有人在蹲着这个茅坑呢,你咋蹲?只能换个空的茅坑呗!通俗易懂,言简意赅
总结
利用 协议 + IP地址 + 端口号 的组合就能进行网络通信!
InetAddress 类
通过InetAddress类的方法,我们可以对IP进行获取和操作
//根据域名获取InetAddress对象
public static InetAddress getByName()
//获取本机的InetAddress对象
public static InetAddress getLocalHost()
//获取InetAddress对象的IP地址
public String getHostAddress()
//获取InetAddress对的主机名
public String getHostName()
Socket
网络通信其实就是Socket 间的通信,通信的两端都要有Socket。
分类
- 流套接字:使用 TCP 提供可以来的字节流服务。ServerSocket服务器套接字,Socket客户端套接字。
- 数据报套接字:使用 UDP 提供的数据报服务。DatagramSocket,UDP用来发送和接收的套接字。
这么一看UDP好简洁,不过即将迎来新时代可能将UDP推送到最高的位置!可以看其他牛人博主的文章了解即可!