浅析计算机网络(3) -- UDP与TCP

完整版:TCP、UDP报文格式 传输层TCP、UDP报文格式 阅读详情

UDP,TCP

TCP和UDP作为运输层,用来将我们的主机接受到的报文,向上传递给我们的网络层,这个交付过程是怎么样的,TCP和UDP的报文格式,和其具体的应用和其各自的能够提供的服务有那些?TCP的连接又是怎样维持的的,这些问题接下来将要在本篇博客中要写的。

UDP,TCP在哪里服务

TCP和UDP发挥作用的地方是在我们的主机,也就是链路层接收到数据报之后,UDP和TCP开始发挥作用,根据协议的相应规定,将数据写入到相应的SOCKET缓冲区之中,然后应用层从中获取数据。可以将其想象成我们发送快递,我们每一个用户的快递包裹,被放在一个大盒子里,然后发送出去,这个盒子写着一个大的区域名,也就是我们的IP,到了目的地之后,打开大盒子,然后根据包裹上的姓名给每一个用户。

UDP,TCP报文格式

UDP报文格式,16位的源端口号,16位目的端口号,然后是数据段的长度,和数据段的一个校验和,然后是数据区,头部的大小为8个字节,相比于UDP,TCP的内容增加了很多,头部有20个字节,增加了序列号,确认号,一些用来做确认的保留字段,窗口长度,还有16为的紧急指针,但是,紧急指针现在并没有实际的应用,被认为是TCP设计的一个比较失败的地方。其原本的目的是想给一些数据报进行一个优先级的区分,下面逐一解释各字段所能够起到的作用。

大家可以结合我之前一篇Linux下进程通信的socket编程的来看,这样对于各个字段的具体意义和使用地方可能会更清晰。

报文共有字段

源端口号和目的端口号:用来找到目的地和用来得到响应之后,解包分给相应的socket缓冲区中。

数据长度:数据域中数据的总长度。

校验和:通过采用求和回卷然后取反的方式得到一个值,用来对于数据在传送的过程中,是否发生变化的一个检测和标记。

数据域:用来存放数据

TCP特有字段

序列号和确认号:在通过TCP发送数据的时候,很可能一个报文传送不了这么大的数据,因此需要对这些数据报进行切分成一个个的段,然后分别进行传送,为了确保可靠性传输,因此我们需要保证,我们的每一个分的段都已经到达,因此我们需要对这些段进行一个检测和确认,采用序列号和确认号来实现,如何通过序列号和确认号就实现数据的可靠性传输呢?讲完窗长再来回顾。

接收窗口:通过对于窗口长度的一个设定和控制来实现我们在传输过程中的流量控制。

**TCP首部长度:**TCP的首部的长度由于选项字段的存在使得其是可变化的,其存在的作用是什么呢?为什么要对首部长度记录下来呢?其目的就是在我们对数据解包,从中获取数据的时候要使用的,否则我们不知道我们的数据实际长度是多少。

标志字段:该字段中,通过对于的几个选项的标记来实现来用来在连接建立和拆除的时候,进行一个控制。

TCP连接建立和拆除

通过Socket通信,我们可以看到,服务器端,通过一个listen函数进行监听,监听我们制定的端口,然后轮询对接口进行连接请求监听,当有一个连接请求到达,就建立和它的连接,同时服务端分配出相应的socket同时fork出一个新的进程用来和其进行交互,建立连接之后,之间便可以发送消息了,连接建立的过程中发生了三次的握手,三次握手结束之后,连接建立,相互之间便可以发送消息了。

这个握手过程如下所示

握手开始的时候,客户机发送一个请求,其中SYN标记为1,同时自定义一个序列号,然后服务其接收后,返回以个自己的数据序列,然后返回一个ack数据,对其给予确认,然后,客户机接受到确认后,此时在给服务器端一个确认,同时将SYN标记为0,此时的数据报就可以携带数据过去了,也就是说在从服务器收到一个确认包之后,两者之间的连接已经建立起来了。三次数据传递完成,一个TCP连接就算是建立起来了。两者之间就建立了一个可靠性连接,可以进行数据的传递,同时也能够保证数据传递的完整性和有效性。

四次挥手过程如下所示

