案例
http协议的方法:get、put
协议:网络中数据交换而建立的规则。字符串怎么封装等一些规定
1 | # exec 9<> /dev/tcp/www.baidu.com/80 |
exec
文件重定向 把9绑定socket9
:文件描述符<>
输入输出
/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的端口。
- 如果有3个进程在不同的主机里,每个客户端都连接了这台服务器,那么这个主机A上要消耗多少个端口号?
服务端A只会消耗1个8080。每个客户端一般会随机生成一个端口号。 - 如果这三个进程在一个主机里【也就是说,起了3个客户端程序】,然后访问A中那一个服务8080(打开3个窗口百度查不同的东西)。
因为这三个进程不能申请到相同的端口号,所以端口号消耗数为3。
如何保证每次页面刷新的时候,三个页面返回不同的所请求的东西,不会乱?隔离这件事怎么完成的?
Socket完成
socket: ip+port ip+port
每一个套接字是独立的,是隔离的。这样就可以区分开了。
sshd进程无论有多少个,只消耗了一个端口号22。也就是说,服务端只会消耗一个端口号。这一个其实就是描述的是当前的标签页和服务端这个连接。
如果我们在虚拟机中再开一个node,想当于打开两个页面寻求一个服务。netstate -natp
显示通信情况:
150.1:windows系统 客户端
150.11:Linux 服务端
当端口号分配完了,再来一个程序就申请不了了。所以从资源重复利用角度,如果不想通信的时候,一定要断开连接,释放资源。
四次分手
- A–>B:fin 想断开
- B–>A:fin + ack 确认,回复我听见了
- B–>A:fin 我也想断开
- 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的网段谁都可以接,只要有路由表就可以扔出去了。