首页 > 系统相关 >Linux高并发网络编程开发——网络编程基础-socket

Linux高并发网络编程开发——网络编程基础-socket

时间:2022-11-08 20:06:27浏览次数:66  
标签:协议 socket IP 编程 网络 TCP 地址 主机 数据

在学习Linux高并发网络编程开发总结了笔记,并分享出来。

10-Linux系统编程-第10天(网络编程基础-socket)

目录:一、Linux网络编程阶段二、网络基础1、网络开发两种设计模式2、协议的概念3、网络模型分层—两种4、以太网帧协议5、IP协议6、UDP协议7、TCP协议8、数据发送和接收9、TCP、UDP传输层协议二、socket套接字1、什么是套接字2、套接字的概念3、套接字内存模型4、网络字节序5、IP地址转换函数6、sockaddr数据结构7、网络套接字函数8、C/S模型—TCP--面向连接的可靠数据包传递9、TCP通信流程

一、Linux网络编程阶段



Linux高并发网络编程开发——网络编程基础-socket_linux



二、网络基础

1、网络开发两种设计模式

》C/S -client/server
    优点: 1. 协议选用灵活  2. 可以缓存数据
    缺点: 1. 对用户安全构成威胁  2. 开发工作量大, 调试困难

》B/S -browser/server
    优点: 跨平台
    缺点:  只能使用http


详细说明:

》网络应用程序设计模式

》C/S模式

传统的网络应用设计模式,客户机(client)/服务器(server)模式。需要在通讯两端各自部署客户机和服务器来完成数据通信。

》B/S模式

浏览器()/服务器(server)模式。只需在一端部署服务器,而另外一端使用每台PC都默认配置的浏览器即可完成数据的传输。

》优缺点

对于C/S模式来说,其优点明显。客户端位于目标主机上可以保证性能,将数据缓存至客户端本地,从而提高数据传输效率。且,一般来说客户端和服务器程序由一个开发团队创作,所以他们之间所采用的协议相对灵活。可以在标准协议的基础上根据需求裁剪及定制。例如,腾讯公司所采用的通信协议,即为ftp协议的修改剪裁版。

因此,传统的网络应用程序及较大型的网络应用程序都首选C/S模式进行开发。如,知名的网络游戏魔兽世界。3D画面,数据量庞大,使用C/S模式可以提前在本地进行大量数据的缓存处理,从而提高观感。

C/S模式的缺点也较突出。由于客户端和服务器都需要有一个开发团队来完成开发。工作量将成倍提升,开发周期较长。另外,从用户角度出发,需要将客户端安插至用户主机上,对用户主机的安全性构成威胁。这也是很多用户不愿使用C/S模式应用程序的重要原因。

B/S模式相比C/S模式而言,由于它没有独立的客户端,使用标准浏览器作为客户端,其工作开发量较小。只需开发服务器端即可。另外由于其采用浏览器显示数据,因此移植性非常好,不受平台限制。如早期的偷菜游戏,在各个平台上都可以完美运行。

B/S模式的缺点也较明显。由于使用第三方浏览器,因此网络应用支持受限。另外,没有客户端放到对方主机上,缓存数据不尽如人意,从而传输数据量受到限制。应用的观感大打折扣。第三,必须与浏览器一样,采用标准http协议进行通信,协议选择不灵活

因此在开发过程中,模式的选择由上述各自的特点决定。根据实际需求选择应用程序设计模式。


2、协议的概念

》规则: 数据传输和数据解释的规则

》原始协议  ------>(改进、完善)------> 标准协议

》典型协议:TCP/UDP  HTTP  FTP  IP  ARP



Linux高并发网络编程开发——网络编程基础-socket_以太网_02


》什么是协议?

从应用的角度出发,协议可理解为“规则”,是数据传输和数据的解释的规则。

假设,A、B双方欲传输文件。规定:

第一次,传输文件名,接收方接收到文件名,应答OK给传输方;

第二次,发送文件的尺寸,接收方接收到该数据再次应答一个OK;

第三次,传输文件内容。同样,接收方接收数据完成后应答OK表示文件内容接收成功。

由此,无论A、B之间传递何种文件,都是通过三次数据传输来完成。A、B之间形成了一个最简单的数据传输规则。双方都按此规则发送、接收数据。A、B之间达成的这个相互遵守的规则即为协议。

这种仅在A、B之间被遵守的协议称之为原始协议。当此协议被更多的人采用,不断的增加、改进、维护、完善。最终形成一个稳定的、完整的文件传输协议,被广泛应用于各种文件传输过程中。该协议就成为一个标准协议。最早的ftp协议就是由此衍生而来。

