计算机网络总结 TCP协议 一

2023-11-17

tcp协议是什么?介绍一下

TCP(Transmission Control Protocol,传输控制协议)是互联网协议族中的一种基于连接的、可靠的、面向字节流的传输协议。TCP协议提供了全双工通信、数据分段、重传机制、流量控制、拥塞控制等功能,是Internet上应用最广泛的传输层协议之一。

TCP协议的特点包括:

  • 基于连接: 在数据传输之前,发送方和接收方需要通过三次握手建立连接并进行状态确认,然后才能进行数据传输。
  • 面向字节流: TCP数据流被看作是一个连续的字节流,而不是一个个独立的消息或数据包。
  • 可靠性: TCP协议保证数据传输的可靠性,采用序列号、确认号和重传机制来确保数据的正确性和完整性。
  • 流量控制:TCP协议支持流量控制机制,通过滑动窗口技术控制发送方的数据发送速率,防止网络拥塞或资源浪费。
  • 拥塞控制:TCP协议支持拥塞控制机制,通过动态调整滑动窗口大小、慢启动、拥塞避免和快速恢复等算法来保证在网络拥塞时TCP连接的可靠性和带宽利用率。

TCP协议在应用层之上提供了一个可靠的数据传输服务,被广泛应用于Web浏览器、电子邮件、文件传输等Internet应用中。除了TCP协议外,UDP协议也是另一种常见的传输层协议,它是一种不可靠的、无连接的传输协议,适用于对数据传输可靠性要求较低的应用场景。

tcp的三次握手过程介绍一下?

1: 客户端向服务端发起一个tcp连接请求, 发起这个请求的时候,客户端向服务端发送 SYN=1包.seq=j 序列号. (SYN=1 是tcp协议中的一个标志位,表示SYN的标志位被设置为1的报文段, 在三次握手中,当客户端向要和服务端建立连接的时候,它就会向服务端发送SYN包,用来表明希望和服务端建立连接. SYN包携带了客户端的初始序列号(ISN)以及一些其他控制信息如MSS,窗口大小等. ) 

2:当服务端收到客户端的连接请求之后,也就是收到了SYN包, 服务端会返回一个SYN+ACK包作为回应,其中ACK包和SYN包标志位都被设为1,表示确认了客户端的连接请求,并且准备好连接, 同时,服务端也会返回给客户端一个随机的序列号seq=K,并将客户端的初始序列号j+1作为确认序列号ack传给客户端.

3:客户端收到服务端的回复SYN+ACK包之后,仍然需要发送最后一个ACK包进行确认. 该ACK包标志位被设为1,确认序列号ack=K+1,以及随机确认好seq, 上图中没有显示.

为什么要发送SYN包?

SYN:同步序列编号(Synchronize Sequence Numbers)。是TCP/IP建立连接时使用的握手信号. 即表示客户端向服务端发起tcp连接请求. SYN标志位的值取决于TCP报文段的具体用途和场景,可以为0或1,但在TCP三次握手过程中,SYN标志位的值通常被设置为1。

第二次服务端为什么要发送ACK,seq,ack=x+1?

ACK (Acknowledge character)即是确认字符,在数据通信中,接收站发给发送站的一种传输类控制字符。表示发来的数据已确认接收无误。

比如客户端发来了SYN=1 .seq=x  那么服务端会返回SYN=1 ACK=1,seq=y,ack=x+1.

ACK=1 的意思是, 表示确认号有效, 0表示报文中不包含确认信息.

ack=x+1, 表示服务端期望下一次接收到客户端发送的数据时,可以接收从序列号x+1开始的数据。也意味着告诉客户端已经接收到了客户端SYN包,并准备连接.

而服务端发送自己的初始序列号seq,则是为了在后续的数据传输中保证数据的可靠性。

为什么是三次握手,可以两次握手么?

