Winsock网络编程笔记(4)----基本的理论知识

     前面的笔记记录了Winsock的入门编程,领略了Winsock编程的乐趣。。但这并不能算是掌握了Winsock,加深理论知识的理解才会让后续学习更加得心应手。。因此,这篇笔记将记录一些有关Winsock的基本理论知识,由于是一篇笔记,鉴于看书速度有限,主要内容会慢慢地填入。。错误在所难免的,希望看客更正。。(*^__^*) 嘻嘻……

<一>:消息和流(摘录自网上)

  1. 保护消息边界,就是指传输协议把数据当作一条独立的消息在网上传输,接收端只能接收独立的消息.也就是说存在保护消息边界,接收端一次只能接收发送端发出的一个数据包.

  2. 而面向流则是指无保护消息保护边界的,如果发送端连续发送数据, 接收端有可能在一次接收动作中,会接收两个或者更多的数据包.

  3. 我们举个例子来说,例如,我们连续发送三个数据包,大小分别是2k, 4k , 8k,这三个数据包,都已经到达了接收端的网络堆栈中

  4. 如果使用UDP协议,不管我们使用多大的接收缓冲区去接收数据,我们必须有三次接收动作,才能够把所有的数据包接收完.

  5. 而使用TCP协议,我们只要把接收的缓冲区大小设置在14k以上,我们就能够一次把所有的数据包接收下来,只需要有一次接收动作.

  6. 这就是因为UDP协议的保护消息边界使得每一个消息都是独立的.而流传输,却把数据当作一串数据流,他不认为数据是一个一个的消息.

  7. 所以有很多人在使用tcp协议通讯的时候,并不清楚tcp是基于流的传输,当连续发送数据的时候,他们时常会认识tcp会丢包.其实不然,因为当他们使用的缓冲区足够大时,他们有可能会一次接收到两个甚至更多的数据包,而很多人往往会忽视这一点,只解析检查了第一个数据包,而已经接收的其他数据包却被忽略了.

  8. 根据以上所说,可以这样理解,TCP为了保证可靠传输,尽量减少额外开销(每次发包都要验证),因此采用了流式传输,面向流的传输,相对于面向消息的传输,可以减少发送包的数量。从而减少了额外开销。但是,对于数据传输频繁的程序来讲,使用TCP可能会容易粘包。

  9. 当然,对接收端的程序来讲,如果机器负荷很重,也会在接收缓冲里粘包。这样,就需要接收端额外拆包,增加了工作量。因此,这个特别适合的是数据要求可靠传输,但是不需要太频繁传输的场合(两次操作间隔100ms,具体是由TCP等待发送间隔决定的,取决于内核中的socket的写法)

  10. 而UDP,由于面向的是消息传输,它把所有接收到的消息都挂接到缓冲区的接受队列中,因此,它对于数据的提取分离就更加方便,但是,它没有粘包机制,因此,当发送数据量较小的时候,就会发生数据包有效载荷较小的情况,也会增加多次发送的系统发送开销(系统调用,写硬件等)和接收开销。因此,应该最好设置一个比较合适的数据包的包长,来进行UDP数据的发送。(UDP最大载荷为1472,因此最好能每次传输接近这个数的数据量,这特别适合于视频,音频等大块数据的发送,同时,通过减少握手来保证流媒体的实时性)

 <二>:面向连接和无连接

  1. Connection-oriented 面向连接:
         一种网络协议,依赖发送方和接收器之间的显示通信和阻塞以管理双方的数据传输.网络系统需要在两台计算机之间发送数据之前先建立连接的一种特性。面向连接网络类似于电话系统,在开始通信前必须先进行一次呼叫和应答。
    如果一种服务具有下列特征,就认为它是面向连接的:
        1、建立一条虚电路(比如3次握手)
        2、使用排序
        3、使用确认
        4、使用流量控制。流量控制的类型有:缓冲、窗口机制和拥堵避免。
         面向连接的服务就是通信双方在通信时,要事先建立一条通信线路,其过程有建立连接、使用连接和释放连接三个过程。TCP协议就是一种面向连接服务的协议,电话系统是一个面向连接的模式。
    其特点是:
          数据传输过程前必须经过建立连接、维护连接和释放连接的3个过程;在数据传输过程中,各分组不需要携带目的节点的地址。面向连接服务的传输连接类似于一个通信管道,发送者在一端放入数据,接受者从另一端取出数据。面向连接数据传输的收发数据顺序不变,因此传输的可靠性好,但需通信开始前的链接开销,协议复杂,通信效率不高。

  2. Connectionless 无连接:
          网络系统允许一台计算机在任何时刻发送数据给任何一台其它的计算机的一种特性。无连接网络类似于邮政系统,每封信件附有收信人地址,信件可在任何时刻发出。在无连接的网络服务中,增加了更多的管理开销。无连接的服务用来传送不带确认或流量的数据,它被认为是不可靠的。

