TCP网络协议

目录

1.TCP协议段格式

2.TCP原理


1.TCP协议格式

TCP协议的格式我们可以看到下图

源/目的端口号:表示数据是从哪个进程来,到哪个进程去;

4位TCP报头长度:表示该TCP头部有多少个32位bit(有多少个4字节);所以TCP头部最大长度是 15 * 4 = 60

6位标志位:

URG:紧急指针是否有效 ACK:确认号是否有效

PSH:提示接收端应用程序立刻从TCP缓冲区把数据读走

RST:对方要求重新建立连接;我们把携带RST标识的称为复位报文段

SYN:请求建立连接;我们把携带SYN标识的称为同步报文段

FIN:通知对方,本端要关闭了,我们称携带FIN标识的为结束报文段

16位校验和:发送端填充,CRC校验。接收端校验不通过,则认为数据有问题。此处的检验和不 光包含TCP首部,也包含TCP数据部分。

16位紧急指针:标识哪部分数据是紧急数据; 4

0字节头部选项:暂时忽略;

32位序号/32位确认号和16位窗口大小我们会在后面提到时再解释 。

2.TCP原理

 TCP对数据传输提供的管控机制,主要体现在两个方面:可靠性和效率

这些机制和多线程的设计原则类似:保证数据传输安全的前提下,尽可能的提高传输效率。

这里我们需要辨析两个概念:

可靠性:指数据发送后发送方能够知道接收方是否收到了数据

安全性:指的是数据被截获后不容易被理解内部意思或者篡改,通过加密实现 

2.1 确认应答机制(可靠性机制)

 确认应答就是发送出去的数据对方有没有收到发送方能够知道

所以TCP要对发送的数据进行编号,然后才能明确应答报文是在应答哪个数据。

TCP将每个字节的数据都进行了编号。即为序列号。

下面就是一个确认应答的经典例子:

 第一次发送数据(1-1000)代表一次性发送了1000字节的数据(一个TCP数据报,长度是1000,序号是1)。

而此时应答报文中的确认序号就是1001,应答报文可以视为只有TCP报头,没有载荷。在1001这个报头里,意思是<1000的数据都已经收到了,接下来A要从1001开始往后发送

如何区分一个报文是普通报文还是应答报文? 

 在TCP报头中有一个6位的标志位,其中ACK就代表是否为应答报文。ACK为0代表不是,ACK为1代表是应答报文。


我们这里再解释一下UDP面向数据报传输TCP面向字节流传输,这个指的其实是应用层的角度。他们两个协议在发送数据的过程中实际都是采用数据报的形式。

我们先看UDP:

假如B这边调用receive方法,第一次调用读出来的是1111,第二次读出来的是2222,第三次读出来的是3333。而UDP 的接收缓冲区,就相当于一个链表,里面有三个节点,每次读都得以节点为单位。这就是所谓的面向数据报。

再看到TCP:

假如B调用InputStream.read(buffer)

byte[1] buffer 读出来就是1

byte[3] buffer 读出来就是111

byte[5] buffer 读出来就是11112

byte[7] buffer 读出来就是1111222

TCP的接收缓冲区更像一个数组,若干个TCP数据报的载荷会一直追加到这个数组里,彼此之间融为一体,这就是面向字节流

2.2 超时重传(可靠性机制) 

在确认应答的情况下,如果收到了ACK那么一切照常,但是假如因为丢包等因素没有收到ACK那么就会进入超时重传机制。

比如业务数据丢了:

或者ACK丢了:

 这两种情况在发送方等待一段时间后没有收到ACK就会触发重传,重新去发送数据。

需要注意第二种情况(当然也可能数据只传输一半就丢包了),此时超时重传机制就会导致发送了部分的重复数据,但是此时接收方是可以根据序号来进行数据去重的,所以大家可以不用担心。

几点需要注意的:

