在2017年10月深圳 Cocos 沙龙上,有幸结识了社区中大名顶顶的Colin,Shawn在论坛上第一次看到Colin的团队用CocosCreator制作的《热血暗黑》时就被深深地震撼到了!更为重要的是,Colin将他的技术心得和宝贵开发经验写成文字,每一篇分享都是满满的干货,而且幸运的是Shawn得到Colin的授权许可,与你一起欣赏一起成长!

从今日起 Colin 大神准备长期驻扎「Creator游戏开发社区」,为大家分享最为硬核的Linux C++ 游戏服务器开发相关知识与经验。

TCP/IP基础知识

网络由下向上可以分成:

  1. 数据链路层(Data-link layer)
  2. 网络层(Network layer)
  3. 传输层(Transport layer)
  4. 应用层(Application layer)

数据链路层

这一层和设备驱动以及网卡相关,它涉及到通过网络中的物理链路传输数据的技术。对于程序员来说通常可以忽略这一层,但有几个概念要了解:

  • Frame: 数据链路层将数据报封装成称为帧的单元。

  • MTU:最大传输单位,即在一帧中允许传输的最大有效数据(payload),帧头信息+有效数据+帧尾信息就形成1帧的全部内容,如果有效数据超过这个大小将被分割成多个单元。不同的数据链路层有不同的MTU。

  • path MTU:当传输跨过多个不同的网络时,每条链路可能有不同大小的MTU,在整个网络路径上,最小的MTU被称为路径MTU。

IP层

IP层负责从源主机和目标主机传输数据包,它主要负责下面的事情:

  • 将IP数据包分割成数据链路层的帧,交给链路层去传输。

  • 通过互联网路由数据。

  • 为上层的传输层提供服务。

一个IP数据报的组成大概是这样的:

[IP数据报] = [IP头] + [IP数据][IP头] = 源地址+目标地址+校验信息+...

关于IP协议还有一些要注意的地方:

  • IP协议是一个无连接和不可靠的协议,它不保证数据包会按序传输,或不会被复制,甚至不能保证数据包全部到达。

  • 由于MTU的存在,IP数据包可能会被分片传输,比如以太网的MTU是1500,远小于IP数据包的最大值(65535),如果IP数据包大于MTU,那么数据链路层会把IP包分片,到目的地后再组装起来,这个过程对上层协议是透明的。

  • IP包分片传输的过程中,如果发生分片丢失或数据错误,那么整个数据包都将失效。上层协议比如UDP没有重传机制,这可能会加大丢包率,而TCP虽然有重传机制,也会降低传输效率。

  • TCP实现了path MTU发现算法,并相应的分解传给IP层的数据,这样IP包就不会超过MTU。但UDP没有提供这个机制,所以上层应用要自己控制包的大小,避免超过MTU造成IP碎片化。

IP地址分为IPv4和IPv6,关于IP地址有下面这些要点:

  • IPv4地址大小是32位,用可读的方式将4个字节用点分开,比如:204.152.189.116。

  • IP地址组成:网络ID+主机ID。用掩码可以得到各个部分,掩码中的二进制1表示网络ID,0表示主机ID,可读方式如:255.255.255.0,这表示前3个字节为网络ID,第4个字节为主机ID。由于左边的总是网络ID,可以简单表示为:204.152.189.0/24,24表示网络ID占24位。

  • 回环地址:一般是127.0.0.1,主机名为localhost,表示主机自己,发送到这个地址的数据包并不会传输到网络,它只会传回本机。所以这个地址一般用于本机的进程间通讯,或在本机测试服务器程序。

  • 通配符地址:一般是0.0.0.0,用于表示本机任意可用的IP地址,如果主机有多个IP地址,你想客户端通过任意一个IP地址都能连上服务器,那么可以使用这个地址。

  • IPv6地址大小是128位,用冒号分隔出8部分,每部分2个字节,如:F000:0:0:0:0:0:A:1,中间为0的部分可以用两个冒号省略,如:F000::A:1。

  • IPv6也有回环地址::1和通配符地址::

  • 一般带有端口的地址表示法,IPv4: 204.152.189.116:80,IPv6: [F000::A:1]:80

