Linux--网络编程(一)网络介绍

  • TCP/IP网络简介
  • Linux中TCP/IP网络结构
  • 套接字接口
  • Socket编程
  • 网络字节
  • 数据报通信流程(UDP通信)
  • UDP编程API
  • UDP编程实例

 网络简介

TCP/IP参考协议模型

这里写图片描述

OSI参考模型

这里写图片描述

两种参考模型的对应关系

这里写图片描述

————————————————————————————

 TCP/IP实际上是一个一起工作的通信家族,为网际数据通信提供通路。为了方便,将TCP/IP协议组大体上分为三部分:

  • 1.Internet协议(IP)
  • 2.传输控制协议(TCP)和用户数据报文协议(UDP)
  • 3.处于TCP和UDP之上的一组协议专门开发的应用程序等。
    • TELNET
    • FTP (文件传输协议)
    • DNS (域名服务)
    • SMTP(简单的邮件传送程序)

网络层

 第一部分也称为网络层。包括Internet协议(IP)、网际控制报文协议(ICMP)和地址识别协议(ARP)。

  • Internet协议(IP)
    • 该协议被设计成互联网分组交换通信网,以形成一个网际通信环境。它负责在源主机和目的主机之间传输来自其较高层软件的称为数据报文的数据块,它在源和目的地之间提供非连接型传递服务。
  • 网际控制报协议(ICMP)
    • 它实际上不是IP层部分,但直接同IP层一起工作,报告网络上的某些出错情况。允许网际路由器传输差错信息或测试报文。测试网络比如通过ping命令。
  • 地址识别协议(ARP)
    • ARP实际上不是网络层部分,它处于IP和数据链路层之间,它是32位IP地址和48位局域网物理地址之间执行翻译的协议。

传输层

 第二部分是传输层协议。包括传输控制协议和用户数据报协议。

  • 传输控制协议(TCP)
    • 由于IP提供非连接型传递服务,因此TCP应为应用程序存取网络创造了条件,使用可靠的面向连接的传输层服务。该协议为建立网际上用户进程之间的对话负责。此外,还确保两个以上进程之间的可靠通信。它所提供的功能如下。
      • 监听输入对话建立请求
      • 请求另一网络站点对话
      • 可靠的发送和接收数据
      • 适度的关闭对话
  • 用户数据报协议(UDP)
    • UDP提供不可靠的非连接型传输层服务,它允许在源和目的地站点之间传送数据,而不必在传送数据之前建立对话。此外,该协议还不使用TCP使用的端对端差错校验。它主要对于那些不要求TCP协议的非连接型的应用程序。例如:域名服务,网络管理、视频点播和网络会议等。

 在TCP/IP模型中,上层功能的实现要依赖下层提供的服务,如在底层是以太网的TCP/IP网络体系中,IP分组的传送要封装在以太网帧中,而TCP/UDP包的传送又是封装在IP分组的data中实现的。发送信息的时候,信息经过一层协议层就加一层。。。接收信息时经过一层就剥一层。。。。。
 可以想象,整个的数据包就像一个洋葱,一层一层的外面没有用的协议层包着中间的有用的数据。
这里写图片描述

嵌入式Linux中TCP/IP网络结构

这里写图片描述

这里写图片描述
 在Linux操作系统中,socket属于文件系统的一部分,网络通信可以被看作是对文件的读取。这就使得用户对网络的控制像对文件的控制一样方便。
###套接字接口

 网络的socket数据传输是一种特殊的I/O,socket也是一种文件描述符,它也有类似对文件操作的函数调用,如完成打开、读/写等操作。
 在TCP/IP协议地址族中,按照提供服务的层次关系,套接字有BSD和INET之分。

  • BSD套接字接口
  • 套接字接口(又简称套接口)是为了方便开发人员进行TCP/IP程序开发,而为TCP/IP协议所开发的一组应用程序接口。由于它最早应用于伯克利大学的BSD UNIX中,所以人们又把它称为BSD socket(简称BSD)。
  • Linux BSD套接字支持下列套接字类型:
    • Stream (掌握)
      • Stream(流)套接字提供可靠的双工顺序数据流,能保证传输过程中数据不丢失,不被弄混和复制。Internet地址中的TCP协议支持Stream套接字。
    • Datagram (掌握)
      • Datagram (数据报)套接字提供双工数据传输,但这与Stream套接字不同,它是不可靠的,不保证信息的到达。
    • Raw
      • 利用Raw套接字可以直接处理下层协议(所以叫Raw(生的、没熟的))
  • Socket编程基础
    • 客户机/服务器模式
      • 在网络上大部分的通信都是在客户机/服务器模式下进行的,利用socket实现通信也不例外。客户机/服务器模式中,将请求服务器的一方称为客户端,而将提供服务的一方称为服务端。
    • socket编程相关数据结构
    • 套接口描述符
    • 一个套接口描述符只是一个整型的数值,它的定义为intsockfd。
    • sockaddr数据结构
      • sockaddr数据结构中保存着套接口的地址信息,它的定义为:

        struct sockaddr
        {
        unsigned short sa_family;//地址族,定义为AF_XXXX
        char sa_data[14];//14字节的协议地址
        }
      • sa_family中可以是其他的很多值,但一般把它赋值为“AF_INET”
      • sa_data则包括一个目的地址和一个端口地址
    • sockaddr_in数据结构
      • sockaddr_in 数据结构的定义为:

        struct sockaddr_in
        {
        short int sin_family;//地址族
        unsigned short int sin_port;//端口号
        struct in_addr sin_addr;//IP地址
        unsigned char sin_zero[8];//填零用来保持与struct sockaddr 同样大小
        }

        sockaddr和sockaddr_in两个数据类型是等效的,可以相互转换,通常使用sockaddr_in更为方便。