1.在数据发送出去之后,就会同时发数据内容+校验和,数据接收方会按照同样的规则计算校验和并比较,在任意传输的过程中,如果某个中间节点发现校验和不对都会触发主动丢包 

2.超时重传的数据仍有丢包的可能,假如超时重传后又丢包则超时重传触发的时间就会延长,这里的等待间隔是会随着时间推移越来越大的,因为频繁丢包代表当前网络环境差,所以会等待更久再去重传。累积到一定次数就会认为网络异常,强制关闭连接

确认应答与超时重传是保证TCP可靠性的最核心机制。 

2.3 连接管理机制(可靠性保证)

 在正常情况下,TCP要经过三次握手建立连接,四次挥手断开连接。这就是我们常说的三次握手四次挥手。

2.3.1 建立连接(三次握手)

主动的一方是客户端,三次握手一定是客户端发起的。这个过程我们可以用下图表示:

其中SYN:请求建立连接;我们把携带SYN标识的称为同步报文段

 看上去好像是四次对吧,但其实我们习惯将中间两部合并成一步因为B返回的SYN和ACK都是操作系统内核收到A的SYN后立刻返回的。于是就有了下图

其中确认报文与同步报文的确定也用到了我们之前提到了6为标志位

 这就是我们三次握手的过程,此时A与B的连接就建立好了。

2.3.2 三次握手的意义

这个操作相当于“投石问路”,在正式通信之前要先确定通信链路是否通畅,如果不通畅那后面大概率会丢包。其次在建立连接的过程中服务器与客户端还会协商一些重要数据。

那为什么是三次而不是四次或者更多呢,可以,但是没必要,因为效率会降低,而低于三次则无法起到判断通信链路是否通畅的作用。具体我们看到下面的解释。


假如张三和李四准备开黑打游戏,那么开黑前就得验证他们各自的耳机和麦克风工作是否正常。那么就有了下面的场景

1.张三:喂喂喂,听得到吗(相当于SYN)

2.李四:OKOK(相当于SYN+ACK),此时就验证了张三的麦克风和李四的耳机没问题

3.张三:OK,听得到(相当于ACK),此时验证了 李四的麦克风和张三耳机正常

通过这三步我们就可以验证通信链路是否通畅

2.3.4 断开连接(四次挥手) 

断开连接的过程客户端和服务器都可以发起。具体过程看下图:

其中FIN:通知对方,本端要关闭了,我们称携带FIN标识的为结束报文段

那为什么四次挥手中间的两次操作不能合并呢?

 B返回ACK是内核行为。操作系统内核收到FIN后,就会立刻返回ACK。而接下来B的FIN是用户代码行为。用户在代码中调用socket.close()方法才会触发FIN。正因为B发送ACK和FIN有着不可忽视的时间间隔,所以才不能合并

2.4 TCP的状态 

 我们先看一下TCP在三次握手与四次挥手的过程状态示意图:

 图上主要有三部分信息:

1.三次握手四次挥手中间数据传输的流程

2.三次握手四次挥手过程中,TCP状态的转换

3.每个环节涉及到的socket API(由于Java使用的是Java自己包装过的API,所以在这里我们不讨论)

我们重点来谈一下各种状态的意义:

1.LISTEN :服务器状态,代表服务器启动完毕,已经绑定端口成功

2.ESTABLISHED:连接建立完毕,随时可以进行通信

3.CLOSE_WAIT:被动接受FIN的一方会进入 CLOSE_WAIT。这个状态就是自己收到了FIN也返回了ACK,在自己发送FIN之前的状态。这个状态的意思就是等待代码中调用close方法,发送FIN。如果服务器存在大量CLOSE_WAIT说明代码可能某处忘记了close socket

4.TIME_WAIT:主动发起FIN的一方,会进入TIME_WAIT。主动的这一方,收到对方的ACK之后就会进入TIME_WAIT状态,而不是直接进入CLOSE状态,而是会等待一段时间后才进入CLOSE状态彻底释放连接。

