(学习笔记)TCP基础知识

news2024/11/25 23:47:52

 什么是TCP?

TCP 是面向连接的、可靠的、基于字节流的传输层通信协议。

  • 面向连接:一定是[一对一]才能连接,不能像UDP协议可以一个主机同时向多个主机发送消息,也就是一对多是无法做到的;
  • 可靠的:无论网络链路中出现了怎样的链路变化,TCP都可以保证一个报文一定能够到达接收端
  • 字节流:用户消息通过TCP协议传输时,消息可能会被操作系统[分组]成多个TCP报文,如果接收端不知道消息的边界,是无法读出一个有效的用户消息的。并且TCP报文是[有序的],当前一个TCP报文没有收到的时候,即使它先收到了后面的TCP报文,那么也不能扔给应用层去处理,同时对[重复]的TCP报文会自动丢弃。

TCP头格式

序列号:在建立连接时由计算机生成的随机数作为其初始值,通过SYN包传给接收端主机,每发送一次数据,就累加一次该数据字节数的大小。用来解决网络包乱序的问题

确认应答号:指下一次期望收到的数据的序列号,发送端收到这个确认应答后可以认为在这个序号以前的数据都已经被正常接收。用来解决丢包的问题

控制位

  • ACK:该位为1时,确认应答的字段变为有效,TCP规定除了最初建立连接时的SYN包之外该位必须设置为1.
  • RST:该位为1时,表示TCP连接中出现异常必须强制断开连接。
  • SYN:该位为1时,表示希望建立连接,并在其序列号的字段进行序列号初始值的设定
  • FIN:该位为1时,表示今后不会再有数据发送,希望断开连接。当通信结束希望断开连接时,通信双方的主机之间就可以互相交换FIN位为1的TCP段。

为什么需要TCP,TCP工作在哪一层?

IP层是[不可靠]的,它不保证网络包的交付、不保证网络包的按序交付、也不保证网络包中的数据的完整性。

如果需要保障网络数据包的可靠性,那么就需要由上层(传输层)的TCP协议来负责。

因为TCP是一个工作在传输层可靠数据传输的服务,它能确保接收的网络包时无损坏、无间隔、非冗余和按序的。


TCP连接

1. 什么是TCP连接?

简单来说就是,用于保证可靠性和流量控制维护的某些状态信息,这些信息的组合,包括Socket、序列号和窗口大小称为连接。

 所以,建立一个TCP连接时需要客户端与服务端达成上述三个信息的共识。

  • Socket:由ip地址和端口号组成
  • 序列号:用来解决乱序问题
  • 窗口大小:用来做流量控制

2. 如何确定一个TCP连接?

TCP四元组可以唯一地确定一个连接,四元组包括:

源地址目标地址的字段(32位)是在IP头部中,作用是通过IP协议发送报文给对方主机。

源端口目标端口的字段(16位)是在TCP头部中,作用是告诉TCP协议应该把报文发送给哪个进程

有一个IP的服务端监听了一个端口,它的TCP最大连接数是多少?

理论计算公式:最大TCP连接数 = 客户端IP数 X 客户端的端口数

对于IPV4,客户端IP数量最多为2的32次方,客户端的端口数量最多为2的16次方,也就是服务端单机最大TCP连接数约为2的48次方(目标地址与目标端口共48位)

当然,服务器最大并发TCP连接远不能达到理论上限,会受以下因素影响:

  •  文件描述符限制:每一个TCP连接都是一个文件,如果文件描述符被占满了,就会发生Too many open files.linux可对打开的文件描述符的数量分别做了三个方面的限制:
    • 系统级:当前系统可打开的最大数量,通过cat /proc/sys/fs/file-max查看;
    • 用户级:指定用户可打开的最大数量,通过cat /etc/security/limits.conf查看;
    • 进程级:单个进程可打开的最大数量,通过cat /proc/sys/fs/nr_open查看;
  • 内存限制,每个TCP连接都要占用一定内存,操作系统的内存是有限的,如果内存资源被占满后,会发生OOM。

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

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

相关文章

spring复习:(38)ProxyFactoryBean中使用jdk动态代理生成代理对象时,业务方法调用时的执行流程