客户端发送一个数据报,数据报中的FIN标记为1,发送给服务器端之后,服务器端返回一个ACK,给予确认,然后等待一段时间之后,服务器端发送一个FIN标记为1的数据,这个时候,客户端接收到之后给予一个确认,服务器端收到确认,就会将为连接分配的socket对应的缓冲区清理掉,然后这个时候,客户端则等待一段时间之后,将连接关闭掉。

TCP的可靠性

在网络中数据传输的过程中出现丢失是经常的事情,很难再传递的路径中,进行避免,但是我们可以在端的运输层实现,通过在端中进行丢包重传,数据报出错重传等。具体是一个怎样的机制来实现的呢?

数据准确性

首先要保证数据是对的,通过我们前面说的校验和的方式,当检测到数据出错之后,我们就会给它丢一个NCK的报,我们的发送端接收到这个包之后就会根据将之前的包重新交付到网络层,再发送一次,

数据完整性

当我们在发送数据的时候,可能因为中途的路由阻塞等其它原因发生一些丢包现象,如何解决的这个丢包问题呢?首先从根源上考虑,我要如何确认这个包是丢失了的,需要我进行重传,然后就是我要如何重传。这个要从TCP最开始的数据分发开始了,对于一个大的数据,首先是将其切成一段,然后每一个端进行一个序号的标记,也就是序列号,对于这个序列号在选取上还是有一定问题的,下一个序列号也就是上一个序列号加上其数据的长度,这样来进行传输,当接收端接收到一个数据之后,就根据序列号对其进行一个整理,如果发现这一个没有怎么办呢??这又是一个问题了,首先想到的措施是对于每一个被接受到的数据报给予其一个确认,如果发送端没有接收到确认的话,就认为是丢掉了,然后重传,对的,TCP采取了这种思想,但并不完全这样,一个原因是采用的流水线发送,所以多个包同时到达了,如果每一个再都返回一个,是有点浪费带宽的,因此其采取的是累积确认,当多个到达的时候,如果前面的可以很好的排序,那么只是返回最后一个就好了,就确认为前面已经全部接收到了,如果前面有一个缺失的,那么再有数据包传递过来之后,我们收到的还是开始哪一个已经排好序的,如果确认,其将会不停的返回这个缺失的前面一个段进行确认,当我们的客户端,收到了三次冗余的数据确认之后,就会判定这个数据报已经是丢掉了,然后对其重新发送。还有如果数据报超过了一个时间之后,还没有返回数据,这个时候,我们也认为是发生了丢包,这个时间如何确定呢?这个时间并不是死的,而是根据当前的网络状况进行的一个自适应,动态变化的。现在还是没有讲之前说的序列号设计技巧,现在说一下,如果我们的每一个序列都是从0开始,如果我们的数据比较小,那么后续的数据报的序列号也就会比较小,如果紧跟着又是一个数据报,然后这个数据报也是比较小,同时窗口长度是比较长的,因此这两个数据都在里面了,然后这个时候给了我们一个确认,我们会认为是给哪一个数据进行确认呢??所以对于这个序列号进行设定的时候,都会随机生成一个比较大的数据作为基数,然后在其基础上进行序列号的确认。

TCP流控和拥塞控制

先说流控,为什么要用流控呢?什么时候需要流控?流控,顾名思义,流量控制,当有多个发送端,其发送速度较快的时候,而我们接收端处理能力不够了,因此会有一些包从内存中溢出,然后丢掉,而白白的浪费了带宽,同时也可能会让接收端崩溃掉,因此采取流量控制,如果流进的流量过大的时候,我们就采取某种方式,让其减慢速度,这个问题又是比较难解决的了,如何让发送方知道,我现在马上要被淹死了,回想上面对于TCP报格式的讲解中,其中有一个窗口长度字段,根据这个字段可以确认目的地的情况,从而决定,我要发送多少,如果窗口产犊变成了0,这个时候发送端就开始发送一个字节的数据报,类似于试探,直到窗口变大,然后再发送。‘

拥塞的发生不仅仅是在目的地,很可能目的地的窗口长度还是很长的,但是其在中间的路由中已经堵塞了,首先是对于这个堵塞的判断,我们如何判断这个堵塞发生了,有一个什么样的判定标准存在,当其过了这个标准,我们认为它发生了堵塞,如何根据拥塞情况来进行一个数据发送的适应,来减轻拥塞。这个涉及到慢启动,拥塞避免和快速恢复,慢启动是将开始时的发送窗口的长度设置的比较小,然后我们通过对这个窗口进行慢慢的增加,直到出现了拥塞,然后将其降到一半,然后再开始恢复,直到再次到达拥塞状态。

