互联网通信原理

案例

http协议的方法:get、put
协议:网络中数据交换而建立的规则。字符串怎么封装等一些规定

1
2
3
# exec 9<> /dev/tcp/www.baidu.com/80
# echo -e "GET / HTTP/1.0\n" 1>& 9
# cat 0<& 9

exec 文件重定向 把9绑定socket
9:文件描述符
<> 输入输出
/dev/tcp/www.baidu.com/80:linux中一切皆文件

1)首先将9(client)和百度(server)建立连接
2)应用某种协议,比如上面用到http协议
【连接建立到真正传输数据,如果时间间隔太长,会报错】

常识:连接不会断开,一般互联网服务器会有超时【已经建立连接,但是你不说话就断开了】

应用层

应用程序如果想要和别人建立连接传输数据的话,自己要准备一些协议,http、ftp、ssh…按下回车键的那刻,都属于应用层范围。你只要遵循协议就可以了。比如http超文本传输协议,就是允许html文本从服务器传递到客户端。

连接

真正的连接不是应用层建立的,是应用层调用内核(也就是下面的层次)。真正建立传输是要从传输控制层往下调。

传输控制层

为啥叫传输控制?上层软件想和百度建立连接,你先别动,传输控制层帮你去控制传输这个过程。
也就是说:客户端这边的传输控制层会产生一个数据包,这个数据包(syn)会发给服务器,
这时候服务器会给客户端返回一个数据包(syn + ack),
然后客户端再返回一个数据包(ack)

三次握手

通信传输是双向的,有输出有输入。发出去了,对方给了一个回复确认,代表了面向我的输出、输入到服务端是通的;
但是站在服务端,服务端为了确保自己的输出是通的,需要得到一个回复数据包。

当双方完成握手之后,双方的操作系统才会开辟资源,且这个资源主要是为对方提供服务的。这时候的连接是虚无的,主要是双方服务器里面的事情。连接更应该是双方资源开辟的过程,守候对方到来。
有资源的开辟才是连接

1
# netsta -natp

会显示一张表,显示和别人通信的情况。
在这里插入图片描述
端口号:65535个

端口号问题

有Id了为什么还要有端口号?
寻址主机通过IP
通信:程序的通信。
不同的传输协议可以使用相同的端口号,只要端口一致,都将分配给同一种程序处理。但处理不会相互影响。

一个进程可以启动多个,进程id号是不固定的。所以操作系统中维护了一套端口号,来区分不同的进程。比如一个主机启动了两个Tomcat,一台抢到了端口号8080,另一台只能抢别的,假设8081。

问题二、
在这里插入图片描述
如果有一个主机A,启动了tomcat,然后它申请了8080的端口。

  1. 如果有3个进程在不同的主机里,每个客户端都连接了这台服务器,那么这个主机A上要消耗多少个端口号?
    服务端A只会消耗1个8080。每个客户端一般会随机生成一个端口号。
  2. 如果这三个进程在一个主机里【也就是说,起了3个客户端程序】,然后访问A中那一个服务8080(打开3个窗口百度查不同的东西)。
    因为这三个进程不能申请到相同的端口号,所以端口号消耗数为3。

如何保证每次页面刷新的时候,三个页面返回不同的所请求的东西,不会乱?隔离这件事怎么完成的?
Socket完成
socket: ip+port ip+port
每一个套接字是独立的,是隔离的。这样就可以区分开了。

sshd进程无论有多少个,只消耗了一个端口号22。也就是说,服务端只会消耗一个端口号。这一个其实就是描述的是当前的标签页和服务端这个连接。
如果我们在虚拟机中再开一个node,想当于打开两个页面寻求一个服务。netstate -natp显示通信情况:
150.1:windows系统 客户端
150.11:Linux 服务端
在这里插入图片描述

当端口号分配完了,再来一个程序就申请不了了。所以从资源重复利用角度,如果不想通信的时候,一定要断开连接,释放资源。

四次分手

  1. A–>B:fin 想断开
  2. B–>A:fin + ack 确认,回复我听见了
  3. B–>A:fin 我也想断开
  4. A–>B:ack 确认

过一个随机时间,两者把资源释放,结束。
如果三次分手,可能造成一端已经释放了资源,另一端没有。

TCP

面向连接的可靠的传输协议。

面向连接的意思就是:三次握手之后,到开辟资源,这个连接就有了。

