TCP/IP介绍001

2023-11-16

自下而上分为 网络接口层、网络层、传输层、应用层四部分

其各层作用分为:

网络接口层:TCP/IP最底层,负责接收IP数据包并通过网络发送,或者从网络上接收物理帧,抽出IP数据报,交给IP层

网络层:是TCP/IP协议族中非常关键的一层,主要定义了IP地址格式,从而能够使得不同类型的数据再inernet上通畅地传输,IP协议就是一个网络层协议(IP数据包)

传输层:这一层的功能主要是提供应用程序间的通信,TCP/IP协议族在这一层的协议有TCP和udp。

应用层:TCP/IP协议族在这一层面有着很多协议来支持不同的应用,许多大家所熟悉的基于Internet的

应用的实现就离不开这些协议。如我们进行万维网(WWW)访问用到了HTTP协议、文件传输用FTP协议、电子邮件发送用SMTP、域名的解析用DNS协议、远程登录用Telnet协议等等,都是属于TCP/IP应用层的;就用户而言,看到的是由一个个软件所构筑的大多为图形化的操作界面,而实际后台运行的便是上述协议。(http、SMTP、telnet、DNS、tftp)
 

TCP的三次握手:

       传输控制协议TCP简介

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

2:将应用层的数据流分割成报文段并发送给目标节点的TCP层

3:数据包都有序号,对方收到则发送ACK确认,未收到则重传

4:使用校验和来校验数据在传输过程中是否有误

16位端口号:标示该段报文来自哪里(源端口)以及要传给哪个上层协议或应用程序(目的端口)。进行tcp通信时,一般client是通过系统自动选择的临时端口号,而服务器一般是使用知名服务端口号或者自己指定的端口号。

32位序号:表示一次tcp通信过程(从建立连接到断开)过程中某一次传输方向上的字节流的每个字节的编号。假定主机A和B进行tcp通信,A传送给B一个tcp报文段中,序号值被系统初始化为某一个随机值ISN,那么在该传输方向上(从A到B),后续的所有tcp报文断中的序号值都会被设定为ISN加上该报文段所携带数据的第一个字节在整个字节流中的偏移。例如某个TCP报文段传送的数据是字节流中的第1025~2048字节,那么该报文段的序号值就是ISN+1025。

32位确认号:用作对另一方发送的tcp报文段的响应。其值是收到对方的tcp报文段的序号值+1。假定主机A和B进行tcp通信,那么A发出的tcp报文段不但带有自己的序号,也包含了对B发送来的tcp报文段的确认号。反之也一样。

4位头部长度:表示tcp头部有多少个32bit字(4字节),因为4位最大值是15,所以最多有15个32bit,也就是60个字节是最大的tcp头部长度。

6位标志位:
URG:紧急指针是否有效(0:紧急指针无效1:紧急指针有效)
ACK:表示确认好是否有效,携带ack标志的报文段也称确认报文段(1:确认号有效0:确认号无效)
PSH:提示接收端应用程序应该立即从tcp接受缓冲区中读走数据,为后续接收的数据让出空间(尽快交给应用程序而不是在缓冲区域排队)
RST:表示要求对方重建连接。带RST标志的tcp报文段也叫复位报文段
SYN:表示建立一个连接,携带SYN的tcp报文段为同步报文段(syn 1 ack0 没有使用捎带的确认  11 为确认)

16位窗口大小:是TCP流量控制的一个手段,这里说的窗口是指接收通告窗口,它告诉对方本端的tcp接收缓冲区还能容纳多少字节的数据,这样对方就可以控制发送数据的速度。域)
FIN标志:表示告知对方本端要关闭连接了。(1发送方已经没有什么好发送得了,即关闭本方数据流)

16位校验和:由发送端填充,接收端对tcp报文段执行CRC算法以检验TCP报文段在传输过程中是否损坏。注意这个校验不仅包括tcp头部,也包括数据部分。这也是tcp可靠传输的一个重要保障。