TCP和UDP的应用举例

UDP的非连接和无可靠性数据的保证,同时给它带来了优势,其可以有效的提升传输速度。因此根据其优势和不足,我们就可以很好的找到现实中那些是用了UDP,那些是用了TCP,对数据的可靠性要求不高的,即使丢弃几个包对它来说并没有什么影响,同时比较强调时效的,我们采取UDP,比如视频会议,语音通话,而对于数据传输的可靠性要求比较高的,我们就需要用TCP。

疑问

  • socket和端口对应问题?

这个问题之前对我产生了困扰,说socket要进行一个端口的绑定,那我服务器上如果有多个连接,岂不是把端口全部都占用完了,socket确实要绑定端口号,因为进程要占用端口号,通过端口号,能够确定其属于哪一个进程,便于将数据交付给应用层,但是在建立连接的时候,我们的socket绑定的都是同一个端口号,如何区分呢?因为每一个socket对应一个连接,因为每一个连接的远程IP和端口号是不同的,因此通过这做为一个标记,来区分不同的socket。

  • 一个浏览器打开了两个相同的页面,有几个缓冲区,建立了几个连接?(如果该浏览器不是多进程的,同时也没有本地缓存,远程连接的服务器也是相同的)

答案是取决于我们的浏览器和服务端的连接设置,Apache设置为了keep-alive,我们就建立一个长久的连接,然后从中取数据,否则的话,我们就需要每次连接开始三次握手,每次断开连接,四次挥手,由此来看,设置为Keep-alive,确实是有很多好处,明显提升访问速度,不考虑使用环境,而去谈某种方式的好坏都是耍流氓,任何一种方法,在不同的应用环境下,都能够展现出其独自的优势和特点,如果不设置keep-alive最明显的优势是可以提高并发量,但是如果设置了keep-alive明显可以提升单一用户的访问速度。

浅析TCP字节流与UDP数据报的区别 “TCP是一种流模式的协议,UDP是一种数据报模式的协议”,这句话相信大家对这句话已经耳熟能详~但是,“流模式”与“数据包模式”在编程的时候有什么区别呢?以下是我的理解,仅供参考! 1、TCP 打个比方比喻TCP,你家里有个蓄水池,你可以里面倒水,蓄水池上有个龙头,你可以通过龙头将水池里的水放出来,然后用各种各样的容器装(杯子、矿泉水瓶、锅碗瓢盆)接水。 上面的例子中,往水池里倒 阅读详情

相关推荐

【网络编程】TCP 3次握手&4次挥手浅析

大家都知道传输层中的TCP协议是面向连接的,提供可靠的连接服务,其中最出名的就是三次握手和四次挥手。

天天新知 1928

TCP/UDP报文格式及各种通信机制简介

TCP/UDP报文及各种通信机制简介一、UDP报文二、TCP报文三、TCP通信机制1,确认应答机制2,超时重传机制3,滑动窗口及快重传机制4,流量控制5,拥塞控制及慢启动机制6,延迟应答7,捎带应答四、总结 一、UDP报文     UDP报文结构如下图所示:     UDP报文中包含 :(1) 16位源端口和目的端口,用于表示自己的端口号和将要发送的目的端口号。 (2) 16位UDP长度,表示8字节报头和UDP数据的总长度,用于确定报文长度。 (3) 16位校验和,用于在接收端对比校验,确定接收的UDP报

a15980352273的博客 1万+

vb---server client (socket)

vb---server client (socket)

TCP和UDP报文格式

TCP报文 TCP 报文是 TCP 层传输的数据单元,也称为报文段。TCP 报文中每个字段如图所示。 各个字段的含义: 源端口和目的端口字段: TCP源端口(Source Port):源计算机上的应用程序的端口号,占 16 位。 TCP目的端口(Destination Port):目标计算机的应用程序端口号,占 16 位。 序列号字段: CP序列号(Sequence Number):占 32 位。它表示本报文段所发送数据的第一个字节的编号。在 TCP 连接中,所传送的字节流的每一个字节都会按顺序编号。当SY

