tcp的理解

news2024/10/6 8:34:13

1、源端口号:发送方端口号

2、目的端口号:接收方端口号

3、序列号:报文段的数据的第一个字节的序号

3、确认序号:期望收到对方下一个报文段的第一个数据字节的序号

4、首部长度(数据偏移):TCP报文段的数据起始距离TCP报文段的起始处有多远,即首部长度

6、保留:保留不用是置为0

7、紧急URG:此置为 1 ,紧急指针字段才有效,它告诉系统此报文段中有紧急数据,应尽快传送

8、确认位ACK:此置为 1,确认号字段才有效,TCP规定,在连接建立后所有传达的报文段都必须把 ACK 置 1

9、推送位PSH:此置为 1,即发送方,希望接收方接收缓冲区的数据,即TCP使用推送(PUSH)操作,接收方不再等整个缓冲区填满后再交付

10、复位RST:用于复位相应的TCP连接

11、同步SYN:仅在三次握手建立TCP连接时有效,当SYN = 1 且 ACK = 0,表明 请求连接报文段,SYN = 1 且 ACK = 0,同意建立连接报文段

12、终止FIN:用来释放连接,FIN = 1,表明此报文段的数据发送已经发送完毕,并要求释放连接

13、窗口大小:指发送本报文段的一方的接受窗口(而不是自己的发送窗口),最大为65535字节。

14、校验和:校验字段检验的范围(包括首部和数据两部分),计算校验和时需要加上 12 字节的伪头部

15、紧急指针:仅在 URG = 1时才有意义,它代表本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据),即指出紧急数据在报文末尾的位置,(注意:及时窗口为0 时也可以发送紧急数据)

16、选项:长度可变,最长可达 40 字节,当没有使用选项时,TCP首部长度是 20 字节

wireshark抓包

Transmission Control Protocol, Src Port: http (80), Dst Port: 60575 (60575), Seq: 624361, Ack: 1, Len: 1452

Source Port: http (80) //源端口号

Destination Port: 60575 (60575) //目的端口号

[Stream index: 0]

[TCP Segment Len: 1452]

Sequence number: 624361 (relative sequence number) //32位序列号

[Next sequence number: 625813 (relative sequence number)]

Acknowledgment number: 1 (relative ack number) //32位确认序列号,即发送端希望收到的序列号

0101 .... = Header Length: 20 bytes (5) //4位首部长度

Flags: 0x010 (ACK) //标志位 ACK置1

000. .... .... = Reserved: Not set //保留位

...0 .... .... = Nonce: Not set //新增的

.... 0... .... = Congestion Window Reduced (CWR): Not set //新增的

.... .0.. .... = ECN-Echo: Not set //新增的

.... ..0. .... = Urgent: Not set

.... ...1 .... = Acknowledgment: Set

.... .... 0... = Push: Not set

.... .... .0.. = Reset: Not set

.... .... ..0. = Syn: Not set

.... .... ...0 = Fin: Not set

[TCP Flags: ·······A····]

Window size value: 240 //16位窗口大小(用于接收方的流量控制)

[Calculated window size: 240]

[Window size scaling factor: -1 (unknown)]

Checksum: 0xacb5 [unverified] //16位检验和

[Checksum Status: Unverified]

Urgent pointer: 0 //16位紧急指针

[SEQ/ACK analysis]

[Bytes in flight: 4356]

[Bytes sent since last PSH flag: 622908]

[Timestamps]

[Time since first frame in this TCP stream: 3.239693000 seconds]

[Time since previous frame in this TCP stream: 0.000001000 seconds]

TCP payload (1452 bytes) //TCP有效载荷

网络状态图

三次握手和四次挥手

为什么连接建立需要三次握手,而不是两次握手?

防止失效的连接请求报文段被服务端接收,从而产生错误.主要目的防止server端一直等待,浪费资源.

由于TCP连接是全双工的,因此每个方向都必须单独进行关闭.

因为当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可能还需要发送一些数据给对方,再发送FIN报文给对方来表示你同意现在可以关闭连接了,故这里的ACK报文和FIN报文多数情况下都是分开发送的,也就造成了4次挥手。

2MSL的作用:

