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的后台流量 ...
随机推荐
- 随笔记录--RegExp类型
阅读Javascript高级程序设计第五章 -- RegExp类型总结 对于基础教程部分, 有小伙伴不熟悉的,可以参考 正则表达式 - 教程 1. 基础部分回顾: ECMASript通过RegExp类 ...
- python socket 传输文件
推荐资料 https://www.cnblogs.com/xiaokang01/p/9865724.html socket传输文件 思路: # 先将报头转换成字符串(json.dumps), 再将字符 ...
- 让Linux中的Nginx支持中文文件名
原文:https://blog.csdn.net/soeben/article/details/79525964 首先你的服务器需要安装了UTF-8字符集在命令行里输入env|grep LANG如果显 ...
- springmvc配置访问静态文件
xmlns:mvc="http://www.springframework.org/schema/mvc" <mvc:annotation-driven /><m ...
- JavaScript三种方法获取地址栏参数的方法
今天碰到要在一个页面获取另外一个页面url传过来的参数,一开始很本能的想到了用 split(“?”)这样一步步的分解出需要的参数. 后来想了一下,肯定会有更加简单的方法的!所以在网上找到了两个很又简单 ...
- 查询接口---flask+python+mysql
环境准备 安装flask pip install flask 项目结构如图 1.新建配置文件conf.py #!/usr/bin/python# -*- coding:utf-8 -*- impor ...
- JMeter【第五篇】关联:5种方法
前几天在Q群里看到群友发的最近10年性能测试工具使用率的统计,最近的2018年,jmeter+loadrunner占了93%的使用率,说明这两个是主流,其中,jmeter的使用率逐年提升,现在已经超过 ...
- scrapy框架--?乱码unicode
安装 pip install scrapy 建立一个爬虫项目 scrapy startproject 项目名称 scrapy startproject itcast 进入itcast文件夹 生成一个爬 ...
- go实现tcp 服务器
我们将使用 TCP 协议和协程范式编写一个简单的客户端-服务器应用,一个(web)服务器应用需要响应众多客户端的并发请求:Go 会为每一个客户端产生一个协程用来处理请求.我们需要使用 net 包中网络 ...
- 10 使用 OpenCV、Kafka 和 Spark 技术进行视频流分析
问题引起 基于分布式计算框架Spark的室内防盗预警系统 首先用摄像头录一段视频,存在电脑里,下载一个ffmpeg的软件对视频进行处理,处理成一张张图片,然后通过hadoop里边的一个文件系统叫做hd ...