计算机网络漫谈之传输层 咱们讨论了如果需要确定一个计算机上的不同网络程序(比如QQ和浏览器),需要端口的标识,但是IP头部和帧的头部都没有端口的标识字段,需要新的协议。和前面IP协议的实现套路一样,我们需要一个空间来存放端口号,因此就有了传输层的协议TCP和UDP。最简单的实现就是UDP协议,它的格式几乎就是在数据前面,加上端口号。UDP数据包,也是由”标头”和”数据”两部分组成。

“标头”部分主要定义了源端口和接收端口,”数据”部分就是具体的内容。具体的Head结构如下所示:

然后,把整个UDP数据包放入IP数据包的”数据”部分,而前面说过,IP数据包又是放在以太网数据包之中的,所以整个以太网数据包现在变成了下面这样:

目前我们的数据包更加完善了,也更加能体现层层封装的意思。绿色头部是UDP头部,红色头部是IP头部,蓝色头部是帧的头部,”上层标头+数据”作为下层的数据。

UDP协议的优点是比较简单(它的数据包包头几乎只有端口和长度),容易实现,但是缺点是可靠性较差,一旦数据包发出,无法知道对方是否收到。为了解决这个问题,提高网络可靠性,TCP协议就诞生了。这个协议非常复杂,但可以近似认为,它就是有确认机制的UDP协议,每发出一个数据包都要求确认。如果有一个数据包遗失,就收不到确认,发出方就知道有必要重发这个数据包了。

因此,TCP协议能够确保数据不会遗失。它的缺点是过程复杂(TCP三次握手、四次挥手等)、实现困难(数据重传机制、流量控制机制等)、消耗较多的资源。TCP数据包和UDP数据包一样,都是内嵌在IP数据包的”数据”部分。TCP数据包也是由“标头”和“数据”组成的。当然,“标头”是重点。下面我们一起来看看TCP数据包的“标头”:

明显比UDP的数据包“标头”复杂多了,我们下面来依次解释每个字段的含义。我尽量以最简单的方式来解释每个字段,目前你大概知道是干什么的就行了:

  • 源端口与目的端口: 各占16位,分别写入源端口号和目的端口号。
  • 32位序列号: 占32位,能唯一标识一次通信中的数据包序号,可以看作是一个数据包的ID。
  • 32位确认序列号: 占32位,作为确认收到使用,比如如果想确定上面32位序列号,就把此值填为其值加1。
  • 首部长度: 占4位.表示整个“标头”的长度,所以TCP报头最大为60字节。
  • URG: 占1位,紧急指针标志位,当URG=1时,表明紧急指针字段有效.它告诉系统中有紧急数据,应当尽快传送,这时不会按照原来的排队序列来传送.而会将紧急数据插入到本报文段数据的最前面。
  • ACK: 占1位,当ACK=1时,确认序列号才有效,当ACK=0时,确认序号ack无效。
  • PSH: 占1位,推送操作,很少用,没有了解。
  • RST: 占1位,当RST=1时,表明TCP连接出现严重错误,此时必须释放连接。 (9)SYN: 占1位,请求连接的标志。
  • FIN: 占1位,释放链接的标志.
  • 16位窗口的大小:占16位,表示期望对方发送的字节数。
  • 16位检验和: 占16位,用于检验包数据是否正确。
  • 紧急指针: 占16位,只有当URG=1时的时候,紧急指针才有效,它指出紧急数据的字节数。

总链:计算机网络漫谈系列文章

