• 计算机网络复习总结6


    1.52 请介绍socket通信的具体步骤。

    sockets(套接字)编程有三种:流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAW);基于TCP的socket编程是采用的流式套接字。

    1. 服务器端编程的步骤

      (1)加载套接字库,创建套接字(WSAStartup()/socket());

      (2)绑定套接字到一个IP地址和一个端口上(bind());

      (3)将套接字设置为监听模式等待连接请求(listen());

      (4)请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept());

      (5)用返回的套接字和客户端进行通信(send()/recv());

      (6)返回,等待另一连接请求;

      (7)关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。

    2. 客户端编程的步骤:

      (1)加载套接字库,创建套接字(WSAStartup()/socket());

      (2)向服务器发出连接请求(connect());

      (3)和服务器端进行通信(send()/recv());

      (4)关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。

    //代码实例(服务器) 
    #include  
    #include  
    void main() {  
    WORD wVersionRequested;  
    WSADATA wsaData;  
    int err;     
    wVersionRequested = MAKEWORD( 1, 1 );     
    err = WSAStartup( wVersionRequested, &wsaData );  
    if ( err != 0 ) {   return;  }     
    if ( LOBYTE( wsaData.wVersion ) != 1 ||  HIBYTE( wsaData.wVersion ) != 1 ) {   WSACleanup( );   
    return;  }  
    SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);    
    SOCKADDR_IN addrSrv;  
    addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);  
    addrSrv.sin_family=AF_INET;  
    addrSrv.sin_port=htons(6000);     
    bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));    
    listen(sockSrv,5);    
    SOCKADDR_IN addrClient;  
    int len=sizeof(SOCKADDR);  
    while(1)  {   
    SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);   
    char sendBuf[50];   
    sprintf(sendBuf,"Welcome %s to here!",inet_ntoa(addrClient.sin_addr));   send(sockConn,sendBuf,strlen(sendBuf)+1,0);   
    char recvBuf[50];   
    recv(sockConn,recvBuf,50,0);   
    printf("%s\n",recvBuf);   
    closesocket(sockConn);  }   }
    //代码实例(客户端) 
    #include  
    #include  
    void main() {  
    WORD wVersionRequested;  
    WSADATA wsaData;  
    int err;    
    wVersionRequested = MAKEWORD( 1, 1 );    
    err = WSAStartup( wVersionRequested, &wsaData );  
    if ( err != 0 ) {   return;  }    
    if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ) {   
    WSACleanup( );   
    return;  
    }  
    SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);    
    SOCKADDR_IN addrSrv;  
    addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");  
    addrSrv.sin_family=AF_INET;  
    addrSrv.sin_port=htons(6000);  
    connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));  
    send(sockClient,"hello",strlen("hello")+1,0);  
    char recvBuf[50];  
    recv(sockClient,recvBuf,50,0);  
    printf("%s\n",recvBuf);    
    closesocket(sockClient);  
    WSACleanup();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56

    1.53 服务端怎么提高处理socket连接的性能?

    提高处理socket连接的性能,请遵循以下技巧:

    1. 最小化报文传输的延时。
    2. 最小化系统调用的负载。
    3. 为 Bandwidth Delay Product 调节 TCP 窗口。
    4. 动态优化 GNU/Linux TCP/IP 栈。

    1. 最小化报文传输的延时。

      在通过 TCP socket 进行通信时,数据都拆分成了数据块,这样它们就可以封装到给定连接的 TCP payload(指 TCP 数据包中的有效负荷)中了。TCP payload 的大小取决于几个因素(例如最大报文长度和路径),但是这些因素在连接发起时都是已知的。为了达到最好的性能,我们的目标是使用尽可能多的可用数据来填充每个报文。当没有足够的数据来填充 payload 时(也称为最大报文段长度(maximum segment size)或 MSS),TCP 就会采用 Nagle 算法自动将一些小的缓冲区连接到一个报文段中。这样可以通过最小化所发送的报文的数量来提高应用程序的效率,并减轻整体的网络拥塞问题。

    2. 最小化系统调用的负载。

      任何时候通过一个 socket 来读写数据时,都是在使用一个系统调用(system call)。这个调用(例如 read 或 write)跨越了用户空间应用程序与内核的边界。另外,在进入内核之前,该调用会通过 C 库来进入内核中的一个通用函数(system_call())。从 system_call()中,这个调用会进入文件系统层,内核会在这儿确定正在处理的是哪种类型的设备。最后,调用会进入 socket 层,数据就是在这里进行读取或进行排队从而通过 socket 进行传输的(这涉及数据的副本)。

      这个过程说明系统调用不仅仅是在应用程序和内核中进行操作的,而且还要经过应用程序和内核中的很多层次。这个过程耗费的资源很高,因此调用次数越多,通过这个调用链进行的工作所需要的时间就越长,应用程序的性能也就越低。由于我们无法避免这些系统调用,因此唯一的选择是最小化使用这些调用的次数

    3. 为 Bandwidth Delay Product 调节 TCP 窗口。

      TCP 的性能取决于几个方面的因素。两个最重要的因素是链接带宽(link bandwidth)(报文在网络上传输的速率)和 往返时间(round-trip time) 或 RTT(发送报文与接收到另一端的响应之间的延时)。这两个值确定了称为 Bandwidth Delay Product(BDP)的内容。

      给定链接带宽和 RTT 之后,就可以计算出 BDP 的值了,不过这代表什么意义呢?BDP 给出了一种简单的方法来计算理论上最优的 TCP socket 缓冲区大小(其中保存了排队等待传输和等待应用程序接收的数据)。如果缓冲区太小,那么 TCP 窗口就不能完全打开,这会对性能造成限制。如果缓冲区太大,那么宝贵的内存资源就会造成浪费。如果设置的缓冲区大小正好合适,那么就可以完全利用可用的带宽。

    4. 动态优化 GNU/Linux TCP/IP 栈。

      标准的 GNU/Linux 发行版试图对各种部署情况都进行优化。这意味着标准的发行版可能并没有对现有的环境进行特殊的优化。GNU/Linux 提供了很多可调节的内核参数,可以使用这些参数为自己的操作系统进行动态配置。

    1.54 介绍一下流量控制和拥塞控制。

    1. 流量控制和拥塞控制定义

      流量控制

      如果发送方把数据发送得过快,接收方可能会来不及接收,这就会造成数据的丢失。流量控制就是让发送方慢点,要让接收方来得及接收。

      拥塞控制

      拥塞控制就是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。

    2. 流量控制和拥塞控制区别

      流量控制是端到端的控制,例如A通过网络给B发数据,A发送的太快导致B没法接收(B缓冲窗口过小或者处理过慢),这时候的控制就是流量控制,原理是通过滑动窗口的大小改变来实现。

      拥塞控制是A与B之间的网络发生堵塞导致传输过慢或者丢包,来不及传输。防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不至于过载。拥塞控制是一个全局性的过程,涉及到所有的主机、路由器,以及与降低网络性能有关的所有因素。

    3. TCP流量控制解决方法

      TCP的流量控制是利用滑动窗口机制实现的,接收方在返回的数据中会包含自己的接收窗口的大小,以控制发送方的数据发送。

    4. TCP拥塞控制解决方法

      TCP拥塞控制的四种算法:慢开始、拥塞避免、快重传、快恢复。

      (1)慢开始算法:当主机开始发送数据时,并不清楚网络的负载情况,所以由小到大逐渐增大拥塞窗口,每经过一个传输轮次没有出现超时就将拥塞窗口加倍。同时还需要设置一个慢开始门限,在拥塞窗口小于慢开始门限时使用慢开始算法,大于慢开始门限时,使用拥塞避免算法;

      (2)拥塞避免算法:在拥塞窗口大于慢开始门限时,让拥塞窗口按线性规律缓慢增长。即每经过一个传输轮次,拥塞窗口增大一个MSS最大报文段尺寸。(拥塞避免并非完全能够避免拥塞,只是使网络比较不容易出现拥塞)

      (3)快重传算法:使发送方今早知道发生了个别报文段丢失,并不是出现网络拥塞。

      要求接受不要登塞自己发送数据时才进行捎带确认,而是立即发送确认,即使收到了失序的报文段也要立即发出对已收到报文段的重复确认。而发送方一旦受到三个连续的重读确认,就将相应的报文段立即重传。

      (4)快恢复算法:发送方知道只有个别报文段丢失而不是网络拥塞时,不启动慢开始算法,而是执行快恢复算法,将慢开始门限和拥塞窗口值调整为当前窗口的一半,开始执行拥塞避免算法

    1.55 对路由协议是否有所了解?

    1. 路由协议定义

      路由协议(英语:Routing protocol)是一种指定数据包转送方式的网上协议。Internet网络的主要节点设备是路由器,路由器通过路由表来转发接收到的数据。转发策略可以是人工指定的(通过静态路由、策略路由等方法)。在具有较小规模的网络中,人工指定转发策略没有任何问题。但是在具有较大规模的网络中(如跨国企业网络、ISP网络),如果通过人工指定转发策略,将会给网络管理员带来巨大的工作量,并且在管理、维护路由表上也变得十分困难。为了解决这个问题,动态路由协议应运而生。动态路由协议可以让路由器自动学习到其他路由器的网络,并且网络拓扑发生改变后自动更新路由表。网络管理员只需要配置动态路由协议即可,相比人工指定转发策略,工作量大大减少。

    2. 原理

      路由协议通过在路由器之间共享路由信息来支持可路由协议。路由信息在相邻路由器之间传递,确保所有路由器知道到其它路由器的路径。总之,路由协议创建了路由表,描述了网络拓扑结构;路由协议与路由器,执行路由选择和数据包转发功能。

    3. 路由器的作用以及常见的路由协议

      路由协议主要运行于路由器上,路由协议是用来确定到达路径的,起到一个地图导航,负责找路的作用。它工作在网络层。它包括RIP,IGRP(Cisco私有协议),EIGRP(Cisco私有协议),OSPF,IS-IS,BGP。以下为这六个协议的详细说明:

      (1)RIP(路由信息协议)

      RIP很早就被用在Internet上,是最简单的路由协议。它是“路由信息协议(Route Information Protocol)”的简写,主要传递路由信息,通过每隔30秒广播一次路由表,维护相邻路由器的位置关系,同时根据收到的路由表信息计算自己的路由表信息。RIP是一个距离矢量路由协议,最大跳数为15跳,超过15跳的网络则认为目标网络不可达。此协议通常用在网络架构较为简单的小型网络环境。分为RIPv1和RIPv2两个版本,后者支持VLSM技术以及一系列技术上的改进。RIP的收敛速度较慢。

      (2)IGRP(内部网关路由协议)

      IGRP协议是“内部网关路由协议(Interior Gateway Routing Protocol)”的缩写,由Cisco于二十世纪八十年代独立开发,属于Cisco私有协议。IGRP和RIP一样,同属距离矢量路由协议,因此在诸多方面有着相似点,如IGRP也是周期性的广播路由表,也存在最大跳数(默认为100跳,达到或超过100跳则认为目标网络不可达)。IGRP最大的特点是使用了混合度量值,同时考虑了链路的带宽、延迟、负载、MTU、可靠性5个方面来计算路由的度量值,而不像其他IGP协议单纯的考虑某一个方面来计算度量值。IGRP已经被Cisco独立开发的EIGRP协议所取代,版本号为12.3及其以上的Cisco IOS(Internetwork Operating System)已经不支持该协议,已经罕有运行IGRP协议的网络。

      (3)EIGRP(增强型内部网关路由协议)

      由于IGRP协议的种种缺陷以及不足,Cisco开发了EIGRP协议(增强型内部网关路由协议)来取代IGRP协议。EIGRP属于高级距离矢量路由协议(又称混合型路由协议),继承了IGRP的混合度量值,最大特点在于引入了非等价负载均衡技术,并拥有极快的收敛速度。EIGRP协议在Cisco设备网络环境中广泛部署。

      (4)OSPF(开放式最短路径优先)

      OSPF协议是“开放式最短路径优先(Open Shortest Path First)”的缩写,属于链路状态路由协议。OSPF提出了“区域(area)”的概念,每个区域中所有路由器维护着一个相同的链路状态数据库(LSDB)。区域又分为骨干区域(骨干区域的编号必须为0)和非骨干区域(非0编号区域),如果一个运行OSPF的网络只存在单一区域,则该区域可以是骨干区域或者非骨干区域。如果该网络存在多个区域,那么必须存在骨干区域,并且所有非骨干区域必须和骨干区域直接相连。OSPF利用所维护的链路状态数据库,通过最短路径优先算法(SPF算法)计算得到路由表。OSPF的收敛速度较快。由于其特有的开放性以及良好的扩展性,OSPF协议在各种网络中广泛部署。

      (5)IS-IS(中间系统到中间系统)

      IS-IS协议是Intermediate system to intermediate system(中间系统到中间系统)的缩写,属于链路状态路由协议。标准IS-IS协议是由国际标准化组织制定的ISO/IEC 10589:2002所定义的,标准IS-IS不适合用于IP网络,因此IETF制定了适用于IP网络的集成化IS-IS协议(Integrated IS-IS)。和OSPF相同,IS-IS也使用了“区域”的概念,同样也维护着一份链路状态数据库,通过最短生成树算法(SPF)计算出最佳路径。IS-IS的收敛速度较快。集成化IS-IS协议是ISP骨干网上最常用的IGP协议。

      (6)BGP(边界网关协议)

      为了维护各个ISP的独立利益,标准化组织制定了ISP间的路由协议BGP。BGP是“边界网关协议(Border Gateway Protocol)”的缩写,处理各ISP之间的路由传递。但是BGP运行在相对核心的地位,需要用户对网络的结构有相当的了解,否则可能会造成较大损失。

    1.56 直播可能需要使用到什么样的协议?

    视频直播有多种协议,使用rtmp协议的就是rtmp直播。直播流就是视频流,即传递的视频数据。常见的协议有RTMP、RTSP、HTTP协议,这三个协议都属于互联网TCP/IP五层体系结构中应用层的协议。理论上这三种都可以用来做视频直播或点播。但通常来说,直播一般用RTMP、RTSP,而点播用HTTP

    1. RTMP协议

      (1)是流媒体协议;

      (2)RTMP协议是Adobe的私有协议,未完全公开;

      (3)RTMP协议一般传输的是flv,f4v格式流;

      (4)RTMP一般在TCP1个通道上传输命令和数据。

    2. RTSP协议

      (1)是流媒体协议;

      (2)RTSP协议是共有协议,并有专门机构做维护;

      (3)RTSP协议一般传输的是ts、mp4格式的流;

      (4)RTSP传输一般需要2-3个通道,命令和数据通道分离。

    3. HTTP协议

      (1)不是是流媒体协议;

      (2)HTTP协议是共有协议,并有专门机构做维护;

      (3)HTTP协议没有特定的传输流;

      (4)HTTP传输一般需要2-3个通道,命令和数据通道分离。

    一个完整的视频直播过程,包括采集、处理、编码、封装、推流、传输、转码、分发、解码、播放等

    1.57 谈谈单工、双工、半双工的通信方式。

    1. 单工:数据传输只支持数据在一个方向上传输;在同一时间只有一方能接受或发送信息,不能实现双向通信。举例:电视,广播。
    2. 半双工:半双工数据传输允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;在同一时间只可以有一方接受或发送信息,可以实现双向通信。举例:对讲机。
    3. 双工:全双工数据通信允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力;在同一时间可以同时接受和发送信息,实现双向通信。举例:电话通信。

    扩展资料:
    单工、半双工和全双工是电信计算机网络中的三种通信信道。这些通信信道可以提供信息传达的途径。通信信道可以是物理传输介质或通过多路复用介质的逻辑连接。物理传输介质是指能够传播能量波的材料物质,例如数据通信中的导线。并且逻辑连接通常指电路交换连接或分组模式虚拟电路连接,例如无线电信通道。由于通信信道的帮助,信息可以无障碍地传输。

    单工模式一般用在只向一个方向传输数据的场合。例如计算机与打印机之间的通信是单工模式,因为只有计算机向打印机传输数据,而没有相反方向的数据传输。还有在某些通信信道中,如单工无线发送等。

    ————内容源于网络

  • 相关阅读:
    pytorch深度学习实战lesson30
    Yakit工具篇:端口探测和指纹扫描的配置和使用
    Ansible 快速入门
    HarmonyOS—UI开发性能提升的推荐方法
    基于SSM的家教系统的设计与实现毕业设计-附源码221752
    Oracle根据时间查询
    队列(C语言实现)
    网络工程师---第十四天
    深入理解java虚拟机-1.自动内存管理
    Springboot-自定义Spring Boot Starter并推送到远端公服
  • 原文地址:https://blog.csdn.net/weixin_45699237/article/details/126132670