为什么是TIME_WAIT的时间是2MSL? 

MSL是TCP报文的最大生存时间,

因此TIME_WAIT持续存在2MSL的话 就能保证在两个传输方向上的尚未被接收或迟到的报文段都已经消失(否则服务器立刻重 启,可能会收到来自上一个进程的迟到的数据,但是这种数据很可能是错误的);

同时也是在理论上保证最后一个报文可靠到达(假设最后一个ACK丢失,那么服务器会再重 发一个FIN。这时虽然客户端的进程不在了,但是TCP连接还在,仍然可以重发  LAST_ACK);

2.5 滑动窗口机制(效率机制)

 效率和可靠性本身是冲突的,但TCP还是会在保证可靠性的前提下尽量提高效率。

滑动窗口本质上就是把等待ACK的时间重叠起来,减少等待时间,相当于提高了效率。

下面是我们原本的一发一收方式示意图

既然这样一发一收的方式性能较低,那么我们一次发送多条数据,就可以大大的提高性能(其实是将多 个段的等待时间重叠在一起了)。 这就是滑动窗口的原理。于是就变成了下图 

 

 不再是发送一条等待一条,而是发送一批,等待一批ACK

 首先批量发送1001-2000;2001-3000;3001-4000;4001-5000的数据

 针对这四个数据等待ACK,当2001ACK返回A时,此时代表1001-2000的数据已经被收到

 滑动窗口就可以右移,发送5001-6000的数据

那么如果出现了丢包,如何进行重传?这里分两种情况讨论 

 情况一:数据包已经抵达,ACK被丢了。

 如果1001丢了,2001到了,此时对于A来说,就知道1-1000这个数据也是到了。后一个会覆盖前一个。

这种情况下,部分ACK丢了并不要紧,因为可以通过后续的ACK进行确认; 


情况二:数据包就直接丢了。 

 当某一段报文段丢失之后,发送端会一直收到 1001 这样的ACK,就像是在提醒发送端 "我想要的是 1001" 一样;

如果发送端主机连续三次收到了同样一个 "1001" 这样的应答,此时客户端就会明白1001丢了,就会将对应的数据 1001 - 2000 重新发送;

这个时候接收端收到了 1001 之后,再次返回的ACK就是7001了(因为2001 - 7000)接收端 其实之前就已经收到了,被放到了接收端操作系统内核的接收缓冲区中;

2.6 流量控制(可靠性机制) 

流量控制本质上就是对滑动窗口的制约。

滑动窗口的窗口大小越大,发送速率越快,流量控制就是针对发送速率进行制约。

接收端处理数据的速度是有限的。如果发送端发的太快,导致接收端的缓冲区被打满,这个时候如果发送端继续发送,就会造成丢包,继而引起丢包重传等等一系列连锁反应

因此TCP支持根据接收端的处理能力,来决定发送端的发送速度。这个机制就叫做流量控制(Flow Control); 

接收端将自己可以接收的缓冲区大小放入 TCP 首部中的 "窗口大小" 字段,通过ACK端通知 发送端;

窗口大小字段越大,说明网络的吞吐量越高而流量控制就是通过接收缓冲区的剩余空间来控制下一次发送时窗口大小

接收端一旦发现自己的缓冲区快满了,就会将窗口大小设置成一个更小的值通知给发送端; 发送端接受到这个窗口之后,就会减慢自己的发送速度;

如果接收端缓冲区满了,就会将窗口置为0;这时发送方不再发送数据,但是需要定期发送 一个窗口探测数据段,使接收端把窗口大小告诉发送端。


接收端如何把窗口大小告诉发送端呢?在TCP首部中,有一个16位窗口字段,就是存放了窗口大小信息;

那么问题来了,16位数字最大表示65535,那么TCP窗口最大就是65535字节么? 实际上,TCP首部40字节选项中还包含了一个窗口扩大因子M,实际窗口大小是 窗口字段的值左移 M 位; 