当调用代理对象的业务方法时,会直接执行JdkDynamicAopProxy类的invoke方法 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {Object oldProxy null;boolean setProxyContext false;TargetSource targetSource this.advised…

Matter初探

这是运行gn_build.sh之后输出的日志 Script started on 2023-07-17 09:39:460800 ]0;userubuntu: ~/Matter/connectedhomeip[01;32muserubuntu[00m:[01;34m~/Matter/connectedhomeip[00m$ source gn_build.sh [0;33m.--------------------------------[0m [0;33m-- Environmen…

【项目 进程2】2.3 进程创建 2.4父子进程虚拟地址空间 2.5GDB多进程调试

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 2.3 进程创建2.4 父子进程虚拟地址空间父子进程之间的关系: 2.5 GDB多进程调试 2.3 进程创建 系统允许一个进程创建新进程,新进程即为子进程…

特征缩放(归一化处理)

在我们面对多维特征问题的时候,我们要保证这些特征都具有相近的尺度,这将帮助梯度下降算法更快地收敛。 以房价问题为例,假设我们使用两个特征,房屋的尺寸和房间的数量,尺寸的值为 0-2000平方英尺,而房间数…

CAPL(vTESTStudio) - CAPL实现CANCANFD接收

诊断作为CAN&CANFD总线测试中最大也是很重要的一块内容,虽然测试过程比较简单,但是作为诊断接收函数,我想大家在测试中都会遇到多种多样的自研函数,经过多年的工作,我也是一直希望写出一个能够适配我所能想到的所有情况的诊断应答接收,以下函数是我最近对于诊断接收函…

欧姆龙cp11以太网设置连接力控方法

JM-ETH-CP转以太网模块采用即插即用设计,不占用 PLC 通讯口,即编程软件/上位机软件通过以太网对 PLC 数据监控的同时,触摸屏可以通过复用接口与 PLC 进行通讯。捷米特JM-ETH-CP转以太网模块支持工控领域内绝大多数 SCADA 软件,支持…

大语言模型的预训练[1]:基本概念原理、神经网络的语言模型、Transformer模型原理详解、Bert模型原理介绍

大语言模型的预训练[1]:基本概念原理、神经网络的语言模型、Transformer模型原理详解、Bert模型原理介绍 1.大语言模型的预训练 1.LLM预训练的基本概念 预训练属于迁移学习的范畴。现有的神经网络在进行训练时,一般基于反向传播(Back Propagation&…

如何免费试用阿里云上资源搭建ChatGLM2+langchain

如何免费试用阿里云上资源搭建ChatGLM2langchain 1.找到免费试用,搜索PAI 2.试用PAI-DSW和NAS 3.找到这个平台打开 4.创建工作空间和实例 这里已经创建过了,没有图 5.对着视频一步一步走

浅析Java编程中类和对象的定义

浅析Java编程中类和对象的定义 1,什么是类? 答:类是客观存在的,抽象的,概念的东西。 2,什么事对象? 答:对象是具体的,实际的,代表一个事物。例如&#xff…

SpringCloud(一)微服务项目搭建

一、简介 SpringCloud是Spring提供的一套分布式解决方案,集合了一些大型互联网公司的开源产品,包括诸多组件,共同组成SpringCloud框架。并且,它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服…

网络安全—信息安全—黑客技术(学习笔记)

一、什么是网络安全? 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域,都…

【iOS】探索ARC的实现

ARC ARC在编译期和运行期做了什么?编译期:运行期:block 是如何在 ARC 中工作的? ARC的实现分析__strong自己生成并持有storeStrongSideTable散列表objc_retainobjc_releasesidetable_releaseretainCount非自己生成并持有 ARC在编译…

打包python文件成.exe程序

不带环境打包程序 ,下载后的程序需要下载环境才能正常运行 -w:隐藏命令行窗口 -i:添加ico图标文件 最后写入参数代表程序的入口

C#图片处理

查找图片所在位置 原理:使用OpenCvSharp对比查找小图片在大图片上的位置 private static System.Drawing.Point Find(Mat BackGround, Mat Identify, double threshold 0.8) {using (Mat res new Mat(BackGround.Rows - Identify.Rows 1, BackGround.Cols - Iden…

【LeetCode热题100】哈希篇

两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任…

短视频抖音账号矩阵系统源码开发分享

引用:MySQL数据库,NGINX,PHP7.4,MySQL5.7,redis 媒体组件 组件 描述 image 图片 图片。支持 JPG、PNG、SVG、WEBP、GIF 等格式。 video 视频 视频组件。相关 API 请参考 tt.createVideoContext。 开发背景&…

Fiddler的使用方法介绍

FIDDLER下载地址fiddler Fiddler可以帮您记录,调试Microsoft Internet Explorer与Web应用程序的交互,找到Web程序运行性能的瓶颈,还有如查看向Web服务器发送cookies的内容,下载内容的大小等功能。 说多一点是,Fiddler站…

docker-compose部署sentinel-dashboard-1.8.5

一、创建文件夹 mkdir -p /docker/alibaba/sentinel/{config,data,logs} 二、拷贝jar包进sentinel目录下 三、Dockerfile文件 FROM openjdk:8-jre MAINTAINER yh COPY ./sentinel-dashboard.jar /app.jar EXPOSE 8718 ENTRYPOINT ["java", "-jar", &quo…

【Linux C】fseek函数使用小结

0x00 前言 演示使用的Linux版本&#xff08;#cat /etc/issue&#xff09;&#xff1a;Ubuntu 18.04.6 LTS \n \l 最后更新日期&#xff1a;2023.7.17 0x01 fseek函数使用小结 1.函数描述 设置stream文件的位置指针偏移到指定位置1。 2.声明 #include <stdio.h> in…

LVS—Linux Virtual Server

集群和分布式 系统性能拓展方式&#xff1a; Scale UP&#xff1a;垂直拓展&#xff0c;提高单个服务器的性能&#xff0c;如增加CPU、内存等&#xff0c;单台服务器的性能是有上限的&#xff0c;不可能无限制垂直拓展。Scale Out&#xff1a;水平拓展&#xff0c;增加设备&a…