比如 c端 第一次向 s端 发送了一个请求建立连接信号 序号为seq=1 , 如果由于网络拥塞或者其它原因,导致第一次的seq=1的请求迟迟到达不了s端, 客户端c 便会重新再发起一次请求,第二次请求,seq=2. 第二次请求s端收到了,便确认请求然后开始通信,通信结束后释放连接. 这时,如果第一次的seq=1的请求连接到达了服务端, 由于两次握手,所以服务端就直接进入estab-lished状态,等待发送数据或者主动发送数据, 但是这个时候客户端已经是closed状态了,服务端就会一直等下去,这样便会浪费服务端的资源.

什么是半连接队列?

服务器第一次收到客户端的 SYN 之后,就会处于 SYN_RCVD 状态,此时双方还没有完全建立其连接,服务器会把此种状态下请求连接放在一个队列里,我们把这种队列称之为半连接队列

ISN(Initial Sequence Number)是固定的吗?

当一端为建立连接而发送它的SYN时,它为连接选择一个初始序号。ISN随时间而变化,因此每个连接都将具有不同的ISN。ISN可以看作是一个32比特的计数器,每4ms加1 。这样选择序号的目的在于防止在网络中被延迟的分组在以后又被传送,而导致某个连接的一方对它做错误的解释。

三次握手的其中一个重要功能是客户端和服务端交换 ISN(Initial Sequence Number),以便让对方知道接下来接收数据的时候如何按序列号组装数据。如果 ISN 是固定的,攻击者很容易猜出后续的确认号,因此 ISN 是动态生成的。

四次挥手过程介绍一下?

1:C端向S端发起断开连接请求 -----FIN=1,seq=x 客户端向服务端发起断开请求,FIN结束标志

2:S端向C端回复----- ACK=1 seq=y ack=x+1 服务端回复客户端 ack=x+1 让客户端知道自己的tcp断开请求已经得到验证

3:S端向C端回复-----FIN=1 ACK=1 seq=z ack=u+1 服务端第二次回复的时候不会立刻断开连接,它会先确保传输给客户端的数据是否都传输完毕,完毕了就会发送FIN报文 和随机序列号进行回复

4:C端向S端回复-----FIN=1 ACK=z+1 seq=u+1 最后客户端会回复服务端的断开请求,ack=z+1 告知服务端完成请求验证回复,至此断开连接完毕.

四次挥手的状态:

1: 客户端向服务端发送FIN断开请求后 进入 FIN_WAIT1 状态

2:服务端收到FIN后,向客户端发送ACK之后, 服务端进入 CLOSE_WAIT状态

3:客户端收到服务端的ACK报文之后, 进入FIN_WAIT2状态, 此时连接已经断开一半了,如果服务器还有数据要发送可以继续发送.

4:服务端发完数据之后,会向客户端发送FIN报文 告知客户端,然后进入,LAST_ACK状态

5:客户端收到服务端的断开请求FIN后, 会立刻 向服务端发送ACK确认, 然后客户端进入TIME_WAIT状态, 服务端进入CLOSED状态

6:再经过2ML之后,客户端也进入了CLOSED状态

至此,还有一个状态没有出来,CLOSING状态.

7:CLOSING状态表示 客户端发送了FIN请求,但是却只收到了服务端的FIN ,没有收到ACK ,这说明了ACK包在传输过程中丢包了.发生了意外.

为什么还要TIME_WAIT 等待2msl?

2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时间;

最后一次挥手的时候,客户端向服务端发送了最后的ack回复, 但是这个ack回复是可能会丢失的,所以不可以发送ack之后就立即closed.