网络字节顺序

 因为每一个机器内部对变量的字节存储顺序不同(有的系统高位在前、低位在后,而有的系统是低位在前,高位在后),而网络传输的数据大家是一定要统一顺序的。

  • htons():表示“Host to Network Short”,把主机地址字节顺序转向网络字节顺序(对短型数据操作)。
  • htonl():表示“Host to Network Long”,把主机地址字节顺序转向网络字节顺序(对长型数据操作)。
  • ntohs:表示“Network to Host Short”,把网络字节顺序转向主机地址字节顺序(对短型数据操作)。
  • ntohl:表示“Network to Host Long”,把网络字节顺序转向主机地址字节顺序(对长型数据操作)。
已标记关键词 清除标记
相关推荐
<p> 这是一门linux下c++通讯架构实战课程,针对c/c++语言已经掌握的很熟并希望进一步深造以将来用c++在linux下从事网络通讯领域/网络服务器的开发和架构工作。<br /> <br /> 这门课程学习难度颇高但也有着极其优渥的薪水(最少30K月薪,最高可达60-80K月薪),这门课程,会先从nginx源码的分析和讲解开始,逐步开始书写属于自己的高性能服务器框架代码,完善个人代码库,这些,将会是您日后能取得高薪的重要筹码。 </p> <p> <br /> </p> <p> <span style="color:#E53333;">本课程原计划带着大家逐行写代码,但因为代码实在过于复杂和精细,带着写代码可能会造成每节课至少要4~5小时的超长时间,所以老师会在课前先写好代码,主要的时间花费在逐行讲解这些代码上,这一点望同学们周知。如果你觉得非要老师领着写代码才行的话,老师会觉得你当前可能学习本门课程会比较吃力,请不要购买本课程,以免听不懂课程并给老师差评,差评也会非常影响老师课程的销售并造成其他同学的误解。</span> </p> <p> <br /> </p> <p> 这门课程要求您具备下面的技能:<br /> (1)对c/c++语言掌握的非常熟练,语言本身已经不是继续学习的障碍,并不要求您一定熟悉网络或者linux;<br /> (2)对网络通讯架构领域有兴趣、勇于挑战这个高难度的开发领域并期望用大量的付出换取高薪;<br /> <br /> 在这门课程中,实现了一个完整的项目,其中包括通讯框架和业务逻辑框架,浓缩总结起来包括如下几点:<br /> (1)项目本身是一个极完整的多线程高并发的服务器程序;<br /> (2)按照包头包体格式正确的接收客户端发送过来的数据包, 完美解决收包时的数据粘包问题;<br /> (3)根据收到的包的不同来执行不同的业务处理逻辑;<br /> (4)把业务处理产生的结果数据包正确返回给客户端;<br /> <br /> 本项目用到的主要开发技术和特色包括:<br /> (1)epoll高并发通讯技术,用到的触发模式是epoll中的水平触发模式【LT】;<br /> (2)自己写了一套线程池来处理业务逻辑,调用适当的业务逻辑处理函数处理业务并返回给客户端处理结果;<br /> (3)线程之间的同步技术包括互斥量,信号量等等;<br /> (4)连接池中连接的延迟回收技术,这是整个项目中的精华技术,极大程度上消除诸多导致服务器程序工作不稳定的因素;<br /> (5)专门处理数据发送的一整套数据发送逻辑以及对应的发送线程;<br /> (6)其他次要技术,包括信号、日志打印、fork()子进程、守护进程等等; </p> <div> <br /> </div>
<p> <span> </span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span class="ql-author-24357476"><span style="font-size:14px;"> </span></span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> 人工智能、物联网、大数据时代,Linux正有着一统天下的趋势,几乎每个程序员岗位,都要求掌握Linux。本课程零基础也能轻松入门。 </p> <p class="ql-long-24357476"> <br /> </p> <p class="ql-long-24357476"> 本课程以简洁易懂的语言手把手教你系统掌握日常所需的Linux知识,每个知识点都会配合案例实战让你融汇贯通。课程通俗易懂,简洁流畅,适合0基础以及对Linux掌握不熟练的人学习; </p> <p> <span></span> </p> <p> <span style="color:#FF9900;"><span><span> </span></span></span> </p> <p class="ql-long-24357476"> <span style="background-color:#FFFFFF;color:#E53333;">【限时福利】</span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span class="ql-author-24357476">1)购课后按提示添加小助手,进答疑群,还可获得价值300元的编程大礼包!</span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span class="ql-author-24357476"><span>2)本月购买此套餐加入老师答疑交流群,可参加老师的免费分享活动,学习最新技术项目经验。</span><br /> </span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span class="ql-author-24357476">---------------------------------------------------------------</span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span class="ql-author-24357476" style="color:#E53333;">99元=掌握Linux必修知识+社群答疑+讲师社群分享会+700元编程礼包。</span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span class="ql-author-24357476" style="color:#E53333;"><br /> </span> </p> <p style="font-size:11pt;color:#494949;"> <span> <img alt="" src="https://img-bss.csdn.net/202002140604337221.png" /></span> </p>
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页