扩展:如果在开发中,和别人通信建立完了连接,但你们双方十年之内没有给双方发送数据包,这时候突然要发,连接还是有效的吗?
认为连接是有效的,但是有可能在这期间,有可能网络已经断掉了。所以这时候一旦通信,是不通的(未知通信状态)!所以这也证明连接是虚无的,没有物理连接。
心跳机制:隔一段时间互发数据包

网络层

传输控制层的三次握手,就马上发出去了数据包吗?不是,还要往下调网络层。
也就是发给谁,怎么把包从什么地方发出去,就是网络层管理的。传输控制层只考虑我是该发syn包,还是断开包等。但是包怎么走,还是由网络层规划。

网络层:本机ip和对端ip的书写。

互联网:由很多局域网相互连接后,组成了互联网

DNS

域名解析:一个主机如果拿出来了一个字符串表锁示它的域名,但是那是字符串,通信的时候肯定是使用ip的,那么一般会找这个地址所在的服务器(Domain Name System,域名系统),把字符串交给它,它可以给你返回对应注册的IP地址,你就能通信了。这就叫做域名解析。

打开ifcfg-eth0(以太网接口配置)
在这里插入图片描述

两个.之间是一个字节(8位2进制,0~255)
掩码与ip地址做按位与,最后得到192.168.150.0,就是这台主机所在的局域网的名字【网络号】。11是在这个局域网中的【主机号】。
掩码就是为了卡出归属的网络。

IO设备是毫秒级,内存是纳秒级。 CPU比内存还要快一些。

网关就是条目可以去的位置。
可以查看路由表。

1
# route -n

比如给百度(地址是61.135.169.121)发数据,不知道百度在哪,但是下一跳是192.168.150.2。因为对于第二条,把百度ip和掩码与后,发现和Destination 0.0.0.0匹配。
在这里插入图片描述

无论目标IP地址是什么,都要走192.168.150.2出去,它就是默认网关。
如果给自己局域网发数据,是不需要下一跳的。
在这里插入图片描述

路由器就是转发的过程,里面有路由表。解决网络之间连通的事情。
总结
网络层就是寻找下一跳。

链路层

两层信封,里面那个信封写要到哪去(百度的IP地址),外面再套一个下一跳的地址。套的是ARP映射的地址【MAC地址,物理网卡地址】

从网络层决定好下一跳之后,其实要拿着下一跳,然后找到下一跳的MAC网卡地址。然后数据包其实有两层,外层套网卡地址,内层放的是端点的ip地址。

ARP

:知道别人的ip地址,请求它的mac地址

局域网先进行广播,只有地址是自己的,才收下,否则丢弃。
比如pc1的MAC地址是1.1.1,它想知道目标ip192.168.1.2的mac地址,就先广播,pc2收到发现里面是自己的地址,就把自己的mac地址3.3.3直接单播发送回pc1。
回来到了交换机位置时,不需要广播了。原因是每次有确定mac地址的数据包过来的时候,交换机会记录下来网卡(NIC网络接口卡)的对应mac地址。也就是知道了pc1的接口对应的mac地址是1.1.1。也就是交换机的学习能力。
在这里插入图片描述

交换机和路由器
交换机没有路由表,他只是局域网内部一个转发数据包的。
路由器中才有路由表,连接不同的局域网,进行数据包转发
路由器是三层的,物理层、链路层、路由表层
交换机因为是一个局域网中的设备,不牵扯到其他网段,所以交换机是二层的,只有物理层、链路层。【网卡接口和Mac地址跳转】
附:主机是七层的,或者叫四层的。

IP在数据包中是不变的,代表了端点。但是在通信过程中,数据包的mac地址一直被替换。mac地址代表的是下一跳(或者叫节点)

ip是完成端点间通信的;mac地址是完成节点间跳跃的

所以链路层需要用arp,抓到跳点的mac地址,然后才能把握手的包发出去。
握手的包交换完之后才能把数据发出去。
也就是层与层之间是有依赖的。

物理层

前导码:编码时故意搞个特别的码在前面,通过长度告知解码器后面有货送来,注意接收。
通过前导码就可判断信号是有用信号还是干扰信号,否则忽略不解码

路由器可以有多个网卡接到很多局域网。

单臂路由
一个网卡上可以配两个IP地址,所以8的网段和1的网段谁都可以接,只要有路由表就可以扔出去了。