16位紧急指针:是一个正的偏移量。它和序号字段的值相加表示最后一个紧急数据的下一字节的序号。因此这个字段是紧急指针相对当前序号的偏移量。不妨称之为紧急偏移量,发送紧急数据时会用到这个。

 

   握手是为了建立连接

    在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。

   第一次握手:建立连接时,客户端发送SYN包(syn = j)到服务器,并进入SYN_SEND状态,等待服务器确认;

   第二次握手:服务器收到SYN包,必须确认客户端的SYN(ack=j+1),同时自己也发送一个SYN包(syn =  k),即         SYN+ACK包,此时服务期进入SYN_RECV状态;

   第三次握手:客户端收到服务器的SYN+ACK包向服务器发送确认包ACK(ack = k+1),此包发送完毕,客户端和服务器进入       ESTABLISHED状态,完成三次握手。

为什么需要三次握手才能建立起来连接?

    为了初始化Sequence Number的初始值 (互相通知初始化的sequsence number)

首次握手隐患 ---SYN 超时问题

  问题原因分析:

       1:Server 端收到Client的SYN,回复SYN - ACK的时候未收到ACK确认

       2:Server不断重试直到超时,Linux默认等待63s才断开连接 

这时候服务器可能会遭受SYN Flood 攻击的风险,恶意攻击服务器,耗尽资源。

  处理办法:

       1:SYN队列满了之后,通过tcp_syncookies参数回发SYN Cookie

       2:若为正常连接则Client会回发SYN Cookie,直至连接

       建立链接之后客户端Client出现故障怎么办?

        TCP 保活机制:

        1:向对方发送保活探测报文,如果未收到响应则继续发送

        2:尝试次数达到保活探测次数仍未收到响应则中断链接

TCP四次挥手。

第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WALT_1状态:

第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WALT状态;

第三次挥手:Server发送一个FIN,用来关闭Server到Client之间的数据传输,Server进入LAST_ACK状态;

第四次挥手:Client收到FIN后,Client进入TIME_WALT状态接着发送一个ACK给Server,确认序号为收到序号+1Server进入CLOSED状态,完成四次挥手

为什么会有TIME_WAIT状态?

1:确保有足够的时间让对方受到ACK包

2:避免新旧链接混淆

为甚么需要四次挥手才能断开链接?

1:因为双全工,发送方和接收都需要FIN报文和ACK报文

服务器出现大量CLOSE_WAIT的原因?

1:服务端一直在起头发送FIN报文,但是返回给客户端的信息是异常的没有发送ACK或者FIN报文确认,客户端一直都没有收到请求

1-1也就是说,对方关闭socket连接,我方忙于读或写,没有及时关闭连接

解决办法:

1:检查代码,特别是释放资源代码

2:检查配置,特别是处理请求的线程配置
 

 

 

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

