1.1Socket的使用背景

当我们在使用微信、玩游戏、收发邮件,以及用web浏览器上网时,底层的实现是TCP/UDP的协议,封装socket实现网络通信功能。

了解了网络通信的底层实现原理,在出现socket突然阻塞、然后又不阻塞、NIO(非阻塞)模式的实现方式以及socket如何传输的情况,才不会一头雾水。

1.2Socket的内部组成

socket内部有一个读缓冲区和写缓冲区。读缓存区和写缓冲区的容量大小有限。

1.3网络通信过程

客户端和服务端的socket双向传递数据。客户端请求socket写入数据,数据对象必须序列化为字节数组,就是socket的缓冲区写入一段字节数组,直到

缓冲区达到上限。缓冲区的字节数组传给网卡硬件,网卡硬件拆分数据为许多的数据包,并通过网线传给链路中的路由器和交换机寻址,目的计算机的

网卡接收到数据后重组排序数据包,然后传递给socket,即端口开启的socket服务的读缓冲区读入这段字节数组,缓冲区达到

上限后,服务器的通信应用服务读取缓存区的字节数组,反序列化成对象。这是socket通信的简单流程。

服务端回复客户端的过程和上述过程相反,但是实现的原理相同。

1.4NIO非阻塞

当socket的写入速度大于读取速度时,写缓冲区达到上限,之后的数据不允许写入缓存区,直到缓存区重新出现空闲空间。TCP协议提供缓冲区放入不允许写入写

缓冲区的数据。UDP协议没有这个机制,所以无目的存放的数据被socket丢弃了。此外,TCP协议提供了动态调整传输速率算法,动态调整读写速度。

NIO非阻塞提供了无论写入速度多快,未满的缓冲区还是会发送数据。所以不会阻塞缓冲区。读缓冲区也是的。

1.5 缓冲区ack

socket缓冲区中的数据发送给网卡后不会马上删除socket缓存区的数据,必须要等网卡回复ack命令后才清空,否则缓冲区会重发数据。

最新文章

  1. [转]理解RESTful架构
  2. C#中跨线程访问控件问题解决方案
  3. Linux中的ps命令
  4. 怎么使用git来管理项目版本?
  5. Linux(Centos)配置OpenSSH无密码登陆<转>
  6. Intellij Idea 配置database 连接SQL Server 2012
  7. STL中的set容器的一点总结(转)
  8. MRD-5012型RS232,RS485有源隔离中继模块,采用磁隔离技术,金升阳DC-DC隔离电源,纯硬件自适应方向,速度高达256000bps
  9. Unity 3d 实施刚体力
  10. 使用SLT 工具从SAP导入数据到SAP HANA的监控
  11. 简单工厂模式,工厂方法模式,抽象工厂模式,spring的狂想
  12. JS获取当前周
  13. 微信小程序实现显示和隐藏控件-头像-取值-bindblur事件
  14. maven多模块依赖源码调试
  15. POJ 2299
  16. JSP中的指令概述和示例
  17. Codeforces A - Bear and Prime 100(交互题)
  18. 29. What Makes a True Leader ? 合格的领导者由何物决定 ?
  19. T-SQL 总结
  20. Unable to find a qt build, to solve this problem specify a qt build

热门文章

  1. Python开发环境的安装配置
  2. SpringBoot quartz定时器
  3. Django框架(十二)-- Djang与Ajax
  4. Linux 批量查找并替换文件夹下所有文件的内容
  5. 逆向破解之160个CrackMe —— 022
  6. Wpf DataGrid动态添加列,行数据(二)
  7. phpcms网站迁移无法更新内容提示Table 'led_com.lz_' doesn't exist的解决方法
  8. hibernate关联关系 (多对多)
  9. 【luoguP2252】 取石子游戏
  10. LaTeX表格紧跟文字 (不影响下方文本对齐)