TCP协议注重数据的传输。http协议着重于数据的解释。


》典型协议

传输层 常见协议有TCP/UDP协议。

应用层 常见的协议有HTTP协议,FTP协议。

网络层 常见协议有IP协议、ICMP协议、IGMP协议。

网络接口层 常见协议有ARP协议、RARP协议。

TCP​​传输控制协议​​​(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的​​传输层​​通信协议。

UDP用户数据报协议(User Datagram Protocol)是​​OSI​​​参考模型中一种无连接的​​传输层​​协议,提供面向事务的简单不可靠信息传送服务。

HTTP​​超文本传输协议​​​(Hyper Text Transfer Protocol)是​​互联网​​​上应用最为广泛的一种​​网络协议​​。

FTP文件传输协议(File Transfer Protocol)

IP协议是​​因特网​​互联协议(Internet Protocol)

ICMP协议是Internet控制​​报文​​​协议(Internet Control Message Protocol)它是​​TCP/IP协议族​​​的一个子协议,用于在IP​​主机​​​、​​路由​​器之间传递控制消息。

IGMP协议是 Internet 组管理协议(Internet Group Management Protocol),是因特网协议家族中的一个组播协议。该协议运行在主机和组播路由器之间。

​ARP​​​协议是正向​​地址解析协议​​​(Address Resolution Protocol),通过已知的IP,寻找对应主机的​​MAC地址​​。

​RARP​​是反向地址转换协议,通过MAC地址确定IP地址。


3、网络模型分层—两种

》7层模型 - OSI:    物 -- 双绞线, 光纤    数 -- 数据的传输和错误检测
    网 -- 为数据包选择路由
    传 -- 提供端对端的接口 tcp/udp    会 -- 解除或建立与别的节点的联系    表 -- 数据格式化,代码转换,数据加密    应 -- 文件传输,电子邮件,文件服务,虚拟终端

》4层模型 - TCP/IP: 网络接口层  网络层  传输层  应用层



Linux高并发网络编程开发——网络编程基础-socket_java_03





Linux高并发网络编程开发——网络编程基础-socket_java_04



详细说明:

》OSI七层模型

1.    物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后再转化为1、0,也就是我们常说的数模转换与模数转换)。这一层的数据叫做比特。
2.    数据链路层:定义了如何让格式化数据以帧为单位进行传输,以及如何让控制对物理介质的访问。这一层通常还提供错误检测和纠正,以确保数据的可靠传输。如:串口通信中使用到的115200、8、N、1
3.    网络层:在位于不同地理位置的网络中的两个主机系统之间提供连接和路径选择。Internet的发展使得从世界各站点访问信息的用户数大大增加,而网络层正是管理这种连接的层。
4.    传输层:定义了一些传输数据的协议和端口号(WWW端口80等),如:TCP(传输控制协议,传输效率低,可靠性强,用于传输可靠性要求高,数据量大的数据),UDP(用户数据报协议,与TCP特性恰恰相反,用于传输可靠性要求不高,数据量小的数据,如QQ聊天数据就是通过这种方式传输的)。 主要是将从下层接收的数据进行分段和传输,到达目的地址后再进行重组。常常把这一层数据叫做段。
5.    会话层:通过传输层(端口号:传输端口与接收端口)建立数据传输的通路。主要在你的系统之间发起会话或者接受会话请求(设备之间需要互相认识可以是IP也可以是MAC或者是主机名)。
6.    表示层:可确保一个系统的应用层所发送的信息可以被另一个系统的应用层读取。例如,PC程序与另一台计算机进行通信,其中一台计算机使用扩展二一十进制交换码(EBCDIC),而另一台则使用美国信息交换标准码(ASCII)来表示相同的字符。如有必要,表示层会通过使用一种通格式来实现多种数据格式之间的转换。
7.    应用层:是最靠近用户的OSI层。这一层为用户的应用程序(例如电子邮件、文件传输和终端仿真)提供网络服务。

》TCP/IP四层模型

TCP/IP网络协议栈分为应用层(Application)、传输层(Transport)、网络层(Network)和链路层(Link)四层。

一般在应用开发过程中,讨论最多的是TCP/IP模型。


4、以太网帧协议



Linux高并发网络编程开发——网络编程基础-socket_linux_05



(Linux查看mac地址(6字节的16进制):ifconfig;Windows下查看mac地址——ipconfig -all)

其中的源地址和目的地址是指网卡的硬件地址(也叫MAC地址),长度是48位,是在网卡出厂时固化的。可在shell中使用ifconfig命令查看,“HWaddr 00:15:F2:14:9E:3F”部分就是硬件地址。协议字段有三种值,分别对应IP、ARP、RARP。帧尾是CRC校验码。