TCP/IP介绍001 的相关文章

  • 通过 TCP 客户端套接字接收数据时出现问题

    我正在尝试用 C 语言编写一个 TCP 客户端程序 客户端将在其中启动 连接到服务器 然后它会发送一些信息 然后监听它收到的信息并做出相应的反应 我遇到麻烦的部分是持续聆听 这是我所拥有的 while 1 numbytes recv soc
  • 查找网络中的所有IP地址

    我正在尝试用 C 来做这个 我需要找到我的网络中所有活动的 IP 地址并将它们显示在列表中 我可以 ping 网络中所有可用的 1 255 IP 地址 但我想让这个过程更快 此代码在大约 1 秒内扫描我的网络 255 个 D 级段 我在 V
  • 如何使用 kotlin 通过 TCP 连接发送和接收字符串

    我在 Windows 上有一个 TCP 服务器 我想在服务器和我的 Android 设备之间发送和接收文本字符串 我花了很多时间搜索使用 Kotlin 的示例 但没有找到任何有用的代码 所以我现在只能创建套接字并连接 fun connect
  • 由于将请求从主线程传递到工作线程,netty 中出现延迟?

    我有一些关于 Netty 服务器端 TCP IP 应用程序的问题 我想知道在将请求从老板线程传递到工作线程时是否会因为 netty 由于缺少配置等 而出现延迟 我在用 new OrderedMemoryAwareThreadPoolExec
  • 使用 iPhone 作为热点时 TCP 连接无法正常工作

    我正在开发一个 iOS 应用程序 它通过 TCP 套接字连接到在 Android 上运行的服务器应用程序 为了找到第二个设备的 IP 我使用 UDP 请求并接收服务器的 IP 当我将它们连接到 Wi Fi 网络或使用 Android 设备作
  • net.TCPConn 允许在 FIN 数据包后写入

    我正在尝试为一些服务器端代码编写单元测试 但我在确定关闭测试用例时遇到了困难 环回 TCP 连接似乎无法正确处理干净关闭 我在一个示例应用程序中重现了这一点 该应用程序按顺序执行以下操作 创建客户端和服务器连接 通过从客户端向服务器成功发送
  • Web 服务器可以处理多少个套接字连接?

    假设我要获得共享 虚拟或专用托管 我在某处读到服务器 计算机一次只能处理 64 000 个 TCP 连接 这是真的吗 无论带宽如何 任何类型的托管可以处理多少个 我假设 HTTP 通过 TCP 工作 这是否意味着只有 64 000 个用户可
  • C# - 从客户端检查 TCP/IP 套接字状态

    我想为我的 TCP IP 客户端类提供 CheckConnection 函数 以便我可以检查是否发生了错误 我自己的客户端断开连接 服务器断开连接 服务器卡住等 我有类似的东西 bool isConnectionActive false i
  • 如何模拟 TCP/IP 错误?

    在多层应用程序上 我需要模拟各种 TCP IP 错误来测试一些重新连接代码 有谁知道我可以使用什么工具 基于 Windows 来实现此目的 谢谢 Scapy http secdev org projects scapy 允许您控制数据包的各
  • 为什么我们可以将 sockaddr 转换为 sockaddr_in

    我明白为什么强制转换很有用sockaddr to sockaddr in 但我不明白这怎么可能 据我所知 它们的大小相同sockaddr in添加了sin zero使其大小相同 我想知道编译器如何知道从哪里获取信息sockaddr in如果
  • 我应该害怕使用 UDP 进行客户端/服务器广播通话吗?

    我在过去的两天里阅读了每一篇StackOverflow问题和答案 以及googling当然 关于印地TCP and UDP协议 以便决定在我的用户应用程序和 Windows 服务之间的通信方法中应该使用哪一种 从我目前所看到的来看 UDP是
  • 为什么 UDP 服务器中只有一个套接字?

    我正在准备考试 发现了这个问题 典型的 UDP 服务器可以使用单个套接字来实现 解释一下为什么 对于 TCP 驱动的服务器 我发现创建了两个套接字 一个用于所有客户端访问服务器 另一个用于每个客户端的特定 套接字 用于服务器和客户端之间的进
  • 序列化是通过套接字发送数据的最佳选择吗?

    有人告诉我 序列化不是通过套接字发送数据的最佳方法 但他们说他们在一本书上读过一次 并且不确定更好的方法 因为他们以前没有真正做过网络 那么序列化是最好的方法还是有更好的方法 如果这有很大的不同的话 这也是一个游戏 通过搜索有关通过它发送对
  • 为什么我收到的数据包数据大小大于mss?

    我在两台 PC 上使用 ifconfig ethX mtu 300 修改了 MTU 并使用 netperf 测试网络 我用 WireShark 嗅探了 SYN 数据包中的 MSS 260 但我得到了一些大于 260 的数据包 为什么 嗅探器
  • Erlang gen_tcp 连接问题

    简单的问题 这段代码 client gt SomeHostInNet localhost to make it runnable on one machine ok Sock gen tcp connect SomeHostInNet 56
  • 谁在 Mac OS X 上监听给定的 TCP 端口?

    在Linux上 我可以使用netstat pntl grep PORT or fuser n tcp PORT找出哪个进程 PID 正在侦听指定的 TCP 端口 如何在 Mac OS X 上获得相同的信息 在 macOS 上Big Sur然
  • ADB TCPIP 连接问题

    我有两台 Galaxy S3 其中一个已扎根 另一个则未扎根 因此 当我尝试通过本地网络连接它们时 计算机可以看到已root的计算机 但是正常的就卡在tcpip这一步了 所以 我写 adb tcpip 5555 It says restar
  • 为什么SOCKS5需要通过UDP中继UDP?

    The SOCKS5 https en wikipedia org wiki SOCKS SOCKS5协议 描述为RFC1928 https www rfc editor org rfc rfc1928提供对 UDP 的支持 总而言之 希望
  • 如何知道哪个本地应用程序连接到我的套接字(Windows)

    我有一个绑定到某个 TCP 端口的 Windows 服务 该端口用于我的应用程序之间的 IPC 有没有一种编程 WinAPI WinSocket 等 方法可以知道哪个应用程序连接到我的端口 即在我的 Windows 服务中 我想获取连接到我
  • 了解 netty 通道缓冲区和水印

    我正在尝试了解网络缓冲区和水印 作为一个测试用例 我有一个 netty 服务器 它向客户端写入数据 客户端被阻止 基本上每次读取之间有 10 秒的睡眠时间 在正常 I O 下 如果接收方被阻塞 TCP 发送方将受到限制 由于流量控制 发送速

