网络基础的概念
- 网络:把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模宏大、功能强大的网络系统,从而使众多的计算机可以方便地互相传递信息,共享硬件、软件、数据信息等资源。
为什么要用协议?
- 如同语言一样,如果想让不同地区的电脑都能互相发送数据并且互相接收并能识别出来就需要一个标准,为了使数据在网络上从源到达目的,网络通信的参与方必须遵循相同的规则,这套规则称为协议(protocol),它最终体现为在网络上传输的数据包的格式。
- 电脑根据相同的协议,将数据按照要求那样排列出来发送到网络中。
通信协议分层的思想
为什么分层:
由于结点之间联系很复杂,在制定协议时,把复杂成份分解成一些简单的成份,再将它们复合起来。最常用的复合方式是层次方式,即同层间可以通信、上一层可以调用下一层,而与再下一层不发生关系。
通信协议的分层规定:
把用户应用程序作为最高层,把物理通信线路作为最低层,将其间的协议处理分为若干规定每层处理的任务,也规定每层的接口标准。
![](https://i-blog.csdnimg.cn/blog_migrate/1e7ac8da3f5f45ea01a2462163b0afe3.png)
应用,表示,会话可以合并为一个应用层来记忆,主要有Http协议,端口等。
传输层主要有UDP,TCP协议。
网络层主要有IP协议。
数据链路和物理层可以合并为一个物理层来记忆,主要由
常见的应用层协议:
TCP/IP协议(TCP/IP协议三卷)传输层协议
- TCP传输控制协议:TCP协议是一种可靠的端对端协议,重发一切没有收到的数据,进行数据内容准确性检查并保证分组的正确顺序。
- IP网际协议:规定数据传输格式
- 应用层协议
HTTP协议
- HTTP超文本传输协议,基于请求和响应模式。(无状态)
FTP协议
- 文件传输协议
SMTP协议
- 简单邮件传输协议
IP地址的定义
- 为了实现Internet上不同计算机之间的通信,每台计算机都必须有一个不与其它计算机重复的地址---IP地址
- IP地址是数字型的,32位(32bit),由4个 8位的二进制数组成,每8位之间用圆点隔开,显示时是十进制
- IP地址被分成了A、B、C、D、E五类,每个类别的网络标识和主机标识各有规则。
- 1.0.0.0到126.255.255.255为A类 主要分配给具有大量主机而局域网络数量较少的大型网络
- 128.0.0.0到191.255.255.255为B类 一般用于国际性大公司和政府机构
- 192.0.0.0到223.255.255.255为C类 用于一般小公司 校园网 研究机构等
- 224.0.0.0到239.255.255.255为D类 用于特殊用途. 又称做广播地址
- 目前正在使用的是IP协议的第四版,称为IPv4(利用命令查看各自本机的ip地址)windows ipconfig linux ifconfig
ps:IP是逻辑上的地址,MAC是物理上地址
子网掩码mask
:用来区分网段,和IP地址相与操作后得出来的值就是该IP所在的网段。
A类IP对应的子网掩码:255.0.0.0
B类IP对应的子网掩码:255.255.0.0
C类IP对应的子网掩码:255.255.255.0
网关gateway
:计算机上叫做默认网关,负责不同网络桥段的通信。如果本计算机给另外一个计算机传递信息,计算出网段后发现目标计算机不在该网段,本计算机就会把信息传递给默认网关,一般默认网关是路由器的一侧IP。
MAC地址
:全球唯一的、用来标识不同网卡(网络适配器)的地址。MAC地址是由48位的二进制数组成,即6个字节。 在通信中是用16进制表示的。
三个最常见的设备:集线器sub,交换机switch,路由器router
集线器sub:
- 负责同一网络内计算机互相通信,通信方式是广播形式,比如在192.168.2.0网络内广播传递信息会给所有192.168.2.0~192.168.2.255内发送信息。
- 坏处是会造成网络的拥堵。
![](https://i-blog.csdnimg.cn/blog_migrate/31aab540c11477e36ebe035f4434ad26.png)
交换机switch:
- 也是负责同一网络内计算机通信,不像集线器那样采用广播形式,而是根据MAC地址和IP与目标计算机通信。第一次使用时每个计算机会发送一个ARP协议包给交换机,交换机将缓存下局域网下所有MAC地址,下次发送信息时就会根据这个MAC表来选择发给哪个PC。
- 好处:具有学习功能;具有缓存地址功能但地址也会改变,默认老化时间300s。
![](https://i-blog.csdnimg.cn/blog_migrate/38feb11bc9a44ad128d7f78533cc534a.png)
路由器router:
- 简单来说就是用来负责不同网络的计算机之间的通信。
- 比如当192.168.4.1的计算机A想要给192.168.5.1的计算机B通信时,A计算机通过将自己的子网掩码和IP地址相与操作后发现和B计算机不在一个网络内,就会把信息发送给默认网关的IP地址,一般情况默认网关就是连接的路由器的一侧IP,交换机拿到这个目标后查表发现是路由器的地址后转给路由器。路由器查找路由表后发现目标IP就是另一侧的IP网段192.168.5.0,于是就把信息转发到自己的另一侧网段也就转给B计算机了。
- 但是如果发现自己的另一侧IP不是目标网段,路由器就会根据路由表给每个和自己另一侧IP记录的IP地址发送,接受到的下一个路由器也会执行相同的操作,经过几次传送后就会计算出花费时间最少的一次,以后再发送数据就按照这个路线走。注意每个IP报文是有声明周期的不会一直无限在网络内乱传。
![](https://i-blog.csdnimg.cn/blog_migrate/69b8c8e4e76b5cab92e4229a91dc9479.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1fff2dac995656f38135c24d709b31b6.png)
在自己电脑上的命令行上查看路由表,命令为route print
每列没有对齐,看的时候需要注意下。
网关为192.168.1.1就是默认网关的一行跃点数最低,经过的路由器最少。
其他都在链路上,说明中间经理了很多路由器,跃点数也很大,经理的路由器也最多。
![](https://i-blog.csdnimg.cn/blog_migrate/71cb340a171adca03ae8d7e291b858e9.png)
端口port:
- 在数据传递时区分不同计算机的进程。
- 同一台电脑上的进程有Pid号,但是这个pid是随机的,每次开机相同的进程可能都不一样。
- 比如电脑开着QQ和微信,另一台电脑传过来一个QQ消息数据,电脑怎么知道这是QQ的数据而不是微信的数据,靠的就是端口,QQ和微信的端口号不同,计算机上的每个进程端口号都不一样否则会冲突导致相同端口的进程只有一个能收到数据。
- IP地址相当于现实生活中的门牌号,而端口号就相当于该门牌对应房子的各个房间号(0~65535,相当于2个字节)建议应用程序使用20000以后的端口号。比较出名的有80号端口。
![](https://i-blog.csdnimg.cn/blog_migrate/b02bd304db1d9ae15ea0c1c63e4b36b5.png)
![](https://i-blog.csdnimg.cn/blog_migrate/144203d42046ba5101522085899509e6.png)
域名domain:
- 计算机想要和另外一个计算机传递数据首先要知道的是对付的IP,但是网络那么大计算机那么多,对应的IP也那么多想要记住非常困难,这个时候就需要域名来代替IP地址。
比如百度的域名:
https://www.baidu.com
,域名需要DNS服务器解析后才能变成IP地址,在浏览器上输入域名后回车,DNS会进行解析,解析后会向目标IP地址发送请求,然后经过网络的层层传递最后返回到本机上一串数据。注意:这一串数据是遵循超文本协议HTTP协议的一大堆数据,只有经过浏览器的还原才能将这一堆数据变成界面呈现给用户,查看返回的值时可以在目标网页中按F12查看。
UDP和TCP的简单概述:
UDP
将数据极其源和目的封装为数据包,不需要建立连接。
每个数据包大小限制在64K中
因为无连接,所以不可靠
因为不需要建立连接,所以速度快
如:人说话、飞秋等
TCP
面向连接,有特有的通道
在连接中传输大数据量
通过三次握手机制连接,可靠协议
断开连接的话,需要四次握手
通信前必须建立连接,效率稍低
如:打电话,文件的传送
区别:
UDP协议速度快但是不安全。因为他不需要建立连接,直接发送出去就行,也不管对付是否能接收到,和写单方信一样自己也不清楚对方是否看了。
TCP协议速度相对UDP较慢但是很安全。只有三次握手后才能算建立起连接,三次握手哪一次失误都不能建立。
TCP的三次连接握手(面试重点)
- 第一次握手:建立连接时,客户端发送syn包(syn=x)到服务器,并进入SYN_SEND状态,等待服务器确认;
- SYN:同步序列编号(Synchronize Sequence Numbers)
- 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
- 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手.
- 完成三次握手,客户端与服务器开始传送数据
TCP的四次挥手
- 客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
- 服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
- 客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
- 服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
- 客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
- 服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。
![](https://i-blog.csdnimg.cn/blog_migrate/c335f336e463405ae9069ba34ad78ec5.png)
十种状态:
CLOSED
:表示关闭状态(初始状态)。
LISTEN
:该状态表示服务器端的某个SOCKET处于监听状态,可以接受连接。
SYN_SENT:这个状态与SYN_RCVD遥相呼应,当客户端SOCKET执行CONNECT连接时,它首先发送SYN报文,随即进入到了SYN_SENT状态,并等待服务端的发送三次握手中的第2个报文。SYN_SENT状态表示客户端已发送SYN报文。
SYN_RCVD:
该状态表示接收到SYN报文,在正常情况下,这个状态是服务器端的SOCKET在建立TCP连接时的三次握手会话过程中的一个中间状态,很短暂。此种状态时,当收到客户端的ACK报文后,会进入到ESTABLISHED状态。
ESTABLISHED
:表示连接已经建立。
FIN_WAIT_1
: FIN_WAIT_1和FIN_WAIT_2状态的真正含义都是表示等待对方的FIN报文。区别是: FIN_WAIT_1状态是当socket在ESTABLISHED状态时,想主动关闭连接,向对方发送了FIN报文,此时该socket进入到FIN_WAIT_1状态。 FIN_WAIT_2状态是当对方回应ACK后,该socket进入到FIN_WAIT_2状态,正常情况下,对方应马上回应ACK报文,所以FIN_WAIT_1状态一般较难见到,而FIN_WAIT_2状态可用netstat看到。
FIN_WAIT_2
:主动关闭链接的一方,发出FIN收到ACK以后进入该状态。称之为半连接或半关闭状态。该状态下的socket只能接收数据,不能发。
TIME_WAIT
: 表示收到了对方的FIN报文,并发送出了ACK报文,等2MSL后即可回到CLOSED可用状态。如果FIN_WAIT_1状态下,收到对方同时带 FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态。
CLOSE_WAIT
: 此种状态表示在等待关闭。当对方关闭一个SOCKET后发送FIN报文给自己,系统会回应一个ACK报文给对方,此时则进入到CLOSE_WAIT状态。接下来呢,察看是否还有数据发送给对方,如果没有可以 close这个SOCKET,发送FIN报文给对方,即关闭连接。所以在CLOSE_WAIT状态下,需要关闭连接。
LAST_ACK
: 该状态是被动关闭一方在发送FIN报文后,最后等待对方的ACK报文。当收到ACK报文后,即可以进入到CLOSED可用状态。
注,第十一种状态:
CLOSING
:这种状态较特殊,属于一种较罕见的状态。正常情况下,当你发送FIN报文后,按理来说是应该先收到(或同时收到)对方的ACK报文,再收到对方的FIN报文。但是CLOSING状态表示你发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文。什么情况下会出现此种情况呢?如果双方几乎在同时close一个SOCKET的话,那么就出现了双方同时发送FIN报文的情况,也即会出现CLOSING状态,表示双方都正在关闭SOCKET连接。
实际中一个小面试题:
在浏览器中输入
https://www.baidu.com后会发生什么
?
1.系统自动在本地寻找hosts文件,该文件在Sysem32/etc下,如果该文件中已经记录该域名对应的IP地址则直接访问IP,没有的话执行域名解析。
2.域名解析,请求配置的DNS服务器,经过DNS服务器解析后获得一个目标IP地址。
3.准备访问目标IP,通过80号端口和按照Http协议生产一个报文。
4.访问IP,从上层的应用层已经生成的报文到传输层,网络层,物理层,层层装包生成最终报文,最后将数据发送出去。
5.寻找路由,从默认网关到路由器,再到下一跳路由器.......
6.在网络中多次转发,最后到达百度的服务器。
7.找到百度的服务器后等待百度主机的防火墙等等验证。
8.百度主机接受请求,并从物理网到应用层,层层拆包并检验数据,最后获得最终信息。
9.应用层解析后开始生成对应的HTML文件,装包并将文件数据返回给客户机。
10.主机经过网络的层层转发后收到了百度主机发来的HTML文件,拆包后交给浏览器,浏览器根据HTML文件进行渲染,最后生成页面。
![](https://i-blog.csdnimg.cn/blog_migrate/a267b38680defe3cb63410b000e09378.png)