这一篇接上一篇文章互联网协议的诗和远方(一),最近突然迷失在了屈原的离骚中,有对屈原爱国情怀深深折服,不过更多的还是对于古人智慧的一种感叹,第四次工业革命兴起的不仅仅给人带来了前所未有的便利,也剥夺了自然赋予人类想象的天赋,我们开始越来越快,灵魂好像有些跟不上身体的步划,每一个人都行色匆匆,上班下班,大城市的繁荣开始让我们不堪重负,理想被现实取代是一种常态,贪欲是一头恶犬,诗和远方成为人们茶余饭后的闲谈,我想要的不过是在书中寻找自己的一隅精神世界,不过是每一个阳光温柔的周末,泡一壶茶,翻一本书,看大千世界,笑谈人生百态,希望到我古稀之年,回想现在,还可以感叹人生一世,草木一秋,也不枉此生,总不算百走一遭,也只不过是这天地的一颗尘,人生如逆旅,我亦是行人
静态IP地址
静态分配IP地址是指给每一台计算机都分配一个固定的IP地址,优点是便于管理,特别是在根据IP地址限制网络流量的局域网中,以固定的IP地址或IP地址分组产生的流量为依据管理,可以免除在按用户方式计费时用户每次上网都必须进行的身份认证的繁琐过程,同时也避免了用户经常忘记密码的尴尬 ------百度百科
当我们新买了一台电脑,插上网线,开机这时候电脑应该是不能上网的,要想上网我们还需要如下配置,
上面这一张图片涉及到了几个重要的参数,即IP地址,子网掩码,网关,DNS的Ip地址,这几个参数其实是缺一不可的,有了他们我们可以进行网上冲浪,但是这样的配置是有不足的,如果一台电脑使用固定的这些配置,那么其他电脑就不可以使用这一个IP地址了,所以这里又出现了一个动态IP地址
动态IP地址
动态动态,与静态是一个对立面,他是说,我们电脑开机其实是可以不需要我们手动设置IP,电脑会自动给我们分配一个IP地址,他使用的协议就是DHCP协议,这一点我玩虚拟机其实深有体会,当我没有为虚拟机设置固定地址时候,每一次打开虚拟机,查看网络是就会发先,每一次的ip其实都是有变化的,DHCP协议是一种应用层的协议,建立在UDP协议上,他规定了,每一个子网络中,有一台计算机负责本网络的所有IP地址(DHCP服务器),新的计算机加入网络,必须向这一个服务器发送一个DHCP请求
(1)最前面的"以太网标头",设置发出方(本机)的MAC地址和接收方(DHCP服务器)的MAC地址。前者就是本机网卡的MAC地址,后者这时不知道,就填入一个广播地址:FF-FF-FF-FF-FF-FF。
(2)后面的"IP标头",设置发出方的IP地址和接收方的IP地址。这时,对于这两者,本机都不知道。于是,发出方的IP地址就设为0.0.0.0,接收方的IP地址设为255.255.255.255。
(3)最后的"UDP标头",设置发出方的端口和接收方的端口。这一部分是DHCP协议规定好的,发出方是68端口,接收方是67端口。
这个数据包构造完成后,就可以发出了。以太网是广播发送,同一个子网络的每台计算机都收到了这个包。因为接收方的MAC地址是FF-FF-FF-FF-FF-FF,看不出是发给谁的,所以每台收到这个包的计算机,还必须分析这个包的IP地址,才能确定是不是发给自己的。当看到发出方IP地址是0.0.0.0,接收方是255.255.255.255,于是DHCP服务器知道"这个包是发给我的",而其他计算机就可以丢弃这个包。
接下来,DHCP服务器读出这个包的数据内容,分配好IP地址,发送回去一个"DHCP响应"数据包。这个响应包的结构也是类似的,以太网标头的MAC地址是双方的网卡地址,IP标头的IP地址是DHCP服务器的IP地址(发出方)和255.255.255.255(接收方),UDP标头的端口是67(发出方)和68(接收方),分配给请求端的IP地址和本网络的具体参数则包含在Data部分。
新加入的计算机收到这个响应包,于是就知道了自己的IP地址、子网掩码、网关地址、DNS服务器等等参数。
一个例子
java 中的Socket
服务端
/**
*
* @author 谭婧杰
*
*/
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8080);
Socket accept = serverSocket.accept();
DataInputStream in = new DataInputStream(accept.getInputStream());
DataOutputStream out = new DataOutputStream(accept.getOutputStream());
Scanner scanner = new Scanner(System.in);
while (true) {
String readUTF = in.readUTF();
System.out.print("我接受到客户端的消息"+readUTF);
String nextLine = scanner.nextLine();
System.out.print("服务器"+nextLine);
out.writeUTF("服务器"+nextLine);
}
}
}
客户端
/**
*
* @author 谭婧杰
*
*/
public class Client {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("localhost",8080);
DataInputStream in = new DataInputStream(socket.getInputStream());
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
Scanner scanner = new Scanner(System.in);
while (true) {
String line = scanner.nextLine();
System.out.print("客户端"+line);
out.writeUTF(line);
String accpet = in.readUTF();
System.out.print("服务端响应"+accpet);
}
}
}