2.7 拥塞控制(可靠性机制) 

 下图是我们发送一次数据的简易流程

 从A发送数据到B,期间还需要经过许多中转设备,因此我们还需要考虑中间设备的转发能力,这就是拥塞控制的意义。那我们该如何去衡量中间设备的处理能力呢?

由于中间设备的数量和设备参数等我们全部都不知道,所以我们采取的方式是“做实验”。

1.刚开始按照小的窗口来发送

2.如果不丢包,说明中间网络比较通常,可以逐渐放大发送窗口的大小

3.放大到一定程度,速率比较快,网络就容易出现拥堵,进一步出现丢包。当发送方发现丢包后,就会减小发送窗口

反复在2和3之间循环,通过这个过程来达到一个动态平衡,而以上过程可以量化成下图 

初始的时候拥塞窗口从一个很小的值开始,指数增长(慢增长)

如果窗口大小达到设定的阈值后,就改为线性增长

当线性增长到一定程度,可能会丢包,此时把窗口大小回归到一个特别小的窗口 

之后重复上述过程,同时也会把刚才线性增长的阈值进行调整(变为网络拥塞时的\frac{1}{2}

注意:流量控制和拥塞控制都能影响发送方滑动窗口的大小,而最终滑动窗口的大小取流量控制的窗口和拥塞控制窗口的较小值 

2.8 延时应答机制(效率机制) 

在前面我们知道,流量控制通过ACK告知发送方窗口大小多少合适,这是根据接收方剩余缓冲区大小来决定的。那我们如果让ACK等待一段时间后再返回会怎么样呢?

假设我们立刻返回ACK,可能缓冲区大小是5KB

那我们稍等一会(例如200ms), 在这段时间内应用程序可能取走了很多数据,缓冲区的空间可能就变成了100KB,这样我们就能在保证网络通常的前提下提高效率

一定要记得,窗口越大,网络吞吐量就越大,传输效率就越高。我们的目标是在保证网络不拥塞的情况 下尽量提高传输效率; 

那么所有的包都可以延迟应答么?肯定也不是;

数量限制:每隔N个包就应答一次;

时间限制:超过最大延迟时间就应答一次;

具体的数量和超时时间,依操作系统不同也有差异;一般N取2,超时时间取200ms;

2.9 捎带应答机制(效率机制) 

捎带应答是建立在延时应答的基础上的。我们发现,很多情况下,客户端服务器在应用层也是 "一发一收" 的,但是由于我们知道ACK和响应数据的返回一般是有一定的时间差的,于是我们就可以让ACK延时一会,这样就有可能让响应数据和ACK的返回时间重合。我们可以通俗地理解成搭“顺风车”。

 捎带应答机制可能发生在任何阶段,但也可能不发生。

2.10 面向字节流 

关于这一点我们在文章的上部分已经讲过了,大家忘记的可以回去看看。

但是面向字节流的一个问题就是可能会带来粘包问题。

首先要明确,粘包问题中的 "包" ,是指的应用层的数据包。

在TCP的协议头中,没有如同UDP一样的 "报文长度" 这样的字段,但是有一个序号这样的字 段。

站在传输层的角度,TCP是一个一个报文过来的。按照序号排好序放在缓冲区中。

站在应用层的角度,看到的只是一串连续的字节数据。

那么应用程序看到了这么一连串的字节数据,就不知道从哪个部分开始到哪个部分,是一个 完整的应用层数据包。 通俗地说就是应用程序不知道缓冲区的数据哪一部分是属于那一部分的,仿佛全部数据黏在了一起。

如何避免粘包问题? 

归根结底就是一句话,明确两个包之间的边界

正如我们之前自定义应用层协议那样,我们可以采用以下方法来避免粘包问题:

1.使用分隔符,如“;”或者“\n”等

2.约定每一部分数据的长度

2.11 TCP异常情况处理 

(1)主机关机(正常关机):按照程序关机,此时会先杀死所有进程,然后TCP线程就会释放PCB,之后释放文件描述符表上对应的文件资源(相当于调用close)。在这个过程中会发生四次挥手,假如一切正常就会继续关机,如果四次挥手还没执行完就已经关机,对端重传FIN多次,没有响应也就放弃。

(2)程序崩溃:同上。虽然进程没了,但是本身TCP连接由内核负责,内核仍会继续完成四次挥手的过程

(3)主机掉电

1.接收方掉电:对方尝试发送数据,发现没有收到ACK,尝试重传,仍然没有ACK,发送方尝试重新连接,如果重连也不成功,就认为网络出现严重问题,也就自然放弃

2.发送方掉电:接收方在等待发送方发送数据,由于发送方没了这个数据显然发送不过来了。但是接收方不知道,到底是对方没发还是对方出现了问题。(接收方区分不了)

接收方如果一段时间没有收到数据,就会定期给发送方发送“心跳包”,接收方给发送方发送一个特殊的报文(ping),对方回一个(pong),如果对方回了(pong)就认为处于正常状态,否则就认为对方挂了。而“心跳包”的作用就是周期性判定对方是否存活。

(4)网线断开:和主机掉电相同

2.12 TCP和UDP对比 

1.如果关注可靠性,优先考虑TCP

2.如果单个传输数据较大(UDP报文上限64KB),优先考虑TCP

3.使用UDP,对于可靠性要求不高,但对于性能要求很高

4.如果要进行“广播”(一个发送方N个接收方),优先考虑UDP

当然我们还有同时兼顾可靠性与效率的KCP协议,适用于MOBA对抗类游戏。(但是KCP效率不如UDP可靠性也不如TCP,是在两者之间折中) 

一个经典的问题:如何使用UDP实现可靠传输? 

在应用层代码里面参考TCP策略实现

 

invictusQAQ
关注 关注
  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TCP协议(1) -- 认识TCP协议格式
Aqua_yyds的博客
02-17 606
这里举一个例子来了解一下端口号:先来了解一下服务器端口 (目的端口)假如, 有一天, 我不想当程序猿了, 我想改行, 做一名厨师… 为了实现我这个梦想, 我就去了某个大学的食堂, 在这个食堂的第 2 餐厅, 第 12 号窗口, 开了一家北京烤鸭店(此处, 第 2 餐厅, 就相当于我的服务器的 IP 地址, 第 12 号窗口, 就相当于我在这个 IP 地址里的一个端口号)
网络通信 --- 传输层协议 (UDP 和 TCP)
m0_64247824的博客
05-29 1202
如果四次挥手 没有完全结束,比如,对方发过来了 FIN,电脑还没有来得及发送 ACK 就关机了,此时对端就会重传 FIN ,对端重传了几次 FIN 之后,都没有接收到 ACK,那就会尝试重置连接;就像搭顺风车一样,如果两个目的地一样,但是上车的时间可能不同的两个人要坐同一辆车,那么时间早的人可以等一等时间比较晚的人一起坐车,这样司机的效率提高了,车费也平摊了~~由于在网络通信的过程中,数据在传输的过程中会经过许多的设备,每个设备都是在承担很多的转发任务的,每个设备的转发能力都有上限。
网络原理】TCP协议 | TCP的报文格式 | 三次握手 | 四次挥手 | 可靠传输 | 确认应答 | 超时重传 | 滑动窗口 | 流量控制 | 拥塞控制 | 延时应答 | 捎带应答 | 粘包问题
最新发布
WengJM的博客
04-29 1023
上述重传中,没有额外的操作,哪个数据丢了,就重传哪个(快速重传),是滑动窗口下,超时重传的变种。让A先按照比较慢的速度发送数据(小的窗口),如果数据传输过程非常顺利,没有丢包,再一步步尝试使用更大的窗口,更高的速度进行发送。​ 假设当前的接收方缓冲区的大小是4000,拿到1000的数据后,通过ACK报文,把剩余的3000大小,返回给发送方。​ 此时,暂停发送数据后,A虽然不传输业务数据了,仍然会周期性的发送一个“窗口探测包”,并不携带业务数据,只是为了触发ACK,从而查询接收方的接收缓冲区剩余空间。
哔哩哔哩2020校园招聘后端笔试卷(一)
Yuudachi的博客
01-14 4259
1. 在Java中下面哪个对类的声明是错误的?(C) A. public class MyClass{} B. class MyClass extends MySuperClass implements YourInterface {} C. class MyClass extends MySuperClass1, MySupperClass2 {} D. abstract class MyCla...
TCP/IP 报文格式IP数据包、TCP报头、UDP报头)
站在远方看童年的博客
08-12 2万+
TCP/IP 报文格式IP数据包、TCP报头、UDP报头) 一、IP格式 IP数据包,是一种可以变长的分组,由首部与数据负载组成。首部长度为20-60字节(Byte),后40字节是可选的,但长度不固定,前20字节格式为固定。数据负载部分的长度一般可变。 1、 版本 长度为4位,指IP协议的版本.通信双方使用的IP协议版本必须一致。目前广泛使用的 IP协议版本号为 4 (即 IPv4)。IPv...
TCP与UDP协议
六月长安的博客
03-15 790
TCP报文格式, UDP报文格式TCP与UDP协议的比较
Qt TCP网络协议实例
03-26
基于Qt开发环境,C++语言,利用TCP网络协议编写了客户端和服务器端的程序,可以实现客户端向服务器端发送数据。
UDP/TCP 网络协议PPT
10-06
UDP/TCP 网络协议PPT 课件对初学者很有帮助的,不要错过噢
TCP协议实验1
08-03
TCP协议实验1】实验旨在帮助学生深入理解TCP协议的工作原理,掌握其连接状态控制、可靠传输机制,...总的来说,这个实验涵盖了TCP协议的关键概念和技术,让学生通过实践来加深对网络协议的理解,提升网络编程的能力。
tcp ip网络协议神图
04-23
tcp ip网络协议神图
有关TCP网络协议的介绍
12-03
TCP 协议 规范 PDF,简单明了深入浅出的介绍,非常不错
TCP报文段的首部格式
qq_39657702的博客
07-18 1515
TCP报文段格式
网络篇】详解TCP/IP协议(上)(TCP、UDP协议
weixin_48271092的博客
06-10 777
TCP传输控制协议,是传输层的重要协议TCP是面向连接的、可靠的、基于字节流的传输层通信协议TCP首部同常包含20个字节:6位标志位说明:在TCP中,当发送端的数据到达接收主机时,接收端会返回一个已收到消息的通知。这个消息叫做确认应答(ACK)。当发送端将数据发出之后会等待对方的确认应答,如果有确认应答,说明数据已经成功到达对方端,否则,数据丢失的可能性很大。但是对于接收端来说如果反复收到相同的数据是不可取的,因此引入序列号。序列号是按照顺序给发送数据的每一个字节(8位字节)都标上号码的编号。接收端查询
TCP数据段格式
changsoon
05-18 7798
摘自:《深入理解计算机网络》 王达著 机械工业出版社 相关知识链接 1. IPV4数据报头部格式 2. IPv6数据报头部格式 3. IPv4数据报的封装与解封装 4. IPv4数据报的分段与重组 5. ARP协议报文格式及ARP表 6. ARP地址解析原理 7. ICMP协议及报文格式 8. IPv6协议族的其它协议 9. TCP的主要特性TCP数据段格式前面讲过,TCP协议
传输层:TCP协议解析
是胖胖没错了的博客
09-14 289
ps:TCP三次握手和四次挥手详解 TCP协议格式 16位源端端口、16位目的端端口:描述端与端之间的通信 32位序号、32位确认序号:实现TCP的包序管理,TCP是有序交付的 4位头部长度:以4字节位单位描述TCP报文长度,TCP报头是不定长的,最小20字节,最大60字节 6位标志位:URG、ACK、PSH、RST、SYN、FIN URG:紧急标志位 ACK:确认标志位 PSH:携带数据标志位 RST:重置连接标志位 SYN:连接建立标志位 FIN:断开连接标志位 16位窗口大小:实现滑动窗口机制,
TCP报文格式详解
热门推荐
海阔天空sky的博客
02-27 4万+
TCP报文是TCP层传输的数据单元,也叫报文段。 端口号:用来标识同一台计算机的不同的应用进程。 源端口:源端口和IP地址的作用是标识报文的返回地址。 目的端口:端口指明接收方计算机上的应用程序接口。 TCP报头中的源端口号和目的端口号同IP数据报中的源IP与目的IP唯一确定一条TCP连接。 序号和确认号:是TCP可靠传输的关键部分。序号是本报文段发送的数据组的第一个字节的序号。
网络基础知识(TCP/UDP报文格式)四
街头看日出的博客
04-12 1230
TCP协议格式 UDP协议格式
TCP 报文格式TCP Flags
gyunling的专栏
04-16 3万+
(一)前言 TCP 是一个基于连接的四层协议,提供全双工地,可靠地传输系统。它能够保证数据被远程主机接收。并且能够为高层协议提供flow-controlled 服务。 (二)TCP 报文格式(rfc793) 各个Field说明: 源端口(Source Port):长度为16 bits(2个字节)。源端口。 目的端口(Destination Port):长...
列举几个TCP网络协议
05-26
除了TCP协议本身,常见的基于TCP协议网络协议包括: 1. HTTP协议:超文本传输协议,用于在Web浏览器和Web服务器之间传输数据。 2. FTP协议:文件传输协议,用于在客户端和服务器之间传输文件。 3. SMTP协议:简单...

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • MySQL基础——增删查改(基础) 7289
  • c语言实现简单猜数字游戏(rand/do while的基本使用) 5388
  • c语言数组简单实现童年回忆——扫雷 4337
  • java实现简易图书管理系统 4288
  • C语言实现通讯录——有关文件操作介绍 3246

最新评论

  • Spring入门基础

    芝士矿柴: 好棒,讲的很透彻,收获满满表情包

  • MySQL基础——增删查改(基础)

    安全鸭: 我居然看懂了😉

  • MySQL基础——增删查改(基础)

    m0_63301135: 谢谢

  • java线程状态与线程安全问题

    哇猴: 表情包表情包

  • c语言实现简单猜数字游戏(rand/do while的基本使用)

    invictusQAQ: 因为我这里scanf输入的是int类型,如果你输入一个小数会造成scanf不接受并跳过,导致那个小数一直存在缓冲区,此时scanf什么也不读直接返回0导致死循环

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • 个人博客系统项目测试报告
  • Spring事务与事务传播机制
  • MyBatis入门基础
2023年1篇
2022年63篇
2021年6篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

深圳SEO优化公司大运网站建设设计爱联网站设计模板双龙seo排名丹竹头网站设计模板松岗网站改版西乡设计网站大浪网站优化南澳外贸网站建设大运企业网站建设吉祥关键词排名包年推广同乐优化南澳模板网站建设盐田百度标王同乐百度关键词包年推广坂田百姓网标王坂田SEO按天收费盐田网站优化福田关键词排名包年推广永湖网站设计模板龙岗SEO按天收费坑梓网络广告推广石岩网站seo优化盐田网站搭建福永网站推广系统吉祥网络推广永湖英文网站建设丹竹头百度竞价塘坑外贸网站设计福永网站推广南山SEO按天扣费歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化