传输层

最常用的两个传输层协议是TCP和UDP,传输层增加了端口的概念,它把目标从主机进一步细分到程序,IP地址关注的是网络中的主机,而端口则是关注主机中的程序。

1024以下端口被预留给特殊的应用协议,所以我们自己写的服务端程序一般端口要大于1023,比较常用的预留端口有:

FTP     21SSH     22telnet  23DNS     53HTTP    80HTTPS   443

UDP协议

UDP在IP包之上仅仅增加了端口和数据校验,所以它的优点是速度很快,缺点也很明显,就是无连接和不可靠。

上面看到IP包如果超过MTU会产生碎片化,而UDP没有办法知道最小MTU是多少,所以在实践中UDP包的大小要做限制,尽可能不要引起IP包碎片化,许多基于UDP的程序选择512字节来限制UDP包的大小。

TCP协议

TCP协议提供了可靠的,面向连接的,双向的字节流通讯方式:

  • 建立连接:在通讯开始之前,TCP需要在两端建立通讯通道,连接建立起来之后,两端就可以交换数据。

  • 数据分段:数据被分成多个段,每段都包含用于检测传输错误的校验码,一个段用一个IP数据报传输。

  • 数据段重传:当一个TCP数据段正确到达接收端时,接收端向发送端发送一个确认消息,表示数据段已成功到达;如果数据段出错,它会被丢弃,并且接收端不发送确认给发送端。发送端为了处理这种情况,它在发送数据端时会启动一个定时器,时间到达仍没有收到接收端的确认,它会重新发送数据段。

  • 数据段序号:通讯时每一个数据段都有一个序号,下个段的序号等于上个段的序号加上段长度,序号的意义在于:

    • 接收端可以正常处理数据段的顺序。

    • 接收端向发送端发送一个确认消息并带上数据段的序号,这可以让发送端知道这个段已经成功发送。

    • 接收端能正确消除重复的段,这些重复的段可能是TCP重传导致,也可能是IP数据报重复。

  • 流量控制:这是了防止发送端发送数据过快,接收端来不及接收导致丢失数据,TCP使用一个叫滑动窗口的算法来控制流量。接收端在回发确认包时,告诉发送端我这边缓存还有多少可用(窗口大小),发送端根据这个窗口大小调整发包的速度,如果窗口为0,表示接收端缓冲区满了,此时发送端停止发送。停了之后,发送端会启动一个定时器,定时向接收端发探测段,接收端回应窗口大小,这样发送端又可以开始发送数据。

  • 拥塞控制:流量控制与接收方的缓存状态相关,而拥塞控制则与网络的拥堵情况相关,拥塞控制是为了防止发送数据过快使网络拥堵,这可能会导致比较高的丢包率,而TCP有传重机制,会继续向网络重传数据,这又进一步使网络拥堵。拥塞控制主要是结合了两种算法:慢启动和拥塞避免,感兴趣的可以进一步阅读相关文档,这里就略过了。

从上面描述可以看出,TCP的确是一个非常复杂的协议,我们只是简单的描述,也许有些细节不完全正确,如果想更深入了解TCP协议,请阅读TCP/IP详解。