浅时光-Trister 2557

调用WPS的接口打开PPT,并实现翻页

工程使用VS2012编译,需在程序运行的机器上安装WPS,否则接口调用会失败。 目前网上可免费下载的WPS版本繁多,经过测试WPS2010、2012、2013、2016四个版本,发现每个版本或是调用的接口不一样,或是同样的接口调用以后有些有作用,有些无作用,经过筛选,最终确定使用2013版本,此版本下,开PPT窗口的时候,不会像2016有明显较宽的黑边,同时页面设置成开窗大小再关窗后,不会像2010和2012那样强制保存页面设置参数,影响以后开窗。

SRE校招面试全攻略:从基础理论到实战场景解析

本文为SRE(站点可靠性工程)校招面试提供全面攻略,涵盖计算机基础、运维核心技能、场景设计与系统架构等关键模块。文章结合真实面试真题,解析了从Linux原理、网络协议到容器化、监控告警等实战考点,并分享了高可用设计、故障排查等工程思维,旨在帮助应届生夯实基础、理清思路,从容应对SRE校招挑战。

bush的博客 643

传输层之UDP与TCP详解

确认应答的过程如上所示,发送方发送了一个1-669的数据,序列号为669(这一段数据的最后一个的下标),接收方收到后返还一个ACK,改返还的报文中的确认序号为700(669+1),当然也可以在发送这个ACK的时候同时发送数据,将这个报文的序列号变为自己发送数据的序列号,这就是TCP。TCP有了以上这些机制,已经可以可靠且高效的发送数据,但是网络中的情况是非常复杂的,如果在网络中发送了拥塞(也就是常说的网络很卡的状态),TCP的超时重传就不能用在这里,发送大量的重复数据反而会使得网络更加拥塞,所以引入了。

siyi441的博客 1116

智能座舱音频系统集成与调试:从芯片选型到音质优化实战

在智能座舱域控制器架构中,音频系统已从简单的功放加扬声器演进为SoC、数字音频总线、外部DSP与多通道功放协同的复杂子系统。TDM总线的时隙分配、PDM麦克风阵列的信号完整性,以及AEC回声消除算法如何与硬件协同,直接决定多音区体验和语音交互的可靠性。工程实践中,音频调试的关键在于先理顺供电、接地、时钟与数据路由,再针对功放削波、采样率失配、TDM slot错位等典型问题进行系统性排查。从芯片选型到系统级指标验收,只有将音频链路视为整车电子电气架构的一个协同整体,才能真正实现从“响”到“好听”的跨越。本文结

weixin_30162121的博客 364

TCP/UDP协议 (详解)

TCP是基于连接的,而UDP是基于非连接的。 tcp传输数据稳定可靠,适用于对网络通讯质量要求较高的场景,需要准确无误的传输给对方。比如,传输文件,发送邮件,浏览网页等等 udp的优点是速度快,但是可能产生丢包,所以适用于对实时性要求较高但是对少量丢包并没有太大要求的场景。比如:域名查询,语音通话,视屏直播等。udp还有一个非常重要的应用场景就是隧道网络,比如:vpn,VXLAN.

书生-w的博客 2万+

多核异构处理器核间通信:从共享内存到RPMsg协议的实战解析

在多核异构处理器架构中,核间通信是实现高效协同计算的核心技术。其基本原理是通过共享内存作为数据交换的物理媒介,配合硬件信号机制实现同步与通知。从技术价值看,它解决了不同架构核心间的数据共享与指令协同问题,是释放异构计算潜力的关键。在应用场景上,该技术广泛应用于智能物联网设备、汽车电子和工业控制等领域,用于连接高性能应用处理器与实时微控制器。本文以典型的ARM Cortex-A与Cortex-M组合为例,深入剖析了基于共享内存和RPMsg协议的通信机制,涵盖了从硬件基础到软件协议栈的完整实现链路,并提供了针对

weixin_26969269的博客 447

Chapter2、HDR流水线

HDR内容的获取(不同曝光时间的图片合成) 相机响应函数 HDR视频

qq_55621259的博客 2597

运维锅总浅析计算机网络

