当前位置: 首页 > news >正文

要学好网站开发要会什么爱站网关键词搜索

要学好网站开发要会什么,爱站网关键词搜索,网站开发市场价,seo教学视频教程#x1f34e;作者#xff1a;阿润菜菜 #x1f4d6;专栏#xff1a;Linux系统网络编程 文章目录 一、网络通信的本质#xff08;port标识的进程间通信#xff09;二、传输层协议UDP/TCP认识传输层协议UDP/TCP网络字节序问题#xff08;规定大端#xff09; 三、socket编… 作者阿润菜菜 专栏Linux系统网络编程 文章目录 一、网络通信的本质port标识的进程间通信二、传输层协议UDP/TCP认识传输层协议UDP/TCP网络字节序问题规定大端 三、socket编程API和sockadder结构深入理解socket函数socket常见APIsockaddr结构 四、动手实现简单的UDP网络程序 一、网络通信的本质port标识的进程间通信 在网络基础部分我们学习了什么是ip地址。 1.只要有目的ip地址和源IP地址就能够完成客户端和服务器的通信了吗 并不是这样的实际通信的并不是两台主机而是两台主机上分别的客户端进程和服务器进程ip地址能够标识主机的全网唯一性那用什么来标识客户端进程和服务器进程的唯一性呢其实是用端口号port来标识的。2.所以只要有ip地址port就能够确定数据包发送给哪一个主机的哪一个进程了。 其中端口号是传输层协议的内容应用层可以通过system call来获取端口号端口号是一个2字节16位的整数最大可达到65536的大小因为传输层和网络层是操作系统实现的所以port可以告诉操作系统应该将数据包发送给目标主机的哪一个进程。端口号在同一个ip地址对应的主机内只能被一个进程所占用所以不同主机内部可能会出现相同端口号这是很正常的事情因为port标识的进程唯一性是在一台主机内部的不同主机内出现相同port是很正常的。 例如下面图中主机A和主机B分别通过自己的ipport标定了各自内部的进程在全网中的唯一性从而实现跨局域网的网路通信。 3.所以网络通信的本质实际就是进程间通信只不过今天的进程间通信是跨主机跨网络的而之前我们学习的进程间通信只是在一台主机内部各自进程之间的通信并没有跨主机和跨网路而在ip和port以及网络协议栈的支撑下就能够实现跨主机跨网络的进程间通信而这样的进程间通信实际就是网络通信。 如果要来谈进程间通信的话我们说过进程间通信的前提是让不同的进程先看到同一份资源这份资源是什么呢这份资源其实就是网络包括局域网和广域网。而通信的本质实际就是IO我们所有的上网行为无外乎就是两种一种是将自己的数据发送出去一种是接收别人给我发的数据。 4.那么问题来了 – 既然进程已经有pid了为什么还要有port来标识唯一的进程呢 理由1系统是系统网络是网络我们并不希望这两个模块儿是强耦合在一起的因为一旦强耦合一个改变时另一个也需要改动代码的鲁棒性不好单纯从技术角度来讲只用pid不用port绝对是可以实现的但我们希望系统和网络能够解耦互不影响。 理由2服务器进程的端口号是不能轻易改变的一个服务器设置好端口号之后很长一段时间内这个服务器会一直使用这个端口号因为客户端需要每次快速准确的找到服务器进程所以这就意味着服务器的ip和port都是不能轻易改动的就像110120119的电话一样一旦设置了能轻易改动吗当然是不能轻易改动的而进程的pid是每次操作系统给随机分配的每次的pid都是随机的所以需要有port来标识进程。 理由3不是所有的进程都需要提供网络服务但所有的进程都需要有pid。 5.所以当进程绑定一个端口号之后我们便称这个进程为网络服务进程。 那底层操作系统如何依靠这个uint16_t类型的端口号找到对应的进程结构体struct task_struct结构体呢这里简单说一下底层中操作系统实际是通过哈希的方案通过port来找到对应的PCB结构体的用端口号作为哈希表的key值哈希桶中存放对应的PCB结构体地址也就是struct task_struct类型的指针只要找到PCB指针那就能找到进程相关的所有信息例如文件描述符表struct files_struct *files进程的信号位图地址空间等等一系列信息。 6.另外一个进程可以绑定多个端口号但一个端口号不能被多个进程绑定。 比如某个端口号代表的服务器进程功能是传数据的另外的端口号是执行指令的那么有可能一个服务器进程兼具了这两种功能当客户端向这两个端口号发送数据进行请求时有可能请求到的是同一个服务器进程这个服务器进程同时响应两个客户端的请求为他们同时提供服务。 但一个端口号只能对应一个进程否则客户端向该端口号发送请求的时候进行响应的都不知道是哪个进程了此时就有可能出现服务器接收数据丢失或失败等问题。 在有些网络服务中可能会出现留后门的情况即为一个进程绑定了两个端口号一个端口号给客户用一个端口号给另外的某个人用但客户并不知晓这就是软件开后门 — 就比如说我们之前四六级报名时有时候换个网站速度就会更快些。 二、传输层协议UDP/TCP 认识传输层协议UDP/TCP TCP/UDP都是传输层协议我们在进行网络编程时一定是少不开访问传输层的因为应用层在进行开发时一定会调用传输层和应用层之间的system call API。 TCP叫做传输控制协议他在进行网络通信时是需要建立连接的所以TCP是一种可靠传输当然我们是无法感受到这种可靠性的因为传输层在OS中我们只停留在应用层。另外TCP是面向字节流的。 UDP叫做用户数据报协议他在进行网络通信时不需要建立连接所以UDP是一种不可靠传输同样我们还是无法感受到这种不可靠性。UDP是面向数据报的。 等到后面进行套接字编程的时候你就能体会到了UDP在通信时客户端发什么服务器就接受什么通信起来非常的方便TCP在通信时就比较繁琐需要先建立链接然后用文件IO(字节流)那一套来进行客户端和服务器的通信. 但需要注意的是可靠和不可靠都是中性词并不是说不可靠是贬义词针对不同的常见适合不同的传输层协议例如银行转账时一定是要用TCP协议的数据的传输必须是稳定可靠的但某些网络广告推送就比较适合用UDP因为稳定可靠一定是有代价的在代码处理上一定是更为繁琐复杂的维护和编码的成本一定是比较高的。而广告推送这样的场景对稳定可靠的要求没那么高自然就比较适合使用UDP协议因为维护和编码的成本低。 网络字节序问题规定大端 网络中传输的数据规定是大端的 协议谈完之后需要面临的第一个问题就是网络字节序的问题因为我们知道一般企业级的服务器一般都是大端字节序我们用户级的笔记本都是小端不同的主机使用的大小端都是不同的这该怎么统一 一下呢如果某个主机发送的数据是小端字节序而接收的主机按照大端字节序来进行数据解释这一定是会出问题的。 所以早在网络还没有大面积推广的时候就已经规定了网络中的数据必须是大端的如果你是小端机那就必须先将数据转为大端然后再发送到网络中如果是大端机则直接发送数据即可。 其实这样规定也是有一定道理的因为小端规定数据的高位在高地址处低位在低地址处而地址是从左向右逐渐增大的数据的比特位是从左向右逐渐减小的则内存中的存放和逻辑上的形式正好是反过来的不利于看待大端字节序更符合我们的逻辑认知。 主机在发送数据和接收数据时都是按照从低地址到高地址的顺序来进行发送和接收。 小端和大端之间的转换工作谁来做呢 Linux早已为我们提供好了一批字节序的转换API了。主机和网络分别对应host和netl和s代表long和short主机转网络时会统一将数据转换为大端网络转主机时会将数据转换成主机的字节序可能是大端也可能是小端这取决于主机的字节序。 上面接口只提供了short和long两种数据类型那如果有char和double的数据类型要进行主机和网络的转换呢一般在网络发送的时候发送的数据都是字符串如果能显示用上面的接口那就显示用如果类型不匹配那就发送隐式类型转换系统帮我们做这个工作。 三、socket编程API和sockadder结构 socket编程是一种基于网络协议的通信机制可以让不同主机上的进程进行双向通信。 深入理解socket函数 先来具体看一下socket函数用法 创建套接字的函数叫做socket该函数的函数原型如下 int socket(int domain, int type, int protocol); 参数说明 domain创建套接字的域或者叫做协议家族也就是创建套接字的类型。该参数就相当于struct sockaddr结构(下面有讲解)的前16个位。如果是本地通信就设置为AF_UNIX如果是网络通信就设置为AF_INETIPv4或AF_INET6IPv6。type创建套接字时所需的服务类型。其中最常见的服务类型是SOCK_STREAM和SOCK_DGRAM如果是基于UDP的网络通信我们采用的就是SOCK_DGRAM叫做用户数据报服务如果是基于TCP的网络通信我们采用的就是SOCK_STREAM叫做流式套接字提供的是流式服务。protocol创建套接字的协议类别。你可以指明为TCP或UDP但该字段一般直接设置为0就可以了设置为0表示的就是默认此时会根据传入的前两个参数自动推导出你最终需要使用的是哪种协议。 返回值说明 套接字创建成功返回一个文件描述符创建失败返回-1同时错误码会被设置。 socket函数属于什么类型的接口 网络协议栈是分层的按照TCP/IP四层模型来说自顶向下依次是应用层、传输层、网络层和数据链路层。而我们现在所写的代码都叫做用户级代码也就是说我们是在应用层编写代码因此我们调用的实际是下三层的接口而传输层和网络层都是在操作系统内完成的也就意味着我们在应用层调用的接口都叫做系统调用接口。 2.socket函数是被谁调用的 socket这个函数是被程序调用的但并不是被程序在编码上直接调用的而是程序编码形成的可执行程序运行起来变成进程当这个进程被CPU调度执行到socket函数时然后才会执行创建套接字的代码也就是说socket函数是被进程所调用的。 3.socket函数底层做了什么 socket函数是被进程所调用的而每一个进程在系统层面上都有一个进程地址空间PCBtask_struct、文件描述符表files_struct以及对应打开的各种文件。而文件描述符表里面包含了一个数组fd_array其中数组中的0、1、2下标依次对应的就是标准输入、标准输出以及标准错误。 当我们调用socket函数创建套接字时实际相当于我们打开了一个“网络文件”打开后在内核层面上就形成了一个对应的struct file结构体同时该结构体被连入到了该进程对应的文件双链表并将该结构体的首地址填入到了fd_array数组当中下标为3的位置此时fd_array数组中下标为3的指针就指向了这个打开的“网络文件”最后3号文件描述符作为socket函数的返回值返回给了用户。 其中每一个struct file结构体中包含的就是对应打开文件各种信息比如文件的属性信息、操作方法以及文件缓冲区等。其中文件对应的属性在内核当中是由struct inode结构体来维护的而文件对应的操作方法实际就是一堆的函数指针比如read*和write*在内核当中就是由struct file_operations结构体来维护的。而文件缓冲区对于打开的普通文件来说对应的一般是磁盘但对于现在打开的“网络文件”来说这里的文件缓冲区对应的就是网卡。 对于一般的普通文件来说当用户通过文件描述符将数据写到文件缓冲区然后再把数据刷到磁盘上就完成了数据的写入操作。而对于现在socket函数打开的“网络文件”来说当用户将数据写到文件缓冲区后操作系统会定期将数据刷到网卡里面而网卡则是负责数据发送的因此数据最终就发送到了网络当中。 socket常见API 以下是socket编程常见的几个API现在混个眼熟就行后面我们会进行代码的编写到时候就知道怎么用这些API了。 socket编程有两种主要的类型TCP和UDP TCP是一种面向连接的、可靠的、面向字节流的协议适合于传输大量数据或需要保证数据完整性的场景。TCP的常用API有 socket: 创建一个套接字指定协议族、套接字类型和协议类型。bind: 将一个套接字绑定到一个地址上指定套接字、地址结构和地址长度。listen: 监听一个套接字上的连接请求指定套接字和队列长度。accept: 接受一个连接请求返回一个新的套接字和客户端地址。connect: 发起一个连接请求指定套接字、服务器地址和地址长度。read/write: 从套接字读写数据指定套接字、缓冲区和数据长度。close: 关闭一个套接字释放资源。 UDP是一种无连接的、不可靠的、面向数据报的协议适合于传输少量数据或需要实时性的场景。UDP的常用API有 socket: 创建一个套接字指定协议族、套接字类型和协议类型。bind: 将一个套接字绑定到一个地址上指定套接字、地址结构和地址长度。sendto/recvfrom: 向指定地址发送或从指定地址接收数据报指定套接字、缓冲区、数据长度、标志位和地址结构。close: 关闭一个套接字释放资源。 sockaddr结构 套接字不仅支持跨网络的进程间通信还支持本地的进程间通信域间套接字。在进行跨网络通信时我们需要传递的端口号和IP地址而本地通信则不需要因此套接字提供了sockaddr_in结构体和sockaddr_un结构体其中sockaddr_in结构体是用于跨网络通信的而sockaddr_un结构体是用于本地通信的。 为了让套接字的网络通信和本地通信能够使用同一套函数接口于是就出现了sockeaddr结构体该结构体与sockaddr_in和sockaddr_un的结构都不相同但这三个结构体头部的16个比特位都是一样的这个字段叫做协议家族。 注意 实际我们在进行网络通信写代码时定义的还是sockaddr_in这样的结构体只不过在传参时需要将该结构体的地址类型进行强转为sockaddr*罢了。 1.为什么要定义这么多本地进程间通信的方式 本地进程间通信的方式已经有管道、消息队列、共享内存、信号量等方式了现在在套接字这里又出现了可以用于本地进程间通信的域间套接字为什么会有这么多通信方式并且这些通信方式好像并不相关 实际是因为早期有很多不同的实验室都在研究通信的方式由于是不同的实验室因此就出现了很多不同的通信方式比如常见的有System V标准的通信方式和POSIX标准的通信方式。 IPv4和IPv6的地址格式定义在netinet/in.h中IPv4地址用sockaddr_in结构体表示包括16位地址类型16位端口号和32位IP地址。IPv4、IPv6地址类型分别定义为常数AF_INET、AF_INET6。这样只要取得某种sockaddr结构体的首地址不需要知道具体是哪种类型的sockaddr结构体就可以根据地址类型字段确定结构体中的内容。socket API可以都用struct sockaddr* 类型表示在使用的时候需要强制转化成sockaddr_in这样的好处是程序的通用性可以接收IPv4、IPv6以及UNIX Domain Socket各种类型的sockaddr结构体指针做为参数。 2.为什么没有用void代替struct sockaddr类型 我们可以将这些函数的struct sockaddr参数类型改为void此时在函数内部也可以直接指定提取头部的16个比特位进行识别最终也能够判断是需要进行网络通信还是本地通信那为什么还要设计出sockaddr这样的结构呢 实际在设计这一套网络接口的时候C语言还不支持void*于是就设计出了sockaddr这样的解决方案。并且在C语言支持了void*之后也没有将它改回来因为这些接口是系统接口系统接口是所有上层软件接口的基石系统接口是不能轻易更改的否则引发的后果是不可想的这也就是为什么现在依旧保留sockaddr结构的原因。 四、动手实现简单的UDP网络程序 详见代码仓库udp实现回声服务器
http://www.w-s-a.com/news/234170/

