linux网络基础第一篇tcp/ip五层模型和套接字编程

网络:
路由器:局域网,连在同一个服务器,工作数据处理永远在同一台机器上限制大,服务器压力也大,开发出来一个漏油器,电脑连接到漏油器就可以进行互相通信了;漏油器功能:数据转发;
星形网络:其中一个路由器挂了但是可以选择其他路径进行信号传输;容灾能力强,稳定性更加强大
局域网:小范围内的网络,几公里内
广域网:横跨几千公里非常大型的网络
互联网:国际化的广域网
Eg:中国和阿拉斯加交互,中国的网路接线到互联网上然后阿拉斯加的网也连在互联网上;–>大多数上在国内的广域网内(局域网内)
局域网 城域网 广域网 互联网(国际化的广域网)
网络:编程:tcp/ip协议详解 图解http
网络通信协议:
协议就是一种约定
通信双方约定好的网络通信数据信号的解析格式–>通信双方对网络通信数据信号的统一格式
协议分层:
eg:小明和小红约定打电话用普通话,打电话需要手机,通过手机来通信手机与手机之间还要进行通信(电话通信协议Lte)两层协议(5g通信4g通信3g通信网络通信频段不一样–>数据的波长不一样 没在同一个频段接受信号不一样进行不同的解析方式),如果用bb机二者通信,存在一个情况是BB机通信协议,对于小明小红只需要把手机换成bb机就可以了,是因为手机将它内部进行糅合进行通信数据的解析协议的约定以及封装到手机里了,具体内部实现小明和 小红是不需要关心的意味着小明小红通信分了两层1>普通话人和人之间的通信2>手机和手机之间的通信,分层的好处:将通信协议封装起来替换起来更加方便使用起来更加方便
优点:将提供的服务以及协议接口进行封装之后使用起来更加方便替换起来更加方便,实现起来也更加清晰简单
OSI(网络开放系统互联模型)七层参考模型:---->iso国家标准化组织定义出来—>按照协议,接口,服务进行划分,将整个网络通信协议化成了七层(按照网络通信中的协议,接口,服务队网络通信进行分层)
分别为
应用层:针对特定应用的协议(邮件协议远程登录协议文件传输协议等)–>
表示层:设备过数据格式和网络标准数据格式的转换:接受不同表现形式的信息,文字图像声音等
会话层:通信管理负责建立和断开通信连接管理传输层以下的分层,功能:何时断开建立保持多久连接
传输层:管理两个结点(主机上面进程上面的传输)之间的数据传输,负责可靠传输(确保数据被可靠的传送到目标地址)功能:是否有数据丢失
网络层:地址管理与路由选择–>经过哪个路由传递到目标地址
数据链路层:互连设备之间传送和识别数据帧–>数据帧和比他流之间的转换
物理层:以0,1代表电压的高低灯光的闪灭界定连接器和网络的规定.–>比特流与电子信号之间的切换,连接器与网络与网线的规定
优点是:一种框架性的设计方法,最主要功能是>帮助不同类型等待主机实现数据传输
Tcp/ip五层模型:
Tcp/ip是一组协议,只不过这一组协议里tcp/ip是最典型的两个协议称为tcp/ip协议簇
应用层:将应用层表示层会话层合在一起,负责功能:负责应用程序之间的沟通,每个应用程序发生数据的时候用的应用层的协议都是不一样的为了防止数据的互相解析保证数据的独立性(你的数据你发送由你的程序解析而且只有你的程序解析),(应用层的程序是我们自己写的)
最典型的协议http(网页资源传输)ftp协议(文件传输的协议)还有dns协议还有邮件协议(smtp)和自己定义的协议(qq,微信)—>应用程序如何组织数据–>沟通解析
传输层:负责端与端之间的数据传输;确定哪个程序之间数据传输(qq–qq)–>数据如何传输
典型协议:tcp/udp
网络层:负责地址管理与路由选择,ab主机通信经过很多路由器–>描述远近跳转多少路由器来说(最多用多少路由器,最少用多少路由器)–>本质路径选择
协议iP协议最典型设备路由器:路由选址功能也有数据转发(在更高层下层功能都会实现)
链路层(数据链路曾):负责相邻设备之间的数据帧传输
相邻设备电脑a和b之间又很多路由器,当a发送数据时候,先发送到第一个路由器第二步是发送到下一个路由器这就是相邻设备之间的数据传输,比如从学校回家首先从学校到火车站然后到市的火车站中间经过很多步骤,链路层就是相邻两个设备之间的传输的,数据帧只是一种称呼,数据在传输层叫数据段网络层数据包,链路层数据帧只是数据的不同称呼在不同层,
协议:以太网协议(eth)(负责数据从哪发送从哪接收),典型设备交换机:数据转发的功能
物理层:负责光电信号的传输;典型协议以太网协议(定义的网线进行数据传输的时候双脚线有多少根每一根有多粗,这一根传输距离多长,进行规定),典型设备集线器–>光电信号会有能力的溢散在远距离传输的时候–>信号会越来越弱,所以必须有信号的放大(远距离传输)集线器:就是数据连接放大的功能
网络通信流程:
Eg一台电脑发送一条数据”nihao”需要在键盘敲入””nihao”然后qq在接受这条数据后要自己的协议格式对数据进行封装组织,走到应用层在nihao前面加上qq的协议头加入为”qq nihao”加上qq的协议信息(这里面描述了这个信息如何解析)之后,代表应用层数据处理完毕,然后交给传输层,加上tcp协议,tcp的头信息(tcp qq nihao ).然后到传输层后交给网络层,然后加上ip协议的头(ip tcp qq nihao ),然后交给数据链路层添加以太头(eth ip tcp qq nihao ),到数据帧传输这时候负责数据帧从哪里开始从哪里结束所以不仅有帧头还有帧尾,在添加完后通过物理层的光电信号进行传输这些步骤称为数据的封装然后到对方电脑上对方电脑电脑进行数据解析看头为以太头和帧尾,真正的数据从哪里开始到哪里结束然后把数据解析后交给网络层,去掉Ip头,然后再交给传输层去掉tcp头,然后给应用层–qq是qq协议是qq数据并且这个数据没有出错,然后将数据进行解析最后为nihao称为数据的分用(层层解析)
网络编程套接字
如何实现网络编程,网络数据传输主要说的是传输层
套接字编程(也叫socket编程)
1.ip地址
如何确保发送到指定的电脑–>网络通信必须有个东西标识网络中的主机(只有标识了才能发送到指定的电脑上面而不会发送错误(ip地址冲突,就是有相同的标识,不知道发送给谁就干脆不发了)–>网络上的每一台主机都应该有唯一标识–>就是ip地址)
Ip地址功能:唯一标识网络上的主机
是什么?–>是一个具体数据(整数–>无符号四个字节的整数uint32_t)网络当中发送的每一条数据其实都有一个源ip地址和目的ip地址(数据从哪个主机处理和到哪个主机取)
Ip地址为4个字节无符号整数–>总共有43亿左右ip地址->不够–>
解决ip地址不够情况1>谁上网给谁分配–>dhcp(ip地址自动分配服务)
Eg右键打开网络和共享中心–>更改适配器设置
在这里插入图片描述
没有插网线在这里插入图片描述
右键属性
在这里插入图片描述
然后双击打开可以看到自动获取ip地址—>其实就是dhcp上网的时候自动分配的2>就算这样ip地址还不够用–>大家都连接到互联网上就那些数据传输,但是每个人上网数据传输很少每个人用一个ip地址就有点浪费–>做法路.由器很多主机都连接在路由器上,通过路由器在进行上网–>给路由器分配一个ip地址就好了,代表这些人上网他们的数据都是通过路由器进行转发的就可以使用同一个ip地址就好了当有人接受到数据进行回复,(无法直接进行通信)回复先回复到互联网上然后逐层回复下来路由器还要记录映射关系(和传输的数据)不然ip地址一样无法识别–>这种地址替换技术叫ip地址替换技术–>NAT
Eg:虚拟机设置–>网络适配器—>NAT(NAT模式:用于共享主机的iP地址)就是意味着linux上网没有用虚拟机的ip地址而是进行数据传输的时候在主机上面进行了地址替换替换成了主机的ip地址–>依赖于此电脑–>管理–>服务里面有vmware的服务
在这里插入图片描述
在这里插入图片描述
这就是动态给虚拟机分配地址
在这里插入图片描述
负责将linux的ip地址转换为主机地址进行数据传输
NAT共享一个地址进行上网
NAT是在路由器进行地址替换并且每个电脑都有自己的ip地址这个ip地址就是动态分配的地址(dhcp)
法2路由器包括两个服务:dhcp:ip地址自动分配服务和NAT服务(地址替换服务)二者和起来就可以实现上网了–>缺点导致进行数据传输的时候争抢同一个宽带流量速度就变慢了
法3:扩ip地址,ipv6版本网络通信(128位16个字节4g4g4g4g)
前面叫ipv4版本地址,但是现在用iPv4多,但是用的少–>因为ipv6不向下兼容iPv4–>意味着用ipv6以前ipv4的程序就无法用了(没办法通信)–>成本太高,
Ip地址负责两个主机通信源ip地址和目的Ip地址确定数据从哪里来到哪里去
2.端口号
Port端口:
功能:用于唯一标识主机上处理数据的进程–>用于处理确定不同程序(eg:凭什么qq发的消息是qq处理而不是微信)
为什么不用进程id标识?–>如果使用pid,是不固定的每次重启都会改变pid(如果程序写死那么下次启动就找不着了–>没有办法通信了–>所以使用固定的数据来确定进行)所以使用端口号
数据类型:无符号两个字节的整数uint16_t —65535
网络上发送的数据有源ip,源端口,目的ip,目的端口通信的时候还要有相同的协议(sip sport dip dport proto)–五源组–功能:标识一条通信–>每条数据都该具有这些信息代表通信是什么样子从哪里来到哪里去用的是什么协议
3.网络字节序
字节序作用cpu对数据进行存取的顺序–>存储大小大于一个字节的数据
大端字节序:低地址存高位
小端字节序:低地址存低位
Eg:一个数字4个字节 0x01 02 03 04整数无符号int型数据大小大于一个字节一次存储4个字节,cpu对数据进行存储的时候,大端是低地址存高位,有个数组a[4],把四个字节的数据存储到a[4]空间里去,(位的高低从右到左越来越高最右端是最低位)a[0]首地址,a[4]尾地址,从a[0]–a[4]地址从小到大从低到高,位从04–01越来越高,那么低地址存高位意味着a[0]存01,大端字节序a[4]存储的依次是01 02 03 04 ,
小端字节序低地址存低位a[0]存04则为04 03 02 01
大端字节序和小端字节序意味着对数据进行存储顺序不一样
如果有int a=1;在大端字节序里char
b[4]然后memorycopy把a拷进去那么1是在最低位b[0]是0(0 1)如果a=1是小端字节序在 高位则b[0]是1(1 )
如果把int a=1发送到另一个电脑上(自己电脑是大端)那么另一台主机是小端int型数据接收1在最后面这块真正表示数据时候1应该最前面但是格式刚好不是1是一个特别大的数字通信则出问题了–>怎么解决
字节序取决于cpu架构inter的cpu采用x86字节序–>小端,MIPS架构–>大端字节序
别人电脑大端小端不知道–>通信双方无法确定对方电脑字节序的时候发送大于一个字节存储的数据就有可能造成数据错误–>办法:定标准不管主机是大端小端,网络通信的时候统一使用大端进行通信(规定必须使用大端字节序通信)–>称为网络字节序(就是大端字节序)
如果传数据大于一个自己数据电脑小端必须要转换(short int long float doule,无符号也需要转换int 16_t int 32_t int 64_t)
主机字节序:当前主机的字节序,不一定是大端小端取决于cpu架构需要进行判断
套接字编程:
两台主机之间进行网络通信–必定有一方是主动方
主动方称为客户端,–请求–>被动方称为服务端
数据进行传输时候物理层不关注(网线),数据链路层(以太网协议),网络层(ip协议)传输层(tcp,udp–>如何选择?–>),应用层(自己定义)
传输层tcp和udp的选择:分析利弊适使用场景而定
Tcp:传输控制协议–>特点有连接可靠传输面向字节流(管道数据传输灵活,但是容易发生数据粘连)
有连接:(电话拨通代表双方都在线这时候才能通信(连接上来看双方是否都在))
可靠传输:tcp在传输数据的时候会保证在网络状况良好的时候保证数据能到达对端(保证可靠安全传输传输)
面向字节流:管道数据传输灵活,但是容易发生数据粘连
缺点:为了保证安全传输做很多可靠传输机制保证数据可靠到达会导致传输速率低会有粘包问题(数据没有边界堆积造成的)
Udp:用户数据报协议–>特点无连接不可靠面向数据报
无连接(类似于发短信不管再不在发出去就好了代表别人有可能没有收到)
不可靠:并不能保证数据到达对端,无法保证数据的安全传输
优点速度快,没有粘包问题,面向数据报–>数据整条发送的接受也是整条接受的–>内部是有机制来确定区分出来这条数据在哪里接受的,传输不太灵活
什么场景用:
对数据安全性要求比较高程序用tcp–>典型场景文件传输(压缩包,安装程序)
对数据的实时性要求比较高–>用udp(数据有了就发送)–>典型场景传视频(传输速度要求高安全性不是很高)
基于udp协议实现网络通信:(套接字实现)
客户端 —> 服务端
Socket接口:通过网卡将数据传输出去,操作系统提供了一套网络编程接口
怎么操作网卡?—>(网卡是设备–>linux一切皆文件–>操作网卡就是操作文件,socket也是文件以(d目录文件-普通文件b块设备文件c字符设备文件l软链接文件(符号链接文件)p管道文件s套接字文件(平时看不到)))
对于客户端:步骤
1.创建套接字(操作系统内部涉及到创建文件描述信息,创建套接字的信息创建各自结构和网卡直接建立关联并且返回套接字描述符(本质文件描述符)),建立与网卡的关联
2.对客户端(主动发起请求方告诉别人的地址发送哪里去)就是为套接字绑定地址信息(告诉套接字,操作网卡向外发送数据的时候写源地址源端口写多少(ipdi地址端口放进去))但是对于客户端不推荐手动绑定,会失败(希望操作系统绑定对于套接字绑定源端口和源地址可能会导致失败(已经被占用了),一个端口不能被多个进程使用只能被一个进程使用(会导致数据二义性),但是一个进程可以有多个端口,意味着别人把端口占了自己就没办法发送数据了所以对于客户端程序不推荐绑定地址信息,)
如果不手动绑定在发送数据的时候操作系统发现没有绑定信息,会替我们自动选择合适的地址端口进行绑定(减少了绑定的失败率)
3.发送数据:
客户端不能先接受数据(eg:qq聊天写入了腾讯服务器地址和端口才能将数据发送到同一服务器,腾讯服务器不会记录客户端的ip地址(地址动态分配,上网ip地址不定,每次上网ip地址不定所以没必要记录,)腾讯不知道客户端地址,–>客户端主动发起请求方否则服务端不知道地址信息没办法给它发送数据)
所以先发送数据然后才能接受信息(发送数据已经携带了源端口信息和源地址回复的时候才能回过来)
4.接受数据
5.关闭套接字释放资源(文件描述符占位(inode结点))
对于服务端:
1.创建套接字(建立网卡之间关联)
2.为套接字绑定地址信息(必须自己绑定固定)
3.接受数据
4.发送数据
5.关闭套接字
Udp涉及的关键字:1创建套接字socket() 2.绑定地址信息bind() 3.发送数据(数据发送到哪里去) sedto() 4.接受数据(从哪接受数据接受的是什么数据) recvfrom() 5.关闭套接字 close()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值