计算机网络本质是什么?如何理解物理层的电气和机械特性?如何理解WLAN理层的电气和机械特性?如何理解数据链路层帧的封装、错误检测和纠正?如何理解网络层的路径选择和数据包的转发?为什么TCP要三握手四次挥手?为什么UDP 不可靠?TCP与UDP应用场景是什么?希望读完本文能帮您解答这些疑惑!

专注于输出大概有用的软硬件技术! 1809

DySAT+: Enhancing Dynamic Graph Representation Learning with Multi-Head Self-Attention and Temporal-

本文深入探讨了DySAT+模型在动态图表示学习中的创新应用,通过多头时空注意力机制和层级信息融合策略,有效解决了动态图数据中的时间维度信息捕捉和结构演变动态适应问题。该模型在社交网络异常检测和金融交易网络分析等场景中表现出色,显著提升了预测准确率和响应速度。

weixin_29035405的博客 334

移动端IM/推送系统的协议选型:UDP还是TCP?

1、前言 对于有过网络编程经验的开发者来说,使用何种数据传输层协议来实现数据的通信,是个非常基础的问题,它涉及到你的第一行代码该如何编写。从PC时代的IM开始,IM开发者就在为数据传输协议的选型争论不休(比如:《为什么QQ用的是UDP协议而不是TCP协议?》这样的问题,隔一段时间就能在社区里看到)。到了移动互联网时代,鉴于移动网络的不可靠性等特点,再加上手机的省电策略、流量压缩等,为这个问题的回答增了更多的不确定因素。对于有选择困难证的人来说,基于以上因素,加上UDP和TCP协议的本质差异,这样的选择确实

u013712343的博客 2005

CAPL未来发展方向展望

通过本文的学习,读者应该对CAPL的未来发展方向有了初步的了解。随着汽车电子系统的不断发展,CAPL也在不断演进,以支持更多的技术和应用场景。希望读者能够通过不断的学习和实践,掌握更多的CAPL技巧,提高自己的开发能力。

闲人编程的博客 1182

基于STM32的嵌入式平台实现EtherCAT主站

本文将介绍如何在基于STM32的嵌入式平台上构建EtherCAT主站,并提供相应的源代码。使用SOEM库提供的API函数,我们可以实现与EtherCAT从站设备的实时通信和数据交换。在STM32的代码中,使用SOEM库提供的API函数初始化EtherCAT主站。在SOEM库中,我们可以找到EtherCAT主站的实现代码和相关的API函数。使用SOEM库提供的API函数实现EtherCAT主站的功能,包括发送和接收EtherCAT数据帧、处理从站设备的状态等。确保连接正常并且设备能够相互通信。

CodeSageX的博客 2832

TCP套接字编程核心API浅析

TCP套接字编程核心API浅析 引言:学习了计算机网络基础协议,是不是跃跃欲试,那开始计算机网络编程之旅吧。本篇笔记介绍了TCP客户端与服务器通信使用的底层API,并分析了其与TCP三次握手,四次挥手的关联,希望对大家有所帮助。 TCP套接字编程核心API浅析 一、TCP编程核心API 1.1、socket() 1.2、bind() 1.3、listen() 1.4、accept()...

邓博学习笔记 1748

YOLOv8性能提升:引入华为GhostNetv1特征提取网络

本文提出一种轻量化改进方案,将GhostNetV1作为YOLOv8的主干网络,以提升移动端部署效率。通过Ghost模块的两步特征生成机制(初级卷积+廉价操作),显著降低了30%的计算量(FLOPs)和参数量,精度损失控制在1%以内。实验表明,改进后的模型在骁龙865芯片上推理速度提升25%。核心创新包括:1)用GhostBottleneck替换CSP模块;2)保留FPN+PAN结构确保多尺度检测能力;3)提供完整的PyTorch实现方案。该工作为资源受限场景的目标检测提供了实用解决方案,未来可结合注意力机制

shrgegrb的博客 1180

计算机网络浅析

LAN:局域网 local Area Network WAN: 广域网 Wide Area Network WAN= LAN +LAN+....+LAN 多个LAN 组成 WAN OSI 七层协议 : TCP/IP协议: 网络协议标准 7 应用层 4 应用层 HTTP,FTP , SMTP 6 表现层 ...

u012343977的博客 190

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

上一篇: 浅析计算机网络(1) -- 主机如何上网
下一篇: Java反射
coderbean
博客等级 码龄11年 12粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值