等待2MSL时间主要目的是怕最后一个ACK包对方没收到,那么对方在超时后将重发第三次握手的FIN包,主动关闭端接到重发的FIN包后可以再发一个ACK应答包。在TIME_WAIT状态时两端的端口不能使用,要等到2MSL时间结束才可继续使用。当连接处于2MSL等待阶段时任何迟到的报文段都将被丢弃。不过在实际应用中可以通过设置SO_REUSEADDR选项达到不必等待2MSL时间结束再使用此端口。一般MSL设置为30s、1min等

connect函数由系统决定超时时间,一般是75s.

发送一个syn,若无响应的等待几秒再发送一个,连续好几次,等到75s仍不响应。

复位报文段

  1. 目的端口没有在使用,tcp连接会返回复位(RST),udp是icmp端口不可达。

  1. 异常终止一个连接,发送的是RST,而不是FIN.

延伸:异常关闭的优点:1.丢弃任何待发送的数据并立即发送RST复位报文段。2.RST接收方会区分另一端执行的是异常关闭还是正常关闭,应用程序需要提供异常关闭的处理。

半打开连接

一方已经关闭或异常终止连接而另一方却不知道。

解决办法:使用keepalive机制

同时打开

两个应用程序同时执行主动打开。这需要每一方使用对方熟知的端口作为本地端口。整个同时打开连接的过程需要交换4个报文段。同时每一端既是客户又是服务端。

同时关闭

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/333640.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

List、ArrayList与顺序表的介绍(数据结构系列3)

目录 前言: 1.List 1.1什么是List 1.2List的使用 2.ArrayList 2.1线性表 2.2ArrayList的方法 2.3ArrayList的模拟实现 2.4ArrayList的使用 2.5ArrayList的三种遍历方式 2.5.1for循环遍历 2.5.2for-each遍历 2.5.3使用迭代器遍历 结束语: 前…

分享88个JS焦点图代码,总有一款适合您

分享88个JS焦点图代码,总有一款适合您 88个JS焦点图代码下载链接:https://pan.baidu.com/s/1zfspX9OSsbAlL53fjiSCEw?pwdulz6 提取码:ulz6 Python采集代码下载链接:https://wwgn.lanzoul.com/iKGwb0kye3wj base_url "…

XGBoost

目录 1.XGBoost推导示意图 2.分裂节点算法 Weighted Quantile Sketch 3.对缺失值得处理 1.XGBoost推导示意图 XGBoost有两个很不错得典型算法,分别是用来进行分裂节点选择和缺失值处理 2.分裂节点算法 Weighted Quantile Sketch 对于特征切点点得选择&#xff…

怎么不让消息弹出?录屏弹窗怎么关

当我们对电脑屏幕进行录制时,时不时跳出的消息窗口和广告会影响我们录制的效果。怎样不让消息弹出?如何关闭录屏弹窗?使用“锁定窗口录制”模式,就能很好地解决这个问题。那有没有拥有“锁定窗口”录制模式的录屏工具?…

synchronized 关键字-监视器锁 monitor lock