以太网帧中的数据长度规定最小46字节,最大1500字节,ARP和RARP数据包的长度不够46字节,要在后面补填充位。最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU,如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU,则需要对数据包进行分片(fragmentation)。ifconfig命令输出中也有“MTU:1500”。注意,MTU这个概念指数据帧中有效载荷的最大长度,不包括帧头长度。

》ARP数据报格式:

在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址,而数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃。因此在通讯前必须获得目的主机的硬件地址。ARP协议就起到这个作用。源主机发出ARP请求,询问“IP地址是192.168.0.1的主机的硬件地址是多少”,并将这个请求广播到本地网段(以太网帧首部的硬件地址填FF:FF:FF:FF:FF:FF表示广播),目的主机接收到广播的ARP请求,发现其中的IP地址与本机相符,则发送一个ARP应答数据包给源主机,将自己的硬件地址填写在应答包中。

每台主机都维护一个ARP缓存表,可以用arp -a命令查看。缓存表中的表项有过期时间(一般为20分钟),如果20分钟内没有再次使用某个表项,则该表项失效,下次还要发ARP请求来获得目的主机的硬件地址。想一想,为什么表项要有过期时间而不是一直有效?

源MAC地址、目的MAC地址在以太网首部和ARP请求中各出现一次,对于链路层为以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的。硬件类型指链路层网络类型,1为以太网,协议类型指要转换的地址类型,0x0800为IP地址,后面两个地址长度对于以太网地址和IP地址分别为6和4(字节),op字段为1表示ARP请求,op字段为2表示ARP应答。

》arp协议 举例



Linux高并发网络编程开发——网络编程基础-socket_编程语言_06



5、IP协议



Linux高并发网络编程开发——网络编程基础-socket_java_07





Linux高并发网络编程开发——网络编程基础-socket_编程语言_08



IP数据报的首部长度和数据长度都是可变长的,但总是4字节的整数倍。对于IPv4,4位版本字段是4。4位首部长度的数值是以4字节为单位的,最小值为5,也就是说首部长度最小是4x5=20字节,也就是不带任何选项的IP首部,4位能表示的最大值是15,也就是说首部长度最大是60字节。8位TOS字段有3个位用来指定IP数据报的优先级(目前已经废弃不用),还有4个位表示可选的服务类型(最小延迟、最大吞吐量、最大可靠性、最小成本),还有一个位总是0。总长度是整个数据报(包括IP首部和IP层payload)的字节数。每传一个IP数据报,16位的标识加1,可用于分片和重新组装数据报。3位标志和13位片偏移用于分片。TTL(Time to live)是这样用的:源主机为数据包设定一个生存时间,比如64,每过一个路由器就把该值减1,如果减到0就表示路由已经太长了仍然找不到目的主机的网络,就丢弃该包,因此这个生存时间的单位不是秒,而是跳(hop)。协议字段指示上层协议是TCP、UDP、ICMP还是IGMP。然后是校验和,只校验IP首部,数据的校验由更高层协议负责。IPv4的IP地址长度为32位。

》中国为什么推ipv6? 



Linux高并发网络编程开发——网络编程基础-socket_java_09



》TTL 经过一个路由器就是一跳,最多2^8=256跳



Linux高并发网络编程开发——网络编程基础-socket_linux_10



6、UDP协议



Linux高并发网络编程开发——网络编程基础-socket_以太网_11





Linux高并发网络编程开发——网络编程基础-socket_编程语言_12



7、TCP协议



Linux高并发网络编程开发——网络编程基础-socket_linux_13



8、数据发送和接收

传输层及其以下的机制由内核提供,应用层由用户进程提供(后面将介绍如何使用socket API编写应用程序),应用程序对通讯数据的含义进行解释,而传输层及其以下处理通讯的细节,将数据从一台计算机通过一定的路径发送到另一台计算机。应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation),如下图所示:



Linux高并发网络编程开发——网络编程基础-socket_以太网_14



不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报(datagram),在链路层叫做帧(frame)。数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,最后将应用层数据交给应用程序处理。

9、TCP、UDP传输层协议



Linux高并发网络编程开发——网络编程基础-socket_网络_15



二、socket套接字

1、什么是套接字

》什么是socket?
    网络通信的函数接口
    封装了传输层协议
        tcp
        udp

举例:浏览器-http
    封装的是tcp

2、套接字的概念

IP地址:
端口号:
IP+Port:

3、套接字内存模型