随机推荐

  • idea自动导包、生成作者日期、快捷键自动生成序列化版本号、maven配置。

    文件编码修改 在菜单中的File gt Settings gt Editor gt File Encoding下修改项目文件的编码 自动导包删除包 在菜单中的File gt Settings gt Editor gt General gt
  • docker Centos7镜像无法联网

    docker镜像启动之后 ping外网的IP无法连通 丢失率100 启动命令的问题 启动的时候需要添加网络策略参数 net 建议启动命令如下 docker run net host privileged itd centos 7 usr s
  • switch语句中的case结尾是否必须添加break语句?

    一般必须在case语句结尾添加break语句 但不是一定必须的 switch c 语句中c可以是int long char unsigned int等类型 唯独不可以是float类型 我百度搜到的比较容易理解的解释如下 一 不加break就
  • Sentinel注解集合排序-代码笔记

    private static void insertSorted List
  • Console.WriteLine打印中文为何出乱码?

    因为你当前环境代码页是437 是美国英语的字符编码 你把你环境设置成936就是简体中文字符编码环境了 你当前的是这个 Console OutputEncoding Encoding GetEncoding 437 设置成这样就支持中文编码了
  • 虚拟机运用vscode实现可视化代码跟踪调试

    可视化代码跟踪调试 一 安装基于跨平台多类型代码编辑器VScode 二 安装vscode的c c 插件 三 配置launch json和task json这两个文件 1 创建文件 2 打开vscode 四 编译调试c 程序 一 安装基于跨平
  • 隐私协议&授权访问的实现

    目录 交互逻辑 隐私协议的实现 初始化隐私协议 隐私协议确认弹窗 再次确认弹窗 隐私政策 用户协议界面 用户协议界面 隐私政策界面 隐私协议的文档 授权访问的实现 初始化授权访问 授权访问工具类 隐私协议 授权访问的示例项目 交互逻辑 用户
  • 华为OD机试 - 约瑟夫问题(Java)

    题目描述 输入一个由随机数组成的数列 数列中每个数均是大于 0 的整数 长度已知 和初始计数值 m 从数列首位置开始计数 计数到 m 后 将数列该位置数值替换计数值 m 并将数列该位置数值出列 然后从下一位置从新开始计数 直到数列所有数值出
  • Caffe源码中syncedmem文件分析

    Caffe源码 caffe version 09868ac date 2015 08 15 中有一些重要文件 这里介绍下syncedmem文件 1 include文件 1
  • Qt之qcustomplot绘图总结

    1 绘图类 QCPGraph 折线图 QCPCurve 用于曲线图 可以有循环 QCPBars 柱形图 如果有多个QCPBars 可以依次重叠 QCPStatisticalBox 需实例化 盒子图 QCPColorMap 实例化 色谱图 Q
  • 2019年‘泰迪杯’数据分析职业技能大赛A题——个人代码分享

    目录 题目 任务 1 数据预处理与统计 任务 2 数据分析与可视化 代码展示 任务一 任务二 题目 任务 1 数据预处理与统计 任务 1 1 对数据作必要的预处理 在报告中列出处理步骤 将处理后的结 国保存为 task1 1 csv 任务
  • C++之string赋值

    string s string a abcdefg 1 将字符串a的元素赋值逐一赋值给另一字符串s s a i 2 将字符串a完全赋值给新字符串s s assign a 3 将字符串a的一部分赋值给新的字符串s start是截取字符串的首位
  • 【转】mysql索引(最左匹配原则)

    阐述 通常我们在建立联合索引的时候 相信建立过索引的同学们会发现 无论是Oracle 还是 MySQL 都会让我们选择索引的顺序 比如我们想在 a b c 三个字段上建立一个联合索引 我们可以选择自己想要的优先级 a b c 或是 b a
  • 常用语言的线程模型(Java、go、C++、python3)

    背景知识 软件是如何驱动硬件的 硬件是需要相关的驱动程序才能执行 而驱动程序是安装在操作系统内核中 如果写了一个程序A A程序想操作硬件工作 首先需要进行系统调用 由内核去找对应的驱动程序驱使硬件工作 而驱动程序怎么让硬件工作的呢 驱动程序
  • STM8L在IAR编译时出现Warning[Pe188]: enumerated type mixed with another type

    STM8L在IAR编译时出现Warning Pe188 enumerated type mixed with another type 给枚举变量赋值了其它类型 产生的原因可能和编译器有关 具体原因尚不清楚 但可以在调用处加入强制类型转换下
  • Cow Marathon(树的直径)(暂存)

    Cow Marathon After hearing about the epidemic of obesity in the USA Farmer John wants his cows to get more exercise so h
  • dedecms织梦后台添加变量提示Request var not allow

    一共找到了两种解决方案 第一种解决方案 根目录打开include common inc php找到下面内容 检查和注册外部提交的变量 2011 8 10 修改登录时相关过滤 function CheckRequest val if is a
  • 贵阳个税系统代理服务器地址,贵阳金三个税服务器地址

    贵阳金三个税服务器地址 内容精选 换一换 文章目录一 keepalived 1 keepalived是什么 2 keepalived工作原理二 配置步骤 第一步 配置两台DR第二步 配置第一台节点服务器web1第三步 配置第二台节点服务器w
  • 设计模式 - 外观模式

    1 介绍 1 1定义 定义了一个高层 统一的接口 外部与通过这个统一的接口对子系统中的一群接口进行访问 1 2 主要作用 实现客户类与子系统类的松耦合 降低原有系统的复杂度 提高了客户端使用的便捷性 使得客户端无须关心子系统的工作细节 通过
  • TCP/IP介绍001

    自下而上分为 网络接口层 网络层 传输层 应用层四部分 其各层作用分为 网络接口层 TCP IP最底层 负责接收IP数据包并通过网络发送 或者从网络上接收物理帧 抽出IP数据报 交给IP层 网络层 是TCP IP协议族中非常关键的一层 主要