网络基础认识加深版,网络中如何建立连接,如何实现视频通话,以及套接字的再次深入从原理剖析,以及cs模型原理介绍,及常用函数以及参数意义

c/s模式:服务端和客户端之间的模式。
    优点:
        1.可以使用自定义的协议,协议比较灵活。需要下载客户端,连接到服务器。qq,lol,
        2.数据可以提前缓存到主机上。

    缺点:
        1。客户端安装在客户主机上,会对客户安全造成威胁,比如360和腾讯撕逼,就因为安全问题互相说窃取用户信息为自己牟利。
        这也就是近些年来cs逐渐慢慢不受欢迎的原因,还有就是开发太麻烦了,c/s需要客户端和服务器端都开发首先开发量比较大,其次是两个端连接调试比较困难。

b/s模式:http协议,浏览器和客户端之间的模式。
    优点:
        1.浏览器作为客户端与服务器端进行通信,不会在用户电脑上安装应用程序,相对来说比较安全。
        2.对于来说只需要开发服务端,相对开发量比较少
    缺点:
        必须支持http协议,不能进行数据缓存,偷菜游戏,农村,可以跨平台,因为是用浏览器打开的。不受平台架构的限制。


使用场景:数据缓存较大 使用cs,cs程序稳定性比较高
         bs,适用于较小的不需要要缓存的应用。
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

在复杂的网络环境中,要进行网络通讯,信息都是通过网卡发送出的,而早做系统对数据会进行封装,先应用层封装头,再传输层封装头,再网络层封装头,最后由物理层的数字链路层封装以太网帧头和帧尾,最后可能通过交换机,和路由器,连接到网络,路由器主要是负责网络层,在复杂的网络环境中进行路径的选择,交换机主要在数字链路层,负责的是局域网能主机的连接。

数据必须封装才可以进入网络进行传输。

这里以fip协议为例进行讲解还可以使用其他协议或者自定义的协议类型,因为这里属于应用层有人为开发的,所以可以自定义。

在数据传送的过程过程中,每经过一的路由器叫做一个路由节点,每个路由器内部都有一张路由表,记录着和自己
相连的其他的路由器的ip以及自己的ip,路由器在自己的路由表中寻找,下一个路由结点的过程就叫做寻路。 
遵循tcp传输数据为什么比较稳定呢,就是因为只要在网络中确定了一条路径连接两台主机之后,就不会再改变这条路
径了,就会一直按着这条路径进行数据包的传输。
但是遵循udp协议的和tcp不一样,内部没有tcp这样的机制,所以每个数据包的路由选择时不固定的。udp每个包都需要寻路 。

在网络通信中其实并不是简单的ip地址就能定位一台主机的,下面我就说道说道这个以太网帧格式。

最后四个字节是用来校验的也就是以太网的帧尾。也对应了前面我所提到的在链路层进行简单的校验。

上面以太网帧里面提到的目的地址和源地址并不是ip地址,而是物理网卡地址。

以太网帧协议中又包含了一个arp协议

在类型这一栏我们要说的就是,有三种类型,当已经知道对端的mac地址之后,然后就会发送0800这种类型,这种类型就是简单的数据包,要是在不知道对端mac地址的情况下就会发送0806请求信号包,请求对端的mac地址。

如果是用了ARP那么后面所跟的 28个字节就不是所要传输的信息了,接下来我们就需要了解一下arp数据报的格式了。

 

28+18=46个字节。

pad就是填充的意思,也就是说最后18字节只是为了满足人家的格式,并不存在实际意义,所以我们需要讨论的就是前28个字节了。

在通过arp协议获取对端mac地址的时候,会经过很对的路由节点,每个路由结点都会对包进行不完全解析,将自己的mac地址和ip填入,并发往下一个结点 ,逐个发送直到找到,自己想要的ip的mac,填充之后再返回。

这里关于路由器如何寻路再说一遍:就是参照ARP协议,首先填充自己的ip和自己的mac,然后根据自己内部的路由标填充下一个路由器的 ip地址,去获取下一个路由器的mac,当ARP协议到达其实会进行不完全解析,将以太网帧协议的拆开,再将网络层的包拆开查看最终想要获取的主机的ip,对端的ip地址是在网络层完成封装的所以你要查看就必须拆开网络层的包,查看之后如果不是这个路由器所连接的主机,他就会将包再重新打包,打包的时候在以太网帧协议的ARP报就会填写自己的也就是本路由的mac和ip,根据路由表挑选一条线路然后发给下一个路由节点,这一类推过去就可以找到对端的mac。

也就是说ARP数据报上面的源ip和目的ip指的只是两个路由节点之间的ip和mac,而两个通讯的主机的ip地址是封装在ip网络层中的。

 

也就是说在网络中是整个包在传递,下面就是包,然后在寻路的过程就是不断地改变ARP报的内容,不断地在两个路由节点之间进行解包和打包的操作,一旦 根据网络层封装的IP发现目的ip就会把mac填充在这个地方再不断地发回来。

 

