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. 安装Docker报container-selinux >= 2.9错

    Docker装了无数次,还是会遇到如此熟悉的问题,知道他是版本需要更新,但是就是找不到对应的,在网上找了差不多一个下午都没弄好.发现平时还是要多动脑子才行,既然知道是版本需要更新,那么到官网直接找版本 ...

  2. 8皇后问题SQL求解(回溯算法)

    问题 八皇后问题是一个古老而著名的问题,是回溯算法的典型例题.该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一 ...

  3. eclipse 搭建springboot项目pom.xml报错

    1. 报错信息 2. 解决方法 在pom.xml文件中加入maven版本修改 <maven-jar-plugin.version>3.1.1</maven-jar-plugin.ve ...

  4. json序列化时间日期数据注意

    通过json序列化时间日期格式数据的时候需要注意,不能直接序列化,我写了一个类,可以借用 import json from datetime import datetime,date a = {'na ...

  5. Codeforces Round #579 (Div. 3)

    Codeforces Round #579 (Div. 3) 传送门 A. Circle of Students 这题我是直接把正序.逆序的两种放在数组里面直接判断. Code #include &l ...

  6. 修改opencart extension插件代码后无法重新安装的解决办法

    有时我们在为opencart安装一些插件后,发现有些地方需要细微的调整,然后去修改插件代码重新安装,但是却没有成功.开始有点怀疑是不是不能修改代码,但也不至于啊,不然开发者怎么制作插件.应该是哪里出了 ...

  7. scrapy框架--?乱码unicode

    安装 pip install scrapy 建立一个爬虫项目 scrapy startproject 项目名称 scrapy startproject itcast 进入itcast文件夹 生成一个爬 ...

  8. Python前言之Pycharm常用快捷键

    pycharm常用快捷键 ctrl+a 全选 ctrl+c 复制(默认复制整行) ctrl+v 粘贴 ctrl+x 剪切(默认复制整行) ctrl+f 搜索 ctrl+z 撤销 ctrl+shift+ ...

  9. VIJOS-P1282 佳佳的魔法照片

    洛谷 P1583 魔法照片 洛谷传送门 JDOJ 1396: VIJOS-P1282 佳佳的魔法照片 JDOJ传送门 Description 一共有n个人(以1--n编号)向佳佳要照片,而佳佳只能把照 ...

  10. university-conda

    1.建立环境 conda create -n djx python=3.7 2.激活 conda activate djx 3.退出 conda deactivate 4.查看 conda env l ...