<三>单播、多播、广播

  1. 单播:
         网络节点之间的通信就好像是人们之间的对话一样。如果一个人对另外一个人说话,那么用网络技术的术语来描述就是“单播”,此时信息的接收和传递只在两个节点之间进行,参见图1。


     
      图1 单播:一对一
         单播在网络中得到了广泛的应用,网络上绝大部分的数据都是以单播的形式传输的,只是一般网络用户不知道而已。例如,你在收发电子邮件、浏览网页时,必须与邮件服务器、Web服务器建立连接,此时使用的就是单播数据传输方式。但是通常使用“点对点通信”(Point to Point)代替“单播”,因为“单播”一般与“多播”和“广播”相对应使用。
    优点:
    服务器及时响应客户机的请求、服务器针对每个客户不通的请求发送不通的数据,容易实现个性化服务。
    缺点:
          服务器针对每个客户机发送数据流,服务器流量=客户机数量×客户机流量;在客户数量大、每个客户机流量大的流媒体应用中服务器不堪重负;
          现有的网络带宽是金字塔结构,城际省际主干带宽仅仅相当于其所有用户带宽之和的5%。如果全部使用单播协议,将造成网络主干不堪重负。现在的P2P应用就已经使主干经常阻塞,只要有5%的客户在全速使用网络,其他人就不要玩了。而将主干扩展20倍几乎是不可能。
  2. 多播:
         “多播”可以理解为一个人向多个人(但不是在场的所有人)说话,这样能够提高通话的效率。如果你要通知特定的某些人同一件事情,但是又不想让其他人知道,使用电话一个一个地通知就非常麻烦,而使用日常生活的大喇叭进行广播通知,就达不到只通知个别人的目的了,此时使用“多播”来实现就会非常方便快捷,但是现实生活中多播设备非常少。多播如图2所示。

     
      图2 多播:一对多
         “多播”也可以称为“组播”,在网络技术的应用并不是很多,网上视频会议、网上视频点播特别适合采用多播方式。因为如果采用单播方式,逐个节点传输,有多少个目标节点,就会有多少次传送过程,这种方式显然效率极低,是不可取的;如果采用不区分目标、全部发送的广播方式,虽然一次可以传送完数据,但是显然达不到区分特定数据接收对象的目的。采用多播方式,既可以实现一次传送所有目标节点的数据,也可以达到只对特定对象传送数据的目的。

    优点:
          需要相同数据流的客户端加入相同的组共享一条数据流,节省了服务器的负载。具备广播所具备的优点;
          由于组播协议是根据接受者的需要对数据流进行复制转发,所以服务端的服务总带宽不受客户接入端带宽的限制。IP协议允许有2亿6千多万个(268435456)组播,所以其提供的服务可以非常丰富;
          此协议和单播协议一样允许在Internet宽带网上传输。
    缺点:
          与单播协议相比没有纠错机制,发生丢包错包后难以弥补,但可以通过一定的容错机制和QOS加以弥补。
          现行网络虽然都支持组播的传输,但在客户认证、QOS等方面还需要完善,这些缺点在理论上都有成熟的解决方案,只是需要逐步推广应用到现存网络当中
  3. 广播:
    “广播”可以理解为一个人通过广播喇叭对在场的全体说话,这样做的好处是通话效率高,信息一下子就可以传递到全体,如图3所示。

    图3 广播:一对全体
      “广播”在网络中的应用较多,如客户机通过DHCP自动获得IP地址的过程就是通过广播来实现的。但是同单播和多播相比,广播几乎占用了子网内网络的所有带宽。拿开会打一个比方吧,在会场上只能有一个人发言,想象一下如果所有的人同时都用麦克风发言,那会场上就会乱成一锅粥。
      在网络中不能长时间出现大量的广播包,否则就会出现所谓的“广播风暴”。广播风暴就是网络长时间被大量的广播数据包所占用,正常的点对点通信无法正常进行,外在表现为网络速度奇慢无比。出现广播风暴的原因有很多,一块有故障的网卡,就可能长时间向网络上发送广播包而导致广播风暴。
      集线器由于其工作原理决定了不可能过滤广播风暴,一般的交换机也没有这一功能,不过现在有的网络交换机(如全向的QS系列交换机)也有过滤广播风暴功能了,路由器本身就有隔离广播风暴的作用。
      广播风暴不能完全杜绝,但是只能在同一子网内传播,就好像喇叭的声音只能在同一会场内传播一样,因此在由几百台甚至上千台电脑构成的大中型局域网中,一般进行子网划分,就像将一个大厅用墙壁隔离成许多小厅一样,以达到隔离广播风暴的目的。
      在IP网络中,广播地址用IP地址“255.255.255.255”来表示,这个IP地址代表同一子网内所有的IP地址。

    优点:
          网络设备简单,维护简单,布网成本低廉
          由于服务器不用向每个客户机单独发送数据,所以服务器流量负载极低。
    缺点:
          无法针对每个客户的要求和时间及时提供个性化服务。
          网络允许服务器提供数据的带宽有限,客户端的最大带宽=服务总带宽。例如有线电视的客户端的线路支持100个频道(如果采用数字压缩技术,理论上可以提供 500个频道),即使服务商有更大的财力配置更多的发送设备、改成光纤主干,也无法超过此极限。也就是说无法向众多客户提供更多样化、更加个性化的服务。

 

