对网络的基础认识: 组网方式:
1.网络互联:使用集线器将少量主机连在一起 2.局域网:使用交换机和路由器将主机连接,可以自由组合三种方式:
3.广域网:广域网和局域网只是相对的概念 例如:一个学校之间的网络就可以成为局域网,而一个国家或者多个国家之间可以称为广域网
TCP/IP 五层模型 注意: 应用程序实现对应用层的封装和分用
对于一台主机,他的操作系统内核实现了从传输层到物理层的内容(四层封装分用);对于一台路由器,他实现了从网络层到物理层 (下三层封装分用)对于一台交换机,他实现了从数据链路层到物理层(下两层封装分用)对于集线器,他只实现了物理层;
对封装分用的理解
- 封装:发送数据时,从高到低的顺序,按照对应的网络分层协议对数据进行包装
例如:
2.2.分用:封装的逆过程:接收数据时,从低到高的顺序,按照对应的网络分层协议,解析数据
例如: (1)认识IP和MAC IP:
IP的格式:xxx.xxx.xxx.xxx IP由四个部分组成,每个部分都是0-255. 网络号:前三个部分组成(用来标识网段),前三个部分相同,标识在一个网段 主机号:最后一个部分用来标识主机号 IP分为A-E五大类,部分范围是局域网IP,部分是广域网IP,可以根据规范,知道某个IP是局域网IP还是公网IP 注意: 局域网内(局域网IP):网段唯一,同一个网段,主机号唯一 公网(公网IP):公网IP是唯一的
MAC:
和网卡硬件绑定的,全球唯一 作用:网络数据传输定位网卡硬件的位置,一个主机可能有多个网卡(例如蓝牙连接,无线连接,有线连接的网卡),电脑硬件定位数据发送的目的位置只能使用MAC
总结: IP地址描述的是路途总体的起点和终点。(给人用的,网络主机的逻辑地址) MAC地址描述的是路途上的每一个区间的起点和终点(给电脑硬件用的,网络主机的物理地址)
(2)网络数据传输的特性 1.IP,MAC起的作用 2.封装分用——发送数据从高到低封装,接收数据从低到高分用 3.结合IP,MAC,理解网络数据传输,本质上是一跳一跳的传输数据 首先根据目的主机发送http请求,从源IP发送数据到目的IP 从源MAC(1)发送数据到目的MAC(2),然后MAC(2)对数据进行封装和分用,再以MAC(2)为源MAC,目的MAC为MAC(3),以此,发送数据到最终目的MAC。 注意: 接收数据报的主机:可能在一些情况下(广播或者转发),出现目的MAC不是我,我也能收到的情况(后面会提到)。
五元组: 源IP,目的IP,源端口,目的端口,协议号
IP:标识主机,给人用 源IP:发送数据的主机 目的IP:接收数据的主机
端口号: 源端口:标识发送数据的进程 目的端口,标识接收数据的进程 协议号:进程需要封装,解析数据报的数据格式
DNS协议: 作用:域名转IP 主机/路由器:都存在DNS缓存 域名查询的方式:上图树形结构从下往上查找(缓存,域名服务器)。 先在主机/路由器的DNS缓存中找,如果找不到,依次向上
特殊的IP,域名:本机IP为127.0.0.1,本机域名为localhost
(3)网络数据传输流程 ARP/RARP协议: 主机中有ARP缓存表 ARP协议:IP转MAC RARP协议:MAC转IP
注意:交换机和集线器自己是没有MAC地址的,都是通过转发(不会修改源MAC和目的MAC) 交换机有MAC地址转换表,可以根据MAC找到对应的端口,而集线器没有这个功能
- 1.ARP缓存表找到了
1.主机1发送数据到主机3(http://主机3:80) 2.主机1查找本机的ARP缓存表,根据ARP协议,找到目的MAC 3.数据报由主机1,发送到集线器(数据报中的源MAC(主机1),目的MAC(主机3)真实的数据报 4.集线器转发数据报到除主机1的其他所有相连的主机(主机2,主机3) 5.主机2接收:数据报中,目的MAC不是我,丢弃 主机3接收,数据报中,目的MAC是我,接收 目的IP是我,交给对应端口处理,如果不是我,执行上述网络传输(一跳一跳的过程)
- 2.ARP缓存表没找到
1.主机1发送数据到主机3,http://主机3:80 2.主机1查找本机的ARP缓存表,发现找不到 3.主机1发送广播数据报(非真实数据,只是要求对应主机返回MAC:我要IP为主机3的MAC,谁是主机3,快告诉我) 4.集线器转发到主机2,主机3 5.主机2接收:要求的IP不是我,丢弃 主机3接收:要求的IP是我,返回我的MAC 6.主机1收到主机3的返回数据(IP,MAC)更新自己的ARP缓存表 7.主机1发送真实的数据到主机3 注意:使用集线器的缺陷 网络冲突,这样构成的网络区域叫冲突域/碰撞域(例如,房间里有多个人说话,那么其中某一个人说话就听不清楚了)
2).局域网交换机组网的方式 首先介绍交换机,交换机的作用: MAC地址转换表:保存连接的主机MAC和端口的映射,目的MAC是谁,直接转发到对应的端口(不像集线器,发送到所有端口),不会产生冲突域。
1.主机1发送数据到主机3 ,http://主机3:80 2.主机1查找本机的ARP缓存表,如果找到,主机1发送数据到主机3。如果找不到,发送广播数据报,让IP为主机3的告诉我,你的MAC 3.交换机转发到其他所有端口(广播) 4.主机2丢弃,主机3返回自己的MAC 5.交换机知道主机3的MAC,主机1知道主机3的MAC(更新ARP缓存表) 注意:上述五个步骤,都是根据IP找MAC,和集线器的流程相似,下面的步骤时根据MAC找端口 6.主机1发送真实数据给交换机 7.交换机查找自己的MAC地址转换表,通过MAC找端口,发送数据到对应的端口 8.主机3接收,目的MAC是我,目的IP也是我 这种网络数据传输的方式就像:先问张三的手机号,再打电话给张三,对别人没有影响 3)局域网交换机+路由器组网的方式 注意:单独由路由器组网的方式,和上述由交换机单独组网的方式相同 首先介绍路由器,这里介绍两种: <1>LAN口连接局域网,为主机分配局域网IP,分配的局域网IP都是一个网段(路由器下连接多个主机的类型) 路由器还有个网卡:绑定局域网的IP,和下面连接的主机进行信息交互用的 <2>LAN口是网卡。每个LAN口都可以连接类似交换机组网的方式 主机上的网络信息: 第二种路由器组网方式: 1.主机1发送数据到主机2:http://192.168.2.y:8080/xxx 2.通过目的IP+子网掩码,计算出目的主机和本机是否在一个网段 3.如果是,不需要使用路由器,和上述使用交换机组网方式一样 4.如果不是,表示我主机1和交换机处理不了,要发送给网关转发(网关就类似于IP的管理者,能查询其他主机的IP) 5.数据报发送给网关设备 目的MC:通过路由器网关的IP在主机1的ARP缓存表中,获取网关的MAC 6.路由器接收到数据报,分用:物理层到网络层,网络层分用,所有可以获取到目的IP 7.路由器查找自己的ARP缓存表(IP找MAC) 8.找不到,路由器发广播,主机2在哪,告诉我你的MAC 9.有了MAC,直接发到主机3 <2>广域网传输流程 1.NAT和NAPT
NAT协议:局域网IP映射公网IP NAPT协议:局域网IP+局域网端口映射----->公网IP+公网端口
2.传输流程 结合上图,理解广域网传输流程 首先:主机1发送http://www.baidu.com网络流程
传输流程 1首先主机1发送http请求,使用DNS协议:进行域名转IP 域名转IP:首先在本机DNS缓存表找,如果找不到---->向上查找------>如果根域名服务器也找不到,表示公网上没有该域名的主机
- 找到IP,数据报IP部分,PORT部分都有了:
3.根据目的IP计算是否和主机在同一个网段 主机1的IP+子网掩码 计算出------>主机1的网段 目的IP+子网掩码 计算出------->目的主机的网段 通过上述计算,判断目的IP和主机是否在同一个网段
4.如果是同一个网段,和局域网传输一样 如果不是同一个网段:发送数据到网关 找网关的MAC: 5.找到网关的MAC之后,将http数据重新封装,交由交换机转发 交换机转发:在MAC地址转换表(MAC映射端口),通过目的MAC找端口(交换机的屁股口) 注意:这个过程没有封装和分用
注意:前五个步骤,和路由器组成的局域网传输流程一样 参考:局域网传输
6.路由器接收,分用数据报 注意:路由器会根据最短路径算法,计算出下一个发送数据的设备,会离目的IP更近一步
7. 上述步骤之后,数据报由局域网到广域网进行传输 路途中的设备: 8. 数据报到达百度服务器之后 **9.**数据由百度服务器返回,路途上经过的设备传输流程和步骤七相同(但是不一定是原路返回) **10.**路由器1接收响应数据(对接收的数据进行分用,修改,封装)
- 之后的步骤,和局域网传输相同
主机接收数据报,分用
3.UDP和TCP <1>UDP协议 UDP协议端格式: 16位UDP校验和作用:类似于藏头诗,双方约定好的校验数据,进行数据校验
UDP的特性: 1.无连接:没有建立连接就发数据 2.不可靠:没有类似TCP保证数据传输的安全机制,(连接管理机制,确认应答机制,超时机制 ,)效率更高。 3.面向数据报:只能一次接收(系统级别的操作:调用系统函数) 4.没有发送缓冲区(发了消息就不管),有接收缓冲区 5.数据最大为64k 发送缓冲区:主机1发送完数据,发出之后就不管了 接收缓冲区: 如果发送端调用一次sendto, 发送100个字节, 那么接收端也必须调用对应的一次recvfrom, 接收100个字节; 而不能循环调用10次recvfrom, 每次接收10个字节; 所以,接收数据的时候,发送100个字节,系统读取只调用一次,但是可以读取多次发来的其他100字节。 但是这个接收缓冲区不能保证收到的UDP报的顺序和发送UDP报的顺序一致; 如果缓冲区满了, 再到达的UDP数据就会被丢弃;
<2>TCP协议(可靠的传输协议) (1)TCP相关概念 TCP协议:可靠的传输协议,安全,效率(有连接的可靠传输协议) 设计TCP协议的理念:非100%安全,保证可承受范围内的安全,尽可能的提高网络传输数据的效率 TCP协议端格式: 六位标志位: URG: 紧急指针是否有效 ACK: 确认号是否有效 PSH: 提示接收端应用程序立刻从TCP缓冲区把数据读走 RST: 对方要求重新建立连接; 我们把携带RST标识的称为复位报文段 SYN: 请求建立连接; 我们把携带SYN标识的称为同步报文段 FIN: 通知对方, 本端要关闭了, 我们称携带FIN标识的为结束报文段 重点掌握ACK,SYN,FIN
(2)确认应答机制 主机A发送数据给主机B,每个数据都带了数据序号,主机B返回ACK应答 每一个ACK都带有对应的确认序列号, 意思是告诉发送者, 我已经收到了哪些数据; 下一次你从哪里开始发
作用: 1.保证安全:保证‘我’发送的消息,对方必须确认并恢复 2.保证多条数据确认信息的安全(告诉发送者,这次回应是对哪些数据,下次数据发送应该从什么时候开始) (3)超时重传机制(安全机制) 超时重传机制触发:主机A发送数据给主机B,如果主机A在一个特定的时间间隔内没有收到来自主机B的确认应答,就会进行数据重发。
没有收到确认应答的情况:1.主机A的数据报在发送的过程中丢了。2.主机B的ACK应答丢了
超时时间的确定:TCP会根据当时的网络状态,动态的计算数据发送的速度,得到单次数据报发送的最大生存时间(MSL),超时时间即为(2MSL)
了解:如果一直接收不到ACK,超时时间会如何处理? Linux中(BSD Unix和Windows也是如此), 超时以500ms为一个单位进行控制, 每次判定超时重发的超时时间都是500ms的整数倍. 如果重发一次之后, 仍然得不到应答, 等待 2500ms 后再进行重传. 如果仍然得不到应答, 等待 4500ms 进行重传. 依次类推, 以指数形式递增(2的指数倍). 累计到一定的重传次数, TCP认为网络或者对端主机出现异常, 强制关闭连接. (4)连接管理机制(安全机制) 1.建立连接------>TCP三次握手:
TCP------>三次握手的流程
1.主机A发送syn到主机B,要求建立a到b的连接。此时主机A的状态为syn_sent 2.主机B回复ack+syn(这里的ack和syn数据报本来是两个,但是仅标志位不同,所以可以合并,为什么不是四次的原因),要求建立b到a的连接,主机B的状态为syn_rcvd 3.主机A回复第2步syn的ack。主机A的状态为established,建立A到B的连接 主机B接收到第3步的数据报,建立B到A 的连接,主机B的状态置为established
TCP------>三次握手中的问题: 1.syn为什么有两个? 双方的连接状态会持续,且连接是有方向的
2.第二步中,为什么是ack+syn? 本质上是一个发ack应答,一个发syn请求,而且是方向一致的两个数据报,可以合并
3.第三步中,ack确认应答哪个? 应答第二步的syn
2.断开连接------>TCP四次挥手:
TCP------>四次挥手的流程 1.主机A发送fin到主机B,请求关闭a到b的连接 2.主机B回复ack,主机B的状态置为close_wait 3.主机B发送fin到主机A,请求关闭b到a的连接 4.值即A回复ack(第三步的fin),状态置为time_wait 主机B接收到第四步的数据报,状态置为closed 主机A经过2MSL(超时等待时间)之后,状态置为closed
TCP------>4次挥手中的问题 1.第2步和第3步为什么不能和3次握手流程一样,进行合并 原因:第2步是TCP协议在系统内核中实现时,自动响应的ack 第3步时应用程序手动调用close来关闭连接的 程序在关闭连接之前,可能需要执行释放资源等前置操作,所以不能合并(TCP协议实现时,没有这样进行设计)
2.第3步中,主机A为什么不能直接设置为closed状态 原因: 第4个数据报可能丢包,如果直接置为closed,丢包后无法重新发送数据。 主机B达到超时时间之后,会重发第三个数据报,然后要求主机A再次回复ack
3.服务器出现大量的close_wait状态,是为什么? 服务端没有正确的关闭连接(程序没有调用close,或者没有正确使用) (5)滑动窗口(效率) 如果没有滑动窗口,网路数据传输就是串行的方式(发送一次之后,等待应答,这个时间内,主机A无事可做,主机B也一样),效率比较差。
使用滑动窗口可以解决效率的问题:类似于多线程的方式,并发的,同时发送多个数据报。 如下图: 1.窗口大小指的是无需等待确认应答而可以继续发送数据的最大值. 上图的窗口大小就是4000个字节(四个段). 2.发送前四个段的时候, 不需要等待任何ACK, 直接发送; 3.收到第一个ACK后, 滑动窗口向后移动, 继续发送第五个段的数据; 依次类推; 4.操作系统内核为了维护这个滑动窗口, 需要开辟 发送缓冲区 来记录当前还有哪些数据没有应答;只有确认应答过的数据, 才能从缓冲区删掉; 5.窗口越大, 则网络的吞吐率就越高;
丢包问题: 1.数据报丢包 如上图:如果主机A发送的数据报丢包,主机B的ack应答,会根据主机A已经收到的连续数据报的最大值+1返回ack应答,当主机A收到三个同样的ack应答之后,会将丢掉的数据报进行重发(具有接收缓冲区,来记录已经接收的数据报的序号)
2.ACK应答丢包:这种情况下, 部分ACK丢了并不要紧, 因为可以通过后续的ACK进行确认 如果是滑动窗口的第一个包丢了,根据上述数据报丢包的情况,收到了第6个报的ACK应答,是从6001开始,说明第一个报主机B已经收到,所以ack丢包可以根据后序ack确定数据报主机B是否收到
关于滑动窗口的几个问题: <1>.滑动窗口的大小:无需等待确认应答而可以继续发送数据的最大值 <2>.如何确定窗口的大小:由拥塞窗口和流量控制窗口决定(滑动窗口大小=(拥塞窗口大小,流量控制大小))(后序会讲到) <3>.如何滑动:依赖于ACK的确认序号(ack确认序号前的数据报都已经接收到了),在该ACK确认序号前,当次并行收到了多少个数据报,就可以滑动多少 <4.>为什么要有接收缓冲区和发送缓冲区: 发送端的发送缓冲区:记录已经发送的数据——搜到对应的ACK应答,才可以清理该数据 接收端的接收缓冲区:记录已经接收的数据——如果发送数据报丢包,才知道让对方重发 (6)流量控制机制(安全机制) 接收端处理数据的速度是有限的. 如果发送端发的太快, 导致接收端的缓冲区被打满, 这个时候如果发送端继续发送, 就 会造成丢包, 继而引起丢包重传等等一系列连锁反应.
接收端将自己可以接收的缓冲区大小放入 TCP 首部中的 “窗口大小” 字段, 通过ACK端通知发送端; 窗口大小字段越大, 说明网络的吞吐量越高; 接收端一旦发现自己的缓冲区快满了, 就会将窗口大小设置成一个更小的值通知给发送端; 发送端接受到这个窗口之后, 就会减慢自己的发送速度; 如果接收端缓冲区满了, 就会将窗口置为0; 这时发送方不再发送数据, 但是需要定期发送一个窗口探测数据 段, 使接收端把窗口大小告诉发送端.
当接收端使用流量控制窗口时,如何保证接受端的数据安全? 告诉发送端,影响发送端滑动窗口的大小 (7)拥塞控制机制(安全机制) (8)延迟应答机制(效率) (9)捎带机制(效率)
|