1.代码示例: package thread3;import java.util.Scanner;public class Test2 {public static Object object new Object();public static void main(String[] args) throws InterruptedException {Thread thread1 new Thread(() -> {Scanner scanner new Sca…

盂县基本情况

寒假的活动报告,万物皆可CSDN,贴一下吧 盂县隶属于阳泉市,阳泉市是李彦宏和刘慈欣的家乡,阳泉市内有百度云计算中心 基本情况 盂县,隶属山西省阳泉市,地处山西省东部、太行山西麓,东与河北省平…

测试开发面经

操作系统 进程与线程 进程间通信方式 进程间的六种通信方式 管道消息队列共享内存信号量信号套接字 socket长连接和短连接 长连接与短连接的概念:前者是整个通讯过程,客户端和服务端只用一个Socket对象,长期保持Socket的连接&#xff1b…

Windows/VM虚拟机安装黑群晖6.1-----保证有效而且简单操作

1视频:Windows/VM虚拟机安装黑群晖教程_哔哩哔哩_bilibili2:网址:Synology Web Assistant3:重新打开群晖操作步骤1:按着视频下载好资源后,按照视频操作,途中修改地方(两个情况选择其中一个&…

Docker系列(镜像原理)03

前言 镜像就是图中的集装箱,仓库就是超级码头,容器就是我们运行程序的地方。 从联合文件系统说起 Union文件系统(UnionFS )是一种分层、轻量级并且高性能的文件系统。它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录…

【游戏逆向】】游戏全屏捡物的分析实现

前言 在角色对战类中,拾取怪物掉落的装备是一项必备的工作,由于装备位置掉落的不确定性,玩家想要拾取离角色距离较远的装备需要一定的时间,这一段时间往往会影响游戏的评分或是玩家的心态,基于此,全屏捡物…

【Unity VR开发】结合VRTK4.0:键盘操作运动与旋转

前言: 当我们的手柄无发进行VR测试,或者想通过键盘进行验证,那么就用到了我们今天的一个功能:组合操作。组合操作允许更复杂的输入类型,我们将介绍如何使用布尔输入(如键盘键)来模拟模拟轴&…

Java中LinkedList增删改比ArrayList快吗?

在 Java 中,LinkedList 和 ArrayList 的性能是不同的,具体取决于你所需要的操作。 对于频繁的插入和删除操作,LinkedList 的性能通常更好,因为它使用了链表数据结构,只需更改节点的指针就可以在链表中插入或删除元素。…

剑指Offer 第26天 表示数值的字符串 Hard

表示数值的字符串_牛客题霸_牛客网 描述 请实现一个函数用来判断字符串str是否表示数值(包括科学计数法的数字,小数和整数)。 科学计数法的数字(按顺序)可以分成以下几个部分: 1.若干空格 2.一个整数或者小数 3.(可选&…

计算机组成原理第七章笔记记录

仅仅作为笔记记录,B站视频链接,若有错误请指出,谢谢 基本概念 演变过程 I/O系统基本组成 I/O软件 包括驱动程序、用户程序、管理程序、升级补丁等 下面的两种方式是用来实现CPU和I/O设备的信息交换的 I/O指令 CPU指令的一部分,由操作码,命令码,设备…

前端 基于 vue-simple-uploader 实现大文件断点续传和分片上传

文章目录一、前言二、后端部分新建Maven 项目后端pom.xml配置文件 application.ymlHttpStatus.javaAjaxResult.javaCommonConstant.javaWebConfig.javaCheckChunkVO.javaBackChunk.javaBackFileList.javaBackChunkMapper.javaBackFileListMapper.javaBackFileListMapper.xmlBac…

2023年rabbitMq面试题汇总4(7道)

一、如何保证消息的顺序性?1. 通过某种算法,将需要保持先后顺序的消息放到同⼀个消息队列中(kafka中就是partition,rabbitMq中就是queue)。然后只⽤⼀个消费者去消费该队列。2. 可以在消息体内添加全局有序标识来实现。二、使⽤RabbitMQ增加rest服务吞吐…

JVM调优几款好用的内存分析工具

对于高并发访问量的电商、物联网、金融、社交等系统来说,JVM内存优化是非常有必要的,可以提高系统的吞吐量和性能。通常调优的首选方式是减少FGC次数或者FGC时间,以避免系统过多地暂停。FGC达到理想值后,比如一天或者两天触发一次…

【Android -- 每日一问】现在 Android 怎么学?学什么?

不管在任何行业,任何岗位,初级技术人才总是供大于求;不管任何行业、岗位,技术过硬的也都是非常吃香的! 这几年 Android 新技术的迭代明显加速了,有来自外部跨平台新物种的冲击,有去 Java 化的商…

Dropout的原理与细节?

1. 什么是Dropout? Dropout是通过使得每个神经元以一定的概率停止工作来接缓解过拟合问题。dropout(随机失活):dropout是通过遍历神经网络每一层的节点,然后通过对该层的神经网络设置一个keep_prob(节点保留概率),即该层的节点有keep_prob的概率被保留,keep_prob的取值范围…

YOLO-V1~V3经典物体检测算法介绍

大名鼎鼎的YOLO物体检测算法如今已经出现了V8版本,我们先来了解一下它前几代版本都做了什么吧。本篇文章介绍v1-v3,后续会继续更新。一、节深度学习经典检测方法概述1.1 检测任务中阶段的意义我们所学的深度学习经典检测方法 ,有些是单阶段的…