客户端必须确认服务端收到ack报文了, 所以客户端会进入2msl的等待时间, 如果在该时间里 收到了服务端的fin,那么客户端就会重发ack然后再等待2msl, 直到这2mls都没有再收到服务端发来的信息,那么客户端就会判断已经断开连接成功,ack已被接受,支持进入closed状态.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算机网络总结 TCP协议 一 的相关文章

  • 遗传算法训练人工神经网络 MATLAB实现

    参考 遗传算法优化BP神经网络 写在前面 为了完成建模课的作业 找了很久才找到可以使用的一个源码和这个很好的博客 在此记录一下 这是一个利用遗传算法实现BP人工神经网络的matlab代码 可用于实现2层 隐藏层数 1 不计输入层 则共2层
  • 用jsp实现登录,登录成功则跳转到登录成功页面,失败则跳转到失败页面

    login jsp
  • 码云实战(二)——新增仓库和删除仓库

    文章目录 前言 一 创建仓库 1 新增仓库 2 填写仓库的相关信息 3 创建效果 二 删除仓库 总结 前言 本系列文章主要记录日常使用中碰到的码云的相关问题 一 创建仓库 1 新增仓库 在gitee网站右上角的 点击 新建仓库 2 填写仓库
  • Python深度学习篇一《什么是深度学习》

    在过去的几年里 人工智能 AI 一直是媒体大肆炒作的热点话题 机器学习 深度学习 和人工智能都出现在不计其数的文章中 而这些文章通常都发表于非技术出版物 我们的未来被描绘成拥有智能聊天机器人 自动驾驶汽车和虚拟助手 这一未来有时被渲染成可怕
  • Linux怎么使用U盘

    方案一 Linux不像Windows一样 接上新硬件后可以自动识别 在Linux下无法自动识别新硬件的 需要手动去识别 USB移动存储设备通常被识别为sda1 具体可以通过fdisk l命令查询 在使用U盘前 我们先要为外挂点新建一个子目录
  • 《动手学深度学习 Pytorch版》 6.5 汇聚层

    import torch from torch import nn from d2l import torch as d2l 6 5 1 最大汇聚和平均汇聚 汇聚层和卷积层类似 区别在于汇聚层不带包含参数 汇聚操作是确定性的 通常计算汇聚窗
  • [Unity踩坑记录] 从屏幕坐标系转换到世界坐标系

    问题描述 调试需要 想从摄像机发出一条射向鼠标指向位置的射线 于是写了如下代码 void Update Vector3 mouseScreenPos Input mousePosition Vector3 mouseWorldPos Cam
  • JS力扣刷题26. 删除有序数组中的重复项

    var removeDuplicates function nums len表示nums修改后得长度 let len nums length for let i 0 i lt len 1 i if nums i nums i 1 for l
  • Android开发精典案例60个

    实例简介 Android开发精典案例60个 文件 url80 ctfile com f 25127180 740794786 4b13cf p 551685 访问密码 551685 核心代码 2 1 Activity生命周期 3 1 But