转载于:https://www.cnblogs.com/LCCRNblog/p/3840958.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WinSock是Windows套接字编程接口,用于实现网络通信。它提供了一组函数和数据结构,使开发人员能够在应用程序中创建、连接、发送和接收网络数据。 网络编程是使用编程语言创建网络应用程序的过程。在WinSock中,开发人员可以使用C/C++语言进行网络编程。以下是使用WinSock进行网络编程的一般步骤: 1. 初始化WinSock库:在使用任何WinSock函数之前,需要调用WSAStartup函数来初始化WinSock库。 2. 创建套接字:使用socket函数创建一个套接字,套接字是网络通信的端点。 3. 设置套接字选项:使用setsockopt函数设置套接字选项,如超时时间、重用地址等。 4. 绑定套接字:使用bind函数将套接字绑定到本地地址和端口。 5. 监听连接请求(可选):如果你的应用程序充当服务器,可以使用listen函数开始监听连接请求。 6. 接受连接(可选):如果你的应用程序充当服务器,可以使用accept函数接受客户端的连接请求,并创建一个新的套接字与客户端进行通信。 7. 连接服务器(可选):如果你的应用程序充当客户端,可以使用connect函数连接到服务器。 8. 发送和接收数据:使用send和recv函数发送和接收数据。 9. 关闭套接字:使用closesocket函数关闭套接字。 以上仅为简单的步骤示例,实际的网络编程可能涉及更多的细节和处理错误的代码。你可以参考WinSock的文档和教程来深入学习WinSock网络编程

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值