Java网络编程-第一节3:网络编程必备网络知识3之IP地址端口号
Posted 快乐江湖
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java网络编程-第一节3:网络编程必备网络知识3之IP地址端口号相关的知识,希望对你有一定的参考价值。
文章目录
一:网络传输基本流程
(1)数据包
前文说过,发送“你好”这样的信息给另一台主机,发送时并不是简简单单就这样直接传递过去,而是会封装一些其他信息,最终在以太网电缆中传输。
每个分层中,都会对所发送的数据附加一个首部,在这个首部中包含了该层的必要信息。我们知道每一层都有相应的协议,所以为协议提供的信息是包的首部,所要发送的内容为数据。因此上图中,从下一层角度看,从上一层受到的包全部都认识是本层的数据
其中,包,帧,数据包,段,消息的区别如下
网络中传输的数据包由两部分组成:一部分是协议所要用到的首部,另一部分是上层传过来的数据。首部的结构由协议的具体规范定义。比如识别上一层协议的域应该从包的哪一位开始取多少比特位,以及如何计算校验和插入包的哪一位等等。所以相互通信的两端计算机如果在识别协议的序号以及校验的计算方法等上出现不一致,就无法完成通信。
(2)网络传输的基本流程
以发送“早上好”这样的信息为例,下图展示了大致的传输流程
可以看出最终在以太网电缆中传输的数据相较于原生数据是“庞大的”。
如下,包流动时从前往后依次附加以太网包首部,IP包首部,TCP包首部以及应用程序自己的包首部和数据,包的最后则追加了以太网包尾
每个包首部中至少会包含两个信息:一个是发送端和接收端的地址,一个是识别上一层协议类型
经过每个协议分层时,都必须有识别包发送端和接收端的信息:以太网会用MAC地址(MAC地址具有唯一性),IP则会用IP地址,TCP/IP则会用端口号等。
(3)具体处理过程
上面的流程图左半部分称之为封包,右半部分称之为解包。所对应的操作分贝就是发送和接受。封包时,上一层封好之后只需将数据传递给下一层(也就是调用某个接口)进行封包,但是解包时存在一些问题:比如下一层分离完自己的包首部后,如何确定自己的数据移交的对象等等(这个过程称为分用)。当然这一切都是协议规定好的.
A:发送数据
1:应用程序处理
键盘输入“早上好”之后,点击某个应用程序的发送按钮,之后应用程序会进行编码(比如utf-8)。应用程序在发送那一刻建立TCP连接,从而利用TCP连接发送数据,它的过程首先是将应有的数据发送给下一层的TCP。
2:TCP模块处理
TCP根据应用的知识,负责建立连接,发送数据及断开连接。TCP提供可靠传输保证数据顺利发送
TCP首部包括源端口号和目标端端口号(用于是被发送主机和接受主机上的应用),序号(用于判断包中那部分是数据)还有校验(判断数据是否损坏)。随后再发送给IP
3:IP模块处理
IP模块在TCP首部前添加IP首部,IP首部包含接收端IP地址和以及发送端IP地址。IP包生成之后,参考路由表决定接受此IP包的路由和主机,随后IP包将被发送给连接这些路由器或主机网络接口的驱动程序,以实现真正发送数据。只要知道了对方MAC地址就可以将MAC地址和IP地址交给以太网驱动程序实现数据传输
4:以太网驱动添加首部通过物理层实现传输
B:路由转发
数据已经封装好了,准备进行发送,如果对方和自己不在同一个局域网内就要进行路由器的转发,如下图。
有两个局域网,中间的路由器可以作为左边局域网的主机也可以作为右边局域网内的主机。路由器接受到左侧发送过来的数据后,进行解包,发现MAC地址不在本局域网内,然后去除之前的以太网首部,通过查询路由表确定新的MAC地址,再次添加以太网首部,然后发送到另一个局域网内。
所以我们在百度搜索输入框输入一些关键词回车之后,就会发生上述的数据发送过程,由于我们自己的IP地址是固定的,百度服务器的IP地址也是相对固定的,由于距离较远,所以要经过多个路由器进行转发,每次转发时只需更换以太网首部即可
C:接受数据
4:以太网驱动处理
所以主机收到以太网包后,首先会从以太网的包首部找到MAC地址进行判断,如果和本机MAC地址相同则认定为是发送给自己的包,然后接着查找以太网包首部中的类型域以确定是什么类型的包(比如说IP包);反之如果不相同则直接丢弃数据
3:IP模块
IP模块收到以太网驱动传回的数据后,也分析IP包首部,比如判断包首部中的IP地址是否与本机的IP地址匹配,如果匹配就继续查找上层协议,如果上层是TCP就传递给TCP处理。对于有路由器的情况下,接收端地址往往不是自己的地址,所有就要进行路由转发等操作
2:TCP模块
略
1:应用程序
略
二:网络中的地址
(1)MAC地址
MAC地址用于识别数据链路中互连的结点。
MAC地址有48个比特位,地址一般会被烧入到ROM中,因此MAC地址在世界上都是独一无二的(也有例外)
(2)IP地址
MAC地址是用来标识同一个链路中不同计算机的标识码。但是在网络传输中,也必须要有一个地址信息,一般叫做IP地址,用于在连接到网络中的所有主机中识别出进行通信的目标地址
无论一台主机与哪种数据链路连接(比如以太网电缆或者无线局域网),其IP地址都将保持不变。也就是IP地址其实是和之前的进程地址空间,“Linux下一切皆文件”采用了相同的思想——抽象,虚拟化
IP地址是一个4个字节,32位的整数,IP地址在计算机内部将以二进制方式处理,但是这样的表示方法不太好,所以一般采用点分十进制的方式表示,也就是将32位IP地址每8位为一组,分为4组,每组以"."
隔开,再将每组数转化为十进制。比如192.168.0.1
(3)端口号
①:基本概念
数据链路和IP中的地址,分别指的是MAC地址和IP地址,前者用来识别同一链路中不同的计算机,后者用来识别TCP/IP网络中互连的主机和路由器。
在传输层中也有类似的概念,那就是端口号。端口号用来识别同一台计算机中进行通信的不同应用程序,因此它也被称为程序地址
②:端口号确定方法
系统端口号范围为0-65535,0-1023为知名端口号,这些端口号预留给服务端程序,例如
- ssh:22
- ftp:21
- telnet:23
- http:80
- https:443
除了知名端口号外,还有一些端口号也被正式注册,他们分布在1024到49151的数字之间。除此之外,剩余的49152-65535之间的端口号将会交由操作系统进行自动分配,以保证端口号不会冲突
三:五元组
在TCP/IP协议中,使用五元组来唯一标识一个网络通信
- 源IP:标识源主机
- 源端口号:标识源主机中该次通信发送数据的进程
- 目的IP:标识目的主机
- 目的端口号:标识目的主机中该次通信接收数据的进程
- 协议号:标识发送进程和接收进程双方约定的数据格式
五元组在网络通信中的作用,类似于发送快递
可以在cmd中,输入 netstat -ano
查看网络数据传输中的五元组信息
以上是关于Java网络编程-第一节3:网络编程必备网络知识3之IP地址端口号的主要内容,如果未能解决你的问题,请参考以下文章
Java网络编程-第一节1:网络编程必备网络知识1之网络初识和网络协议
Java网络编程-第一节1:网络编程必备网络知识1之网络初识和网络协议
Java网络编程-第一节2:网络编程必备网络知识2之网络协议分层