从一个路由节点到下一个路由节点称为一跳,一个数据包的TTL也就是最大生命周期,每个路由器 进行减一,一旦为0的时候就会被丢弃,以保证网络环境。

 

端口号用来描述一个进程,16位的源端口号和16位的目的端口号保存在传输层的头中tcp或者udp数据报中。

 

端口号在封装c/s或者b/s模型的时候就已经封装好了端口号,b/s模型(浏览器)端口号8080.

ip数据报

udp数据报

tcp数据报

以上三个报格式不需要完全记忆,但是你也要记得八九不离十。

NAT映射机制:

对网络认识再次升级,我们自己使用的ip都是私网IP,而访问外网就必须要连接公网IP,我们发送出来的数据包一般不是直接就进入网络的而是 先通过交换机,在经过路由器在进入网络 ,由于路由器可以替代交换机,所以可以直接发送到路由器上,在路由器中除了路由表之外还有一个nat映射表,nat映射表中记录的是连接到当前路由器的终端的局域IP地址和公网IP地址的对应关系,也包含了不同主机上面的端口号也存在映射机制。路由器具有的是公有的ip,在你的数据包发送到路由器之后,你的IP就是公网的IP,你在网络中传输的时候用的也是公网ip。

假如你的电脑和你朋友的电脑都连接的是同一个公网ip126.563.1.23,然后你俩的私网IP不一样,你是192.138.1.2,你要发送的QQ端口是8000,然后映射到net表中就是192.138.1.2:8000--->126.563.1.23:8005,你的朋友私网IP是192.138.1.6,它的QQ端口也是8000,然后映射到net表中就是192.138.1.3:8000--->126.563.1.23:8016,就是这样的映射机制实现了私网下面的管理。每个私网ip还是可以再向下发自己下面的私网ip,举例我们家里的路由器,就是人家公网路由器发下来的一个私网,然后我们家的路由器又可以好多人 同时连接,我又是不同的私网.

域名背后对应的是IP

 

接着我们聊聊打洞:

网络中两个人聊QQ,数据必须先经过腾讯的服务器,再由腾讯的服务器对数据进行转发,这里是文字信息还好,但是如果使用语音聊天或者视频电话对实时性要求高一些,那么这样的话效率就会很低。所以我们在在想有没有一种办法可以直接实现 两个用户之间的通信,但是对于直接通信来说就是又有一件事情比教麻烦那就是路由器本身的一个保护机制,就是对于一个陌生的ip第一次给我发送数据包,我会把这个数据包直接扔掉或者屏蔽掉,主要是为了防止网络环境的恶意攻击。我们就想办法能不能在这两个路由器之间打个洞,但是又为了路由器屏蔽陌生IP这件事,所以腾讯旧参与了进来在我们登陆QQ访问到腾讯服务器的时候腾讯就会把自己的ip回复给你所在的路由器,然后路由器旧记录在了在自己的路由表里面,然后对端也登陆的话也就会访问腾讯服务器,执行相同的操作,为的就是防止路由器的屏蔽机制,这个打洞就是腾讯的公网服务器来完成的,直接对两个私有ip所连接的共有IP所在路由器进行直连,达到快速传输的目的。

并且只有在视频聊天或者语音的时候才会进行打洞操作,视频或者语音通话完毕就依然执行转发数据的操作。打洞就如上面所讲的利用的就是两个公网IP,也就是主机连接的两个公网

公网连公网类似于腾讯连接阿里可以直接访问

公网对私网需要映射,类似于我们发送的数据要经过腾讯服务器这个公网IP

私对公和共对私是相同的操作

私对私要想直连就需要打洞操作,和映射。

局域网两个主机之间通信是一种类似于公对公的直接访问通信。

 

 

在网络中两个主机连接的话需要ip和mac进行连接,而我们QQ聊天的时候是两端各自访问QQ服务器这样腾讯就拿到了两端的 IP以及端口,信息发送到你们的 公网IP之后组怎样分配就是net映射表的事情了。

 

再谈socket套接字:

socket翻译过来就是插板插座的的意思,也就是socket一定有两端,一段类似于插板,一段类似于插头,一个是数据发送端,一个是数据接收端

IP地址可以在网络环境中唯一的 标识一台主机。

端口号可以在一台主机中唯一的标识一个进程

ip+端口可以在网络中唯一的标识一个进程(这就是socket)。也就是说再使用socket之前必须先确定两个因素一个是ip一个是端口号

 

socket就是Linux下文件的一种数据类型:(也就是伪文件不占用实际存储空间),Linux下占用内存的文件只有三种类型,普通文件,目录文件,软连接。

socket就是用一个文件描述符实现了两个管道,一个读管道,一个写管道

TCP/IP协议规定网络数据流应该是大端字节序,而计算机里面采用的是小端字节序,那么这样就麻烦了我们就需要做网络字节序和主机字节序的转换

下面是几个函数

32位转的是ip,16位转的是端口

 

IP地址转换函数:ip地址就是类似于这样的四组数字192.168.1.2,是四组每组不大于255的数字,用的是字符串来表示的

 

 

inte_pton是把字符串类型的IP地址转换成网络字节序