相关文章:

  • 河南省城乡住房建设厅网站wordpress登陆密码
  • 漳州做网站的公司搭建网站多少时间
  • 网站开发实习计划模板微营销手机
  • 网站设计与制作是做什么工作免费封面设计在线制作生成
  • 网站开发的教学课程网站广告调词软件
  • 进下加强新闻宣传网站建设入门 做网站 书籍
  • 电商网站主题photolux wordpress
  • 周口专业做网站公司深圳市宝安区松岗街道邮政编码
  • 上海企业网站推广方法网络营销策划方案框架
  • 一流的常州网站建设机械加工网报价
  • 上海响应式网站建设公司seo课程总结
  • vs网站开发教程昆山普立斯特做的有网站
  • 柳州网站seo网站swordpress 输出内容
  • 网站设计制作电话多少网站流量下降
  • 沈阳做网站推广的公司唐山哪家做网站好
  • 国外著名网站建设公司WordPress破解怎样主题修复
  • 网站建设济南云畅网络广州电力建设有限公司网站
  • 查看公司信息的网站思特奇是外包公司吗
  • 制作企业网站的目的啥都能看的浏览器
  • 做网站可以用哪些语言如何进行网站运营与规划
  • 做效果图网站有哪些电子商城网站制作数据库
  • 小刘网站建设wordpress调用php文件上传
  • 建设银行对账网站网络营销广告案例
  • 做网站开票是多少个点的票wordpress扫码提交数据库
  • 织梦网站改版需要怎么做企业网站备案管理系统
  • 大规模网站开发语言宁夏建设职业技术学院网站
  • 寻花问柳专注做一家男人爱的网站北京展台设计制作
  • 中卫网站设计做自己的卡盟网站
  • 广州网站推广自助做网站人家直接百度能搜到的
  • 电子商务网站建设目标及利益分析安徽建设厅网站施