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的网络底层实现的更多相关文章

  1. ethr 微软开源的tcp udp http 网络性能测试工具

    ethr 是微软开源的tcp udp http 网络性能测试工具包包含的server 以及 client 我们可以远程测试 同时对于https icmp 的支持也在开发中,tcp 协议支持连接.带宽. ...

  2. TCP/UDP Linux网络编程详解

    本文主要记录TCP/UDP网络编程的基础知识,采用TCP/UDP实现宿主机和目标机之间的网络通信. 内容目录 1. 目标2.Linux网络编程基础2.1 嵌套字2.2 端口2.3 网络地址2.3.1 ...

  3. 三十天学不会TCP,UDP/IP网络编程-IP头格式祥述

    我又来了,这篇文章还是来做(da)推(guang)介(gao)我自己的!俗话说事不过三,我觉得我下次得换个说法了,不然估计要被厌恶了,但是我是好心呐,一定要相信我纯洁的眼神.由于这两年接触到了比较多的 ...

  4. 三十天学不会TCP,UDP/IP网络编程-ARP -- 连接MAC和IP

    继续来做(da)推(guang)介(gao)我自己的!由于这两年接触到了比较多的这方面的知识,不想忘了,我决定把他们记录下来,所以决定在GitBook用半年时间上面写下来,这是目前写的一节,目前已完成 ...

  5. 三十天学不会TCP,UDP/IP网络编程-UDP,从简单的开始

    如果对和程序员有关的计算机网络知识,和对计算机网络方面的编程有兴趣,欢迎去gitbook(https://www.gitbook.com/@rogerzhu/)star我的这一系列文章,虽然说现在这种 ...

  6. 三十天学不会TCP,UDP/IP网络编程-TraceRoute的哲学

    新年快乐,继续来部分粘贴复制我的这一系列文章啦,如果对和程序员有关的计算机网络知识,和对计算机网络方面的编程有兴趣,欢迎去gitbook(https://www.gitbook.com/@rogerz ...

  7. 三十天学不会TCP,UDP/IP网络编程 - 绅士的开始

    经过了过年的忙碌和年初的懈怠一切的日子,我又开始重新更新了~这是最新的一篇~完整版可以去gitbook(https://www.gitbook.com/@rogerzhu/)看到. 如果对和程序员有关 ...

  8. 三十天学不会TCP,UDP/IP网络编程 - RST的用法

    不知不觉也写了这么多了,继续我的自己的推广大业~完整版可以去gitbook(https://www.gitbook.com/@rogerzhu/)看到. 如果对和程序员有关的计算机网络知识,和对计算机 ...

  9. 三十天学不会TCP,UDP/IP网络编程 - UDP的实践--DHCP

    在经历了一顿忙碌加出去玩了玩之后,我又开始重新更新了~这是最新的一篇~完整版可以去gitbook(https://www.gitbook.com/@rogerzhu/)看到,在gitbook的后台流量 ...

随机推荐

  1. .net web mvc 权限验证

    这里分享MVC的权限验证,内容中可能存在一些,莫名其妙的方法,那些是以前封装好的,大致可以根据方法名称知道他的意思. using Game.Entity; using Game.Entity.Plat ...

  2. SQOOP的使用方法

    Sqoop是个命令行工具,用来在Hadoop和rdbms之间传输数据. 以Hadoop的角度看待数据流向,从rdbms往Hadoop是导入用sqoop import命令,反之从hadoop往rdbms ...

  3. django rest_framework vue 实现用户列表分页

    django rest_framework vue 实现用户列表分页 后端 配置urls # 导入view from api.appview.userListView import userListV ...

  4. 基于开源博客系统(mblog)搭建网站

    基于开源博客系统(mblog)搭建网站 上一章讲了基于jpress部署的博客系统,这一章了解一下 mblog这个开源的基于springboot的博客系统,相比与jpress 的热度fork数量要少一些 ...

  5. Bootstrap 提示工具(Tooltip)插件

    一.提示工具(Tooltip)插件根据需求生成内容和标记,默认情况下是把提示工具(tooltip)放在它们的触发元素后面. 有以下两种方式添加提示工具(tooltip): 1.通过data属性:如需添 ...

  6. c#引用c++dll和c++导出类出现的各种问题

    最近对一些第三方类库进行c++托管以便c#调用  因为之前没弄过,出现各种各样的问题 fatal error LNK1104: 无法打开文件“xxx.lib”或者xxx.dll 等等等 总结: 1.字 ...

  7. IE、chrome驱动下载地址

    http://selenium-release.storage.googleapis.com/index.html IE驱动https://sites.google.com/a/chromium.or ...

  8. phpcms切换到php7.2后无法修改文章提示Uncaught Error: [] operator not supported for strings

    前段时间将客户的phpcms站点升级到php7.2,相对比较顺利,但是今天他反应文章无法修改了,提示Uncaught Error: [] operator not supported for stri ...

  9. Anaconda3(0)环境基本使用

    https://blog.csdn.net/u012005313/article/details/82347817 主要内容: 查看环境列表 创建新的 Python 环境 激活/停止 Python 环 ...

  10. 7-ESP8266 SDK开发基础入门篇--串口处理数据,控制LED

    接着上一节的写 咱先做一个单片机串口接收到什么就回过来什么 咱自己写个发送函数,其实就是仿照官方的写的 别忘了 现在咱建个任务处理串口数据 下载进去 现在是三个任务都在运行了...操作系统是不是很神奇 ...