socket编程

目录


一些基本概念

  • TCP/IP协议:链路层、网络层、传输层、应用层。
  • 传输层:主要有TCP/UDP两种
  • 网络层:IP等
  • 链路层:包括操作系统中的设备驱动程序和计算机对应的网卡
  • 应用层:包括ftp、http等
  • DNS域名系统
  • windows状态下的线程同步:临界区、内核对象、互斥量、信号量
  • TCP:面向连接的(像打电话),可靠的(无丢失,无损坏,无冗余)
  • UCP:面向非连接的(像发电报),不可靠的(不保证准确送达,不保证其顺序性,可能有冗余或损坏)

UCP和TCP的包体限制

  • UDP 包的大小就应该是 1500 - IP头(20) - UDP头(8) = 1472(Bytes),最好是在548内,因为UDP包如果发生错误就会直接丢弃
  • TCP 包的大小就应该是 1500 - IP头(20) - TCP头(20) = 1460(Bytes),TCP包如果发生错误会重传

TCP粘包以及拆包

  • TCP粘包就是指发送方发送的若干包数据到达接收方时粘成了一包
  • 解决办法:循环处理,应用程序从接收缓存中读取分组时,读完一条数据,就应该循环读取下一条数据,直到所有数据都被处理完成,但是如何判断每条数据的长度呢?

  1. 格式化数据:每条数据有固定的格式(开始符,结束符),这种方法简单易行,但是选择开始符和结束符时一定要确保每条数据的内部不包含开始符和结束符。
  2. 发送长度:发送每条数据时,将数据的长度一并发送,例如规定数据的前4位是数据的长度,应用层在处理时可以根据长度来判断每个分组的开始和结束位置。

几种常见的IO模型

  • 选择模型(SelectModel)
  • 异步选择模型(WSAAsyncSelectModel)
  • 事件选择模型(WSAEventSelectModel)
  • 重叠模型(OverlappedModel)
  • 完成端口模型(CompletionPortModel)
  • 分析:这些模型中,除了WSAASyncSelect模型外,其它I/O模型一般都要用到多线程编程。在windows网络编程中,客户端一般用WSAASyncSelect模型比较简单方便,服务端如果要求连接用户数较多性能较强要用Completion port(完成端口)模型。

WSAAsyncSelect如何实现一个服务器连接多个客户端

  1. 在服务器端用数组存客户端的socket连接及相关信息。(优点:结构简单,随机存取。缺点:长度必须事先指定,浪费内存,并且做删除操作费时)
  2. 在服务器端用list容器双向链表存客户端的socket连接及相关信息。(优点:删除速度较快 缺点:查询是O(n)的时间复杂度,较慢)
  3. 在服务器端用map容器存客户端的socket连接及相关信息。(优点:查询和删除都较快)利用hashmap能使查询速度更快,但更费内存。
  4. 每次发送信息都加上一个客户机信息地址的指针,直接取址,不用再查询。但浪费消息流量。

高并发、同步、异步

 

WSAEventSelect优缺点

 

IOCP完成端口模型

  • 高并发,其实就是使用技术手段使得系统可以并行处理很多的请求!衡量指标常用的有响应时间,吞吐量,每秒查询率QPS,并发用户数
  • 同步方法调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为。
  • 异步方法调用更像一个消息传递,一旦开始,方法调用就会立即返回,调用者就可以继续后续的操作。而,异步方法通常会在另外一个线程中,“真实”地执行着。整个过程,不会阻碍调用者的工作。
  • select模型的优缺点

  • 优点:能够在单个线程内同时处理多个套接字连接。避免了线程膨胀问题。移植性好,在Linux和winnt平台通用。
  • 缺点:最大并发数限制,由 FD_SETSIZE 设置,默认值是1024,因此 Select 模型的最大并发数就被相应限制了。效率问题, select 每次调用都会线性扫描全部的 FD 集合,这样效率就会随连接个数呈现线性甚至2次方下降。内核 / 用户空间 内存拷贝问题,如何让内核把 FD 消息通知给用户空间呢?在这个问题上 select 采取了内存拷贝方法。
  • 优点:WSAEventSelect模型优势在于可以应用在一个非窗口的Windows Sockets程序中,实现对多个套接字的管理。
  • 缺点:每个WSAEventSelect模型最多只能管理64个套接字。当应用程序中需要管理多于64个套接字时,就需要额外创建线程。由于使用该模型开发套接字应用程序需要调用几上有关函数才能完成。因此,该模型增加了开发程序的难度,增加开发人员的编码量。从这个角度讲,该模型不如WSAAsyncSelect模型使用方便。
  • 如果事先开好N个线程,让它们在那hold[堵塞],然后可以将所有用户的请求都投递到一个消息队列中去。那N个线程逐一从消息队列中去取出消息并加以处理。就可以避免针对每一个用户请求都开线程。不仅减少了线程的资源,也提高了线程的利用率。这就是线程池的理论,也是IOCP技术的精髓
  • 完成端口是到目前为止最为复杂的输入输出模式。然而,当一个应用不得不同时处理大量的socket时,它也提供了使系统性能达到最佳的可能性。如果你的服务程序需要管理几百甚至上千个Socket(海量连接)的话,如Apache,游戏服务器等,你应该采用完成端口I/O模型

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值