Linux高并发网络编程开发——网络编程基础-socket_以太网_16



》管道和套接字特别类似(管道只有一块读写,但是套接字一块读,一块写)



Linux高并发网络编程开发——网络编程基础-socket_编程语言_17





Linux高并发网络编程开发——网络编程基础-socket_linux_18



注意:阻塞指的是文件描述符对应的设备文件的性质,而不是read/write函数的性质。

4、网络字节序



Linux高并发网络编程开发——网络编程基础-socket_以太网_19





Linux高并发网络编程开发——网络编程基础-socket_以太网_20



5、IP地址转换函数



Linux高并发网络编程开发——网络编程基础-socket_以太网_21





Linux高并发网络编程开发——网络编程基础-socket_以太网_22



6、sockaddr数据结构



Linux高并发网络编程开发——网络编程基础-socket_java_23



1 struct sockaddr {
2 /* address family, AF_xxx */
3 sa_family_t sa_family;
4 /* 14 bytes of protocol address */
5 char sa_data[14];
6 };
7
8 struct sockaddr_in {
9 __kernel_sa_family_t sin_family; // 地址族协议
10 __be16 sin_port; // 端口
11 struct in_addr sin_addr; // IP地址
12 unsigned char __pad[__SOCK_SIZE__ - sizeof(short int) - sizeof(unsigned short int) - sizeof(struct in_addr)];
13 };
14
15 struct in_addr {
16 __be32 s_addr;
17 };



7、网络套接字函数



Linux高并发网络编程开发——网络编程基础-socket_java_24



8、C/S模型—TCP--面向连接的可靠数据包传递

  服务器端

  客户端

9、TCP通信流程



Linux高并发网络编程开发——网络编程基础-socket_以太网_25



  



Linux高并发网络编程开发——网络编程基础-socket_编程语言_26



在学习Linux高并发网络编程开发总结了笔记,并分享出来。

标签:协议,socket,IP,编程,网络,TCP,地址,主机,数据
From: https://blog.51cto.com/u_15405812/5834766

相关文章

  • Linux系统编程——进程控制
    在学习Linux系统编程总结了笔记,并分享出来。09-linux-day05(进程控制)目录:一、学习目标二、进程1、进程和程序2、单道和多道程序设计3、进程的状态转化4、MMU的作用5、PCB......
  • Linux系统编程——信号
    在学习Linux系统编程总结了笔记,并分享出来。09-linux-day07(信号)目录:一、学习目标二、进程通信——信号1、信号的概念回顾2、阻塞信号集、未决信号集、信号产生3、raise和a......
  • Linux系统编程——进程间通信
    在学习Linux系统编程总结了笔记,并分享出来。09-linux-day06(进程间通信)目录:一、学习目标二、进程通信——管道1、管道的概念2、管道通信举例3、父子进程实现ps、grep命令4......
  • Linux高并发网络编程开发——tcp三次握手-并发
    在学习Linux高并发网络编程开发总结了笔记,并分享出来。10-Linux系统编程-第11天(tcp三次握手-并发)  一、学习目标1、熟练掌握三次握手建立连接过程2、熟练掌握四次挥手断开......
  • 面向对象编程(四)
    面向对象编程(四)一、面向对象的魔法方法1.魔法方法简介在类中,有一些内置好的特定的方法,方法名是“__xx__”,在进行特定的操作时会被调用,这些方法被称为魔法方法,不需......
  • 18个CodePen上的游戏将教你学习编程
    英文| https://javascript.plainenglish.io/17-exciting-games-on-codepen-you-can-learn-from-about-game-coding-5417d90f2490翻译|web前端开发对我来说,向他人学习编......
  • 14.面向对象编程
    1.初识面向对象想要通过面向对象去实现某个或某些功能时需要2步:定义类,在类中定义方法,在方法中去实现具体的功能。实例化类一个对象,通过对象去调用并执行方法。c......
  • python 检索网络
    importrequests,datetime,re,psutilimportscapy_http.httpashttpfromscapy.allimport*fromlxmlimportetreeimportwarningswarnings.filterwarnings("igno......
  • 5种常见的异步编程的方法
    1、回调函数/*利用回调函数执行异步操作*/getCallBackData(callback){//把函数作为参数传递进去setTimeout(()=>{letdata='thisiscallbackdata';......
  • 利用网络复制安装额外域控制器、利用介质安装额外域控制器、安装RODC额外域控制器
    一、拥有多台域控制器的优势1、分担用户身份验证的负担,改善用户登录的效率2、容错功能:若有域控制器故障,此时仍然可以有其他正常的域控制器来继续提供服务,因此对......