tcp丢包率_网络编程 | TCP/IP基础知识相关推荐

  1. 测试服务器UDP/TCP丢包率

    1. 测试UDP丢包率 30个现成以5Mbps速度测试60s iperf -u -c 目的IP -b 5M -P 30 -t 60 2. 测试TCP丢包率 iperf -c 目的IP -b 5M -P ...

  2. centos 7 局域网丢包排查_网络排查神器:mtr

    常用的 ping,tracert,nslookup 一般用来判断主机的网络连通性,其实 Linux 下有一个更好用的网络联通性判断工具,它可以结合ping nslookup tracert 来判断网络 ...

  3. csgo降低延迟指令_【显示FPS、延迟丢包率等网络参数】net_graph及相关控制台命令...

    本文将介绍CSGO控制台指令net_graph,用于显示画面帧数(fps)和延迟(ping).丢包率(loss和choke)等服务器/网络状态参数,除此之外,还有net_graph相关的控制台命令,用 ...

  4. ns3统计时延和丢包率_端到端高丢包率小区优化思路

    1.       端到端高丢包小区整体分析思路 (1)VOLTE端到端高丢包率统计方式说明 VOLTE端到端高丢包率小区数据取自GM接口丢包率统计,涉及终端.空口.基站.PTN传输网络.S/PGW.S ...

  5. linux tcp 丢包命令_在Linux下实现测试TCP和UDP的丢包检测!

    在Linux下实现测试TCP和UDP的丢包检测! 疯狂の猿猴 • 2020 年 12 月 11 日 前言 本人平时基本上都是win,一下子转战到linux,有点不习惯! 因此做个记录,便于以后自己查阅 ...

  6. iperf测UDP和TCP丢包率及带宽

    iperf iperf3 (安装包是:iperf-master)安装遇到error while loading shared libraries:libiperf.so.0 解决方法:在正常编译以后运 ...

  7. python tcp不用循环监听_网络编程: TCP

    1. IP 地址 概念: 标识网络中设备的地址(需要联网才有没有联网, 是没有这个地址) 表现形式: ipv4 目前主要使用的, 点分十进制的格式,(192.168.3.43) 分为 4 段, 每段的 ...

  8. 计算机网络的八大性能指标,速率、带宽、吞吐量、时延、时延带宽积、往返时间、利用率、丢包率

    计算机网络的八大性能指标,速率.带宽.吞吐量.时延.时延带宽积.往返时间.利用率.丢包率 前置概念 1.速率 2.带宽 3.吞吐量 4.时延 5.时延带宽积 6.往返时间 7.利用率 8.丢包率 计算 ...

  9. 数据丢包怎么修复_网络丢包率如何解决

    网络丢包率如何解决 网络丢包是我们在使用 ping (检测某个系统能否正 常运行) 对目站进行询问时, 数据包由于各 种原因在信道中丢失的现象. ping 使用了 ICMP 回送请求与回送回答报文. ...

最新文章

  1. C++ 判断指针是否为空
  2. LINUX内核分析第四周——扒开系统调用的三层皮
  3. mysql find()方法_Mysql find_in_set()函数使用方法
  4. 快速沃尔什变换(FWT)
  5. mysql函数lead用指定的字符串实现左填充指定长度
  6. delphi 的一些备忘
  7. mysql主从同步故障整理
  8. 什么才是真正的架构设计?
  9. 21点游戏c语言报告,C语言 21点游戏.doc
  10. vue 图片服务器不显示,vue 打包放服务器,css样式不显示-Go语言中文社区
  11. 使用Python上传文件至服务器(不通过表单)
  12. 一文了解大厂的DDD领域驱动设计
  13. myCat实现分库分表
  14. 【论文阅读】TimbreTron : A WaveNet (Cycle GAN(CQT(audio ))) pipeline for musical timbre transfer
  15. (开源)一款可以发文字发图片的实时聊天微信小程序,可以滚动内容到底部
  16. Excel VBA高级编程 -自动去除重复项 自动求和
  17. Windows环境下查看进程和杀死进程的命令
  18. 从基础特质初判一个产品经理潜质
  19. .properties文件加载失败
  20. 关于Github上zheng项目部署问题总结

热门文章

  1. php session 统计在线人数,利用文件属性结合session实现在线人数统计_php实例
  2. Java DatagramPacket 中的坑
  3. IDEA Maven 聚合项目(多模块)搭建--最精简
  4. AI算力的阿喀琉斯之踵:内存墙
  5. Maven 依赖冲突踩坑后,将依赖调解、类加载彻底整明白了
  6. 10 年前的我 VS 10 年后的我
  7. Android 11 正式版发布!
  8. 人工智能规模化落地还有哪些坑?阿里副总裁华先胜连麦详解!
  9. 倒计时 2 天!「2019 嵌入式智能国际大会」全日程大公开!
  10. 阿里在美申请区块链专利;Win10 最新漏洞被发现;MongoDB 4.2 发布​ | 极客头条...