TCP/UDP的网络底层实现
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命令后才清空,否则缓冲区会重发数据。
最新文章
- [转]理解RESTful架构
- C#中跨线程访问控件问题解决方案
- Linux中的ps命令
- 怎么使用git来管理项目版本?
- Linux(Centos)配置OpenSSH无密码登陆<;转>;
- Intellij Idea 配置database 连接SQL Server 2012
- STL中的set容器的一点总结(转)
- MRD-5012型RS232,RS485有源隔离中继模块,采用磁隔离技术,金升阳DC-DC隔离电源,纯硬件自适应方向,速度高达256000bps
- Unity 3d 实施刚体力
- 使用SLT 工具从SAP导入数据到SAP HANA的监控
- 简单工厂模式,工厂方法模式,抽象工厂模式,spring的狂想
- JS获取当前周
- 微信小程序实现显示和隐藏控件-头像-取值-bindblur事件
- maven多模块依赖源码调试
- POJ 2299
- JSP中的指令概述和示例
- Codeforces A - Bear and Prime 100(交互题)
- 29. What Makes a True Leader ? 合格的领导者由何物决定 ?
- T-SQL 总结
- Unable to find a qt build, to solve this problem specify a qt build
热门文章
- Python开发环境的安装配置
- SpringBoot quartz定时器
- Django框架(十二)-- Djang与Ajax
- Linux 批量查找并替换文件夹下所有文件的内容
- 逆向破解之160个CrackMe —— 022
- Wpf DataGrid动态添加列,行数据(二)
- phpcms网站迁移无法更新内容提示Table &#39;led_com.lz_&#39; doesn&#39;t exist的解决方法
- hibernate关联关系 (多对多)
- 【luoguP2252】 取石子游戏
- LaTeX表格紧跟文字 (不影响下方文本对齐)