计算机网络漫谈之UDP和TCP的更多相关文章

  1. 【转帖】计算机网络协议(三)——UDP、TCP、Socket

    计算机网络协议(三)——UDP.TCP.Socket 2019年09月04日 11:09:41 to_be_better_one 阅读数 28794 文章标签: 计算机网络UDPTCPSocket 更 ...

  2. 计算机网络漫谈之OSI七层模型和TCP/IP四层模型

    在 什么是网络? 中,你已经知道计算机网络是物理连接的"局域网"和工作于这个局域网上的"网络协议",并且我们的重心是网络协议.有关网络协议,按照目前的分层方式主 ...

  3. 一些重要的计算机网络协议(IP、TCP、UDP、HTTP)

    一.计算机网络的发展历程 1.计算机网络发展 与其说计算机改变了世界,倒不如说是计算机网络改变了世界.彼时彼刻,你我都因网络而有了交集,岂非一种缘分? 计算机与网络发展大致经历如下过程:

  4. 移动端IM系统的协议选型:UDP还是TCP?

    1.前言 对于有过网络编程经验的开发者来说,使用何种数据传输层协议来实现数据的通信,是个非常基础的问题,它涉及到你的第一行代码该如何编写. 从PC时代的IM开始,IM开发者就在为数据传输协议的选型争论 ...

  5. Android程序员必知必会的网络通信传输层协议——UDP和TCP

    1.点评 互联网发展至今已经高度发达,而对于互联网应用(尤其即时通讯技术这一块)的开发者来说,网络编程是基础中的基础,只有更好地理解相关基础知识,对于应用层的开发才能做到游刃有余. 对于Android ...

  6. java 网络通信传输层协议——UDP和TCP

    本文原文由作者“zskingking”发表于:jianshu.com/p/271b1c57bb0b,本次收录有改动. 1.点评 互联网发展至今已经高度发达,而对于互联网应用(尤其即时通讯网专注的即时通 ...

  7. 计算机网络 0.初识Internet与TCP/IP协议

    互联网,即因特网,Internet.互联网是一个世界范围的计算机网络.连接了世界上无数的计算设备,这些计算设备为PC.基于Linux的工作站,serverservers等等. 这些设备依据其作用不同可 ...

  8. Java第三阶段学习(八:网络通信协议、UDP与TCP协议)

    一.网络通信协议 1.概念: 通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则,在计算机网络中,这些连接和通信的规则被称为网络通信协议,它对数据的传 ...

  9. 牛客网Java刷题知识点之TCP、UDP、TCP和UDP的区别、socket、TCP编程的客户端一般步骤、TCP编程的服务器端一般步骤、UDP编程的客户端一般步骤、UDP编程的服务器端一般步骤

    福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号:   大数据躺过的坑      Java从入门到架构师      人工智能躺过的坑         Java全栈大联盟   ...

随机推荐

  1. js中date类型的格式转化为yyyy-MM-dd HH:mm:ss的String类型

    在vue中或其他框架中可以在Date的原型链中添加Format的方法,如ruoyi可以写在main.js中更好,如果写在utils还需要去导入包. 正常的js直接放到utils.js就好 Date.p ...

  2. CSS 奇技淫巧 | 妙用混合模式实现文字镂空波浪效果

    本文将介绍一个小技巧,通过混合模式 mix-blend-mode 巧妙的实现文字的镂空波浪效果. 起因 一日,一群友私聊问我.如何使用 CSS 实现下述效果,一个文字的波浪效果: 我当时想都没想,就回 ...

  3. Python3入门系列之-----算术运算符|比较运算符|赋值运算符|逻辑运算符|成员运算符|身份运算符

    什么是运算符? 本章节主要说明Python的运算符.举个简单的例子 1 +2 = 3 . 例子中,1 和 1.2 被称为操作数,"+" 称为运算符. Python语言支持以下类型的 ...

  4. salesforce零基础学习(一百零八)MFA

    本篇参考:https://security.salesforce.com/mfa https://sfdc.co/bvtuQT  (MFA官方研讨会的文档) https://sfdc.co/iwiQK ...

  5. 使用 PyTorch Lightning 将深度学习管道速度提高 10 倍

    ​  前言  本文介绍了如何使用 PyTorch Lightning 构建高效且快速的深度学习管道,主要包括有为什么优化深度学习管道很重要.使用 PyTorch Lightning 加快实验周期的六种 ...

  6. 某个buuctf的题(easy_tornado)

    题目:http://88099f53-12b6-470a-9993-b73e4155940e.node3.buuoj.cn/ 1首先看三个文件的内容 2简单分析 如果出题人没整一些花里胡哨的,那么fl ...

  7. FastAPI 学习之路(十六)Form表单

    系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) FastAPI 学习之 ...

  8. 工作3年的Java程序员,轻松拿到阿里P6Offer,只因为他搞明白了Redis这几个问题!!

    Redis中的多路复用模型 Redis6用到了多线程?那多线程应用在哪些地方,引入多线程后,又改如何保证线程安全性呢? 同时,如何在性能和线程安全性方面做好平衡? 关于Redis的单线程模型 在Red ...

  9. Mac录屏同时录制系统声音和画外音(Soundflower无法安装解决方案)

    个人博客地址:xzajyjs.cn 前言 以前一直有录屏的需求,但苦于自带的QuickTime 无法录制内屏声音,一直使用的是第三方的app.近期开腾讯会议需要录屏,但主持人本身没有开启录屏权限,只好 ...

  10. perl打开读取文件(open)

    在Perl中可以用open或者sysopen函数来打开文件进行操作,这两个函数都需要通过一个文件句柄(即文件指针)来对文件进行读写定位等操作.下面以open函数为例:1:读:open(文件句柄,&qu ...