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命令后才清空,否则缓冲区会重发数据。
TCP/UDP的网络底层实现的更多相关文章
- ethr 微软开源的tcp udp http 网络性能测试工具
ethr 是微软开源的tcp udp http 网络性能测试工具包包含的server 以及 client 我们可以远程测试 同时对于https icmp 的支持也在开发中,tcp 协议支持连接.带宽. ...
- TCP/UDP Linux网络编程详解
本文主要记录TCP/UDP网络编程的基础知识,采用TCP/UDP实现宿主机和目标机之间的网络通信. 内容目录 1. 目标2.Linux网络编程基础2.1 嵌套字2.2 端口2.3 网络地址2.3.1 ...
- 三十天学不会TCP,UDP/IP网络编程-IP头格式祥述
我又来了,这篇文章还是来做(da)推(guang)介(gao)我自己的!俗话说事不过三,我觉得我下次得换个说法了,不然估计要被厌恶了,但是我是好心呐,一定要相信我纯洁的眼神.由于这两年接触到了比较多的 ...
- 三十天学不会TCP,UDP/IP网络编程-ARP -- 连接MAC和IP
继续来做(da)推(guang)介(gao)我自己的!由于这两年接触到了比较多的这方面的知识,不想忘了,我决定把他们记录下来,所以决定在GitBook用半年时间上面写下来,这是目前写的一节,目前已完成 ...
- 三十天学不会TCP,UDP/IP网络编程-UDP,从简单的开始
如果对和程序员有关的计算机网络知识,和对计算机网络方面的编程有兴趣,欢迎去gitbook(https://www.gitbook.com/@rogerzhu/)star我的这一系列文章,虽然说现在这种 ...
- 三十天学不会TCP,UDP/IP网络编程-TraceRoute的哲学
新年快乐,继续来部分粘贴复制我的这一系列文章啦,如果对和程序员有关的计算机网络知识,和对计算机网络方面的编程有兴趣,欢迎去gitbook(https://www.gitbook.com/@rogerz ...
- 三十天学不会TCP,UDP/IP网络编程 - 绅士的开始
经过了过年的忙碌和年初的懈怠一切的日子,我又开始重新更新了~这是最新的一篇~完整版可以去gitbook(https://www.gitbook.com/@rogerzhu/)看到. 如果对和程序员有关 ...
- 三十天学不会TCP,UDP/IP网络编程 - RST的用法
不知不觉也写了这么多了,继续我的自己的推广大业~完整版可以去gitbook(https://www.gitbook.com/@rogerzhu/)看到. 如果对和程序员有关的计算机网络知识,和对计算机 ...
- 三十天学不会TCP,UDP/IP网络编程 - UDP的实践--DHCP
在经历了一顿忙碌加出去玩了玩之后,我又开始重新更新了~这是最新的一篇~完整版可以去gitbook(https://www.gitbook.com/@rogerzhu/)看到,在gitbook的后台流量 ...
随机推荐
- Nginx 高级配置-https 功能
Nginx 高级配置-https 功能 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.HTTPS工作过程 1>.SSL/TLS SSL(Secure Socket Lay ...
- Go如何使用数据库、缓存
database/sql 接口 Go官方没有提供数据库驱动,而是为开发数据库驱动定义了一些标准接口database/sql,开发者可以根据定义的接口来开发相应的数据库驱动,这样做有一个好处,只要是按照 ...
- jupyter配置成coding神器
参考链接: [1]http://resuly.me/2017/11/03/jupyter-config-for-windows/ [2]主题更换 切换主题:jt 主题名 -T 主题种类:chester ...
- pymysql 增删改 查 索引
pymysql 模块的使用 pip install pymysql username = input ("请输入用户") pwd = input ("请输入密码" ...
- axios跨域处理
本质分析: 因为axios在vue中利用中间件http-proxy-middleware做了一个本地的代理服务A,相当于你的浏览器通过本地的代理服务A请求了服务端B,浏览器通过服务A并没有跨域,因此就 ...
- spring boot 程序启动缓慢的问题(二)
今天发现一台服务器上的springboot程序启动特别慢,完全启动起来用了有好几分钟.刚开始以为是代码写的有问题造成了卡死,直到看到这条log: 2017-03-08 10:06:49.600 INF ...
- 重新学习Spring注解——Spring容器
44.[源码]-Spring容器创建-BeanFactory预准备 45.[源码]-Spring容器创建-执行BeanFactoryPostProcessor 46.[源码]-Spring容器创建-注 ...
- classpath环境变量解惑
只有使用低于JDK1.5版本的JDK时,才需要设置classpath环境变量. 因为早期版本的JDK没有设计在当前路径下搜索Java类的功能,而且编译和运行java程序时还需要JDK的lib路径下的d ...
- 【java异常】定时任务异常ERROR 20604 --- [ scheduling-1] o.s.s.s.TaskUtils$LoggingErrorHandler : Unexpected error occurred in scheduled task
2019-11-20 13:20:00.006 ERROR 20604 --- [ scheduling-1] o.s.s.s.TaskUtils$LoggingErrorHandler : Unex ...
- 最短路径 | 1003 dfs 或 dij ,单源最短路径条数与经过的点权最大
这题很早之前就遇到过,是pat留给我的第一印象,然而昨天却有点写不出来.今天dfs用了10分钟不到写出来了.dij用了大约15分钟,捉虫花了一点时间. dfs: 注意剪枝的时候别剪错就行了. #inc ...