随机推荐

  • 区块链结合物联网可研究方向

    文献来源 H Dai Z Zheng and Y Zhang Blockchain for Internet of Things A Survey in IEEE Internet of Things Journal vol 6 no 5
  • js怎么实现数组里的数据相加_JS数组求和的常用方法总结【5种方法】

    本文实例总结了JS数组求和的常用方法 分享给大家供大家参考 具体如下 题目描述 计算给定数组 arr 中所有元素的总和 输入描述 数组中的元素均为 Number 类型 输入例子 sum 1 2 3 4 输出例子 10 方法1 不考虑算法复杂
  • Powershell如何查询目录所有文件和文件夹的名称

    Powershell如何查询目录所有文件和文件夹的名称 获取文件名称 修改时间等 Get ChildItem Name设置可仅获取文件名称 Get ChildItem Name 输入 Get ChildItem 如图 输入 Get Chil
  • hdu 1007 Quoit Design

    Quoit Design Time Limit 10000 5000 MS Java Others Memory Limit 65536 32768 K Java Others Total Submission s 10498 Accept
  • MFC 菜单操作

    1 菜单是窗口框架的组成部分 如果我们要导入自定义的菜单 可以通过以下语句实现 在CMainFrame OnCreate的函数中添加如下代码段 SetMenu NULL 将原本的菜单项去除 CMenu menu 新定义一个菜单对象 menu
  • 计算机网络 --- DNS协议

    计算机网络 DNS协议 什么是DNS DNS工作原理 Overview Three Classes of DNS servers 1 Root servers 2 top level domain DNS servers 3 authori
  • Java学习(java基础)-韩顺平老师

    一 简单介绍 1 jdk jre 2 Java代码规范 a 类 方法的注释 要以javadoc的方式来写 author 楠小弟 version 1 0 public class Hello public static void main S
  • JDBC中典型的五种查询方式

    第一种查询方式 返回一个ArrayList集合 集合里面的数据类型只能为Empinfo类类型 public ArrayList
  • YOLOV5代码general.py文件解读

    YOLOV5源码的下载 git clone https github com ultralytics yolov5 git YOLOV5代码general py文件解读 import glob import logging import o
  • 深入浅出BP神经网络算法的原理

    相信每位刚接触神经网络的时候都会先碰到BP算法的问题 如何形象快速地理解BP神经网络就是我们学习的高级乐趣了 画外音 乐趣 你在跟我谈乐趣 本篇博文就是要简单粗暴地帮助各位童鞋快速入门采取BP算法的神经网络 BP神经网络是怎样的一种定义 看
  • vue项目实战(一)

    第一步 找到你想要存放项目的文件夹 输入cmd 就会弹出小黑窗 然后输入vue create 项目名 创建项目 前提安装好node js和搭建 vue 环境 打开终端 创建项目 按上下键进行选择 做一些配置 这次选择自定义 也就是最后一个
  • Java_得到GET和POST请求URL和参数列表

    一 获取URL getRequestURL 二 获取参数列表 1 getQueryString 只适用于GET 比如客户端发送http localhost testServlet a b c d e f 通过request getQuery
  • 计算机基础内容——网络基础

    网络基础 设备是如何上网的 网卡 有线 无线 内置天线 网线接口RJ45 usb转RJ45 交换机 路由器 外置天线 天线棒 光猫 宽带运营商 不同的宽带运营商之间是互通的 路由器发出的wifi信号 2 4GHz wifi 5 0GHz w
  • Qt的Tcp服务器多线程编程-附带代码展示

    Qt的Tcp服务器多线程编程 附带代码展示 该程序主要实现tcp服务器如何使用多线程的方式来连接多个客户端 此文章没有实现客户端的多线程编程 创建子线程时需要注意的点 1 子线程与主线程之间交互数据时 应采用信号槽的方式 2 子线程中实例化
  • Java基础:多线程join()方法

    join 让当前线程优先执行 JoinThread java public class JoinThread implements Runnable Override public void run for int i 0 i lt 100
  • iis中使用nginx实现反向代理负载均衡

    user nobody worker processes 1 error log logs error log error log logs error log notice error log logs error log info pi
  • vue+element实现树形上下拖拽,快速提升你的前端技能

    前言 随着前端技术的不断发展 越来越多的网站和应用需要使用树形控件来展示数据 而上下拖拽则是一个非常实用的交互方式 如果你正在寻找一种简单易用的树形控件实现上下拖拽的方法 那么本文将为你提供最佳解决方案 本文将介绍如何使用 vue 基于 e
  • Java中三种进制的数值常量

    package cn nxl2018 class Test 十进制常量赋值 void decimals byte b 10 short s 10 char ch 69 int i 10 long l 10l l L可加可不加 float f
  • 【Java面试】请你简单说一下Mysql的事务隔离级别

    一个工作了6年的粉丝 去阿里面试 在第一面的时候被问到 Mysql的事务隔离级别 他竟然没有回答上来 一直在私信向我诉苦 我说 你只能怪年轻时候的你 那个时候不够努力导致现在的你技术水平不够 好吧 关于这个问题 看看普通人和高手的回答 普通
  • 计算机网络总结 TCP协议 一

    tcp协议是什么 介绍一下 TCP Transmission Control Protocol 传输控制协议 是互联网协议族中的一种基于连接的 可靠的 面向字节流的传输协议 TCP协议提供了全双工通信 数据分段 重传机制 流量控制 拥塞控制