int inet_pton(int af, const char *src, void *dst);

第一个参数就是询问你选择的ip格式:AF_INET,AF_INET6目前我们使用的都是第一种

src也就是你传进来的那个点分十进制字符串IP

dst就是最后给你转换好的数值,也就是网络字节序

 

//网络字节序转换成点分十进制的字符串类型的字节序

const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);

第一个参数就是询问你选择的ip格式:AF_INET,AF_INET6目前我们使用的都是第一种      

第二个二参数就是网络字节序

第三个参数就是转换好之后你存储的地址,也就是你之前先定义一个空间用来存储这个              

第四个参数就是你指定这个空间的大小

 

sockaddr数据结构:

struct sockaddr是之前定义的一个结构体内部是这样的

但是在使用之后发现这个结构体不细致所以他们就把结构体内部又进行了细分,细分成了下面这个,但是细分是好事但是居然把结构体的名字给改了,改成了struct sockaddr_in,但是使用这个结构体参数的函数参数类型没有改,之前的函数参数是             struct sockaddr * 类型,然后你传参的时候就传struct sockaddr 类型的指针,但是改名之后,现在都这样传参,先在外部定义一个struct socker_in add;然后传参的时候,形参里面是指针,然后这里就得是一个地址&addr,再然后就是类型的强转为           (struct sockaddr *)&add.

上面这个情况用一句话总结就是结构体被废弃了,类型还存在。

类似于这样鸡肋的我们初级阶段大概有三个这样的函数

bind()

accept()

connect ()

struct sockaddr_in内部的成员:

 

首先介绍实现c/s模型常用的几种函数。

使用套接字首先你要创建套接字

流式协议tcp报式协议udp

有关这个listen函数我们得好好说一下,你觉得这个listen函数是用来干嘛的,反正我的第一感觉就是监听,它起监听作用,监听在这个缓冲区中有没有谁发给你的数据,或者你发给谁都数据。这个是错误的,这个通过字面我们理解的是错误的,它并不是这个意思,他的意思指的是最多有多少客户端可以和我建立连接,我们都直到tcp存在一个三次握手建立连接的过程,但是这三次握手并不是说连就连了,而是得两端互相发送信息,彼此确认之后才可以建立连接,linten指定的就是可以有多少 客户端和我同时处在三次握手的这个阶段,握手完成建立连接之后就会保持连接状态这个时候就可以去接纳其他的人继续握手了。

这个函数的作用我希望大家拿刀刻在脑子里,拿?刻那种,要流血那种。

accept是服务器调的函数,第二个参数是传出参数,传出的是和你连接的客户端的IP地址,这里不需要和上面bind函数一样的进行初始化,只需要定义好变量接受参数就可以了。

第三个参数传入传出参数,调用函数,函数出入这个长度,函数调用完毕之后这个长度会发生改变,函数再把实际长度给你传出来,所以这里传的是地址,为的就是可以更方便在一块内存对这个数据进行修改。

在一个就是对返回值的理解,返回的是一个全新的文件socket描述符,接下来的和客户端通信用的都是这个全新的文件描述符。

接套接字篇

 

 

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
    尽管讲解概念如果同学们是初初相识,真有点晦涩难懂,本人讲解概念的同时,尽量结合实操来讲,这样即加固了概念,同时让同学不会感觉到太烦闷,其实对这些重要基础概念的理解,正是学习过《计算机网络原理》,与直接上手做事的人的区别所在。     古人云,腹有诗书气自华,只要先搞懂了原理,学有所成,今后和别人讨论网络底层问题的时候,才能够抑扬顿挫底气十足,不怯场!# 网络层首部     初探十二段内容介绍     ipv4和ipv6 本号表示;首部长度     区分服务,给数据包添加标识 QoS     总长度 Total Length;标识Identification;标志Flags     生存时间 TTL     协议号;首部校验和     实训抓包验证诸项内容# ICMP 差错报告报文格式     数据包类型(详解列表:类型值和代码)     TTL耗尽报告-1     主机不可到达(Destination unreachable)-2     路由重定向(Redirect)-3     给应用程序返回差错报告-4     实例讲解:使用ping命令测试网络判断出问题范围     跟踪数据包路径主要命令介绍:tracert和pathping# ARP 协议     arp 协议本网段与跨网段的工作原理     arp 欺骗的两个目的,阻断连接或截获数据包     arp 欺骗的工作原理阐述,创建阻断连接的实验环境     arp 欺骗演示工具,网络执法官     arp 欺骗防止或阻止措施:         手工绑定两端通信主机的mac地址 -a         同时修改mac地址和ip地址;安装运行wireshark工具 -b         在路由器绑定通信主机mac地址 -c# 搭建流媒体服务     提供点对点服务:采用TCP协议,而非IGMP协议     提供多播视频:根据多播地址切换频道(IGMP协议-UDP)     根据多播IP地址,参照预定规则,合成多播MAC地址     阐述IGMP跨网段运行方式,与创建跨网段环境     启用多播路由:实现流媒体跨网段转发视频,同时抓包查看ICMP数据包特性# 习题详解    网络层协议
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值