首页 > 其他分享 >tcp介绍.1

tcp介绍.1

时间:2024-08-14 23:52:13浏览次数:6  
标签:字节 报文 介绍 发送 tcp 序号 链接

1.tcp介绍

tcp的服务

tcp提供一种面向连接的、可靠的字节流服务。

面向连接意味着两个使用tcp的应用(通常 一个客户和一个服务器)在彼此交换数据之前必须先建立一个tcp链接。

在一个tcp链接中,仅有两方进行彼此通信。

tcp的服务

tcp提供一种面向连接的、可靠的字节流服务。

面向连接意味着两个使用tcp的应用(通常是一个客户和一个服务器)在彼此交换数据之前必须先建立一个tcp链接。

tcp的服务

tcp通过下列方式来提供可靠性:

应用数据被分割成tcp认为最合适发送的数据块。

当tcp发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段,如果不能及时收到一个确认,将重发这个报文段。

当tcp收到发自tcp连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒。

tcp将保持它首部和数据的检验和。

既然tcp报文段作为ip数据报来传输,而ip数据报的到达可能会失序,因此tcp报文段的到达也可能会失序,如果必要,tcp将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。

既然ip数据报会发生重复,tcp的接受端必须丢弃重复的数据。

tcp还能提供流量控制。tcp连接的每一方都有固定大小的缓冲空间,tcp的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。

tcp的字节流

两个应用程序通过tcp连接交换8bit字节构成的字节流。tcp不在字节流中插入记录标示符。我们将这成为字节流服务(byte stream service).如果一方的应用程序先传10字节,又传20字节,再传50字节,连接的另一方将无法了解发方每次发送了多少字节。收方可以分4此接受这80字节,每次接收20字节,一端将字节流放到tcp连接上,同样的字节流将出现在tcp连接的另一端。

另外,tcp对字节流的内容不做任何解释。tcp不知道传输的数据字节流是二进制数据,还是ascii字、ebcdic字符或者其他类型数据。对字节流的解释由tcp连接双方的应用层解释。

tcp的首部

序列号32位,增加1个序列号标示成功传输1个字节。因为tcp是全双工的,即可以收也可以发。上面是,我发给你的序列号,下面是你对我的确认。

4位首部长度:20-60字节。可以有40个字节选项部分。

保留6位没有用,常常被用于攻击,利用6位传输特殊的指令信息。

两次fin交换,正常释放tcp的连接。

异常释放rst,清除掉tcp连接

psh数据报重要,尽快交给应用层。

urg紧急指针,告诉有一些紧急数据在当前tcp中传输。请你等待接收

窗口大小:通过窗口,接收方告诉发送方我现在没有缓存,让停止发送,有缓存又告诉发送方现在缓存多少。

选项最大可以做到40字节。

tcp的首部

每个tcp段都包含源端和目的端的端口号,用于寻找发端和收端应用进程,这两个值加上ip首部中的源端ip地址和目的端ip地址唯一确定一个tcp链接。

一个ip地址和一个端口号也成为一个插口(socket)插口对(socketpair)(包含客户Ip地址、客户端口号、服务器ip地址和服务器端口号的四元组)可唯一确定互联网络中每个tcp链接的双方。

序号用来标识从tcp发端向tcp收端发送的数据字节流,它标识在这个报文端中的第一个数据字节。如果将字节流看做在两个应用程序间的单向流动,则tcp个序列号对每个字节进行计数,序号是32bit的无符号数,序号到达232-1后又从0开始。syn标志消耗了一个序号。

确认序号应当是上次已成功收到数据字节序号加1,只有ack标志位1时确认序号字段才有效。

发送ack无需任何代价,因为32bit的去人序号字段和ack标志一样,总是tcp首部的一部分,因此,我们看到一旦一个链接建立起来,这个字段总是被设置,ack标志也总是被设置为1.

tcp为应用层提供全双工服务,这意味数据能在两个方向上独立地进行传输,因此,链接的没一端必须保持每个方向上的传输数据序号。

tcp可以表述为一个没有选择确认或否认的滑动窗口协议(滑动窗口协议用于数据传输)。我们说tcp缺少选择确认是因为tcp首部中的去人序号表示发放已成功收到字节,但还不包含确认序号所指的字节。当前还无法对数据流中选定的部分进行确认,例如,如果1~1024字节已经成功收到,下一报文中包含序列号从2049~3072的字节,收端并不能确认这个新的报文段,它所能做的就是发回一个确认序号为1025的ack.它也无法对一个报文段进行否认,例如,如果收到包含1025~2048字节的报文段,但它的检验和错,tcp接受端所能做的就是发回一个确认序号为1025的ack.

首部长度给出首部中32bit字的数目。需要这个值是因为任选字段的长度是可变的。这个字段占4bit,因此tcp最多有60字节的首部。然后,没有任选字段,正常的长度是20字节。

在tcp首部中有6个标志比特,他们中的多个可同时被设置为1.

urg 紧急指针(urgent pointer)

ack 确认序号有效。

psh 接收方应该尽快将这个报文段交给应用层。

rst 重建连接

syn 同步序号用来发起一个链接。

fin 发端完成发送任务

tcp的流量控制由连接的每端通过声明的窗口大小来提供。窗口大小为字节数,2于确认序号字段指明的值,这个值是接收端正期望接收的字节。窗口大小是一个16bit字段,因而窗口大小为65535字节。

检验和覆盖了整个的tcp报文段:tcp首部和tcp数据。这是一个强制性字段,一定由发端计算和存储,并由收端进行验证,tcp检验和的计算和udp检验和的计算相似。

只有当urg标志置1时紧急指针才有效。紧急指针是一个正的偏移量,和序号字段中的值相加标示紧急数据最后一个字节的序号。tcp的紧急方式是发送端向另一端发送紧急数据的一种方式。

最常见的可选字段是最长报文大小,又称mss(maximum segment size).每个链接方通常都在通信的第一个报文段(为建立连接而设置syn标志的那个段)中指明这个选项。它指明本端所能接收的最大长度的报文段。

tcp报文中的数据部分是可选的。在一个链接建立和一个链接终止时,双方交换的报文段仅有tcp首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据,在处理超时的许多情况中,也会发送不带任何数据的报文段。

2.tcp链接的建立和终止

tcp是一个面向连接的协议。无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。

这种两端间连接的建立与无连接协议如udp不同。

发送一个syn的一端将执行主动打开(acitve open)。接收这个syn并发回下一个syn的另一端执行被动打开(passive open)

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

如何进行序号选择,在系统初始化时初始的发送序号被初始化为1.这种方法违背了host requirements rfc。这个变量每0.5秒增加64000,并每隔9.5小时又回到0(对应这个计数器每8ms加1,而不是每4ms加1)。另外,每次建立一个链接后,这个变量将增加64000.

链接终止协议

建立一个链接需要三次握手,而终止一个链接需要经过4次握手。这由tcp的半关闭(half-close)造成的。既然一个tcp链接是全双工(即数据在两个方向上能同时传递),因此每个方向必须单独进行关闭。这原则就是当一方完成它的数据发送任务后就能发送任务后就能发送一个fin来终止这个方向链接。当一端收到一个fin,它必须通知应用层另一端几经终止那个方向数据传送。发送fin通常是应用层进行关闭的结果。

收到一个fin只意味着在这一方向上没有数据流动。一个tcp链接在收到一个fin后仍能发送数据。而这对利用半关闭的应用来说是可能的,尽管在实际应用中只有很少的tcp应用程序这样做。

首先进行关闭的一方(即发送第一个fin)将执行主动关闭,而另一方(收到这个fin)执行被动关闭。通常一方完成主动关闭而另一方完成被动关闭。

发送fin将导致应用程序关闭它们的连接,这些fin的ack是由tcp软件自动产生的。

最大报文长度

在有些书中,将它看做可协商选项,它并不是任何条件下都可以协商。当建立一个链接时,每一方都有用于通告它期望接收的mss选项(mss选项只能出现在syn报文段中)。如果一方不接收来自另一方的mss值,则mss就定位默认值536字节

一般来说,如果没有分段发生,mss还是越大越好(这也并不总是正确)、报文段越大允许每个报文段传输的数据就越多,相对ip和tcp首部有更高的网络利用率。当tcp发送一个syn时,或者是因为一个本地应用进程想发起一个链接,或者是因为另一端的主机收到了一个链接请求,它能将mss值设置为外出口接口上的mtu长度减去固定的ip首部和tcp首部长度。对于一个以太网,mss值可达1460字节。使用ieee802.3的封装,它的mss可达1452字节。

如果目的ip为非本地的(nonlocal),mss通常默认值为536.而区分地址是本地还是非本地是简单的,如果目的ip地址的网络号与子网号都和我们的相同,则是本地的;如果目的ip地址的网络号与我们的完全不同,则是非本地的,如果目的ip地址的网络号与我们的相同而子网号与我们的不同,则可能是本地的,也可能是非本地的,大多数tcp实现版都提供了一个配置选项,让系统管理员说明不同的子网是属于本地还是非本地,这个选项设置将确定mss可选择尽可能的大(达到外出接口的mtu长度)或是默认536.tcp的半关闭

tcp提供了连接的一段在结束它的发送后还能接收来自另一端数据的能力,这就是所谓的半关闭。

标签:字节,报文,介绍,发送,tcp,序号,链接
From: https://www.cnblogs.com/smoke520/p/18359993

相关文章

  • tcp介绍.4
    快速重传和快速恢复算法快速重传算法:如果一连串收到3个或3个以上的重复ack,就非常可能是一个报文段丢失了,于是我们就重传丢失的数据报文段,而无需等待超时定时器溢出。快速恢复算法:快速重传后执行的不是慢启动算法而是拥塞避免算法icmp的差错tcp能够遇到的最常见的icmp差错就是......
  • 推荐系统三十六式学习笔记:工程篇.效果保证31|推荐系统的测试方法及常用指标介绍
    目录为什么要关注指标推荐系统的测试方法1.业务规则扫描2.离线模拟测试3.在线对比测试4.用户访谈常用指标1.系统有多好?假设你已经有了自己的推荐系统,这个系统已经上线。为什么要关注指标面对推荐系统这样一个有诸多复杂因素联动起作用的系统,要时时刻刻知道它好不......
  • 【网编】——tcp编程
    tcp流程服务器 头文件:#include<sys/types.h>     /*SeeNOTES*/#include<sys/socket.h>#include<errno.h>#include<stdio.h>#include<netinet/in.h>#include<netinet/ip.h>/*supersetofprevious*/#include<arp......
  • 一篇文章带你弄懂Python基础之列表介绍和循环遍历
    大家好,我是Go进阶者,今天给大家分享一些Python基础(列表基础和循环遍历介绍),一起来看看吧~一、列表介绍想一想:字符串可以用来存储一串信息,那么想一想,怎样存储所有同学的名字呢?定义100个变量,每个变量存放一个学生的姓名可行吗?有更好的办法吗?答:列表。1.列表的格式namesList=[......
  • 7.接口文档,JWT介绍
    【一】接口文档1)公司使用使用world编写MD共享文档第三方平台:如:https://www.showdoc.com.cn/公司自研2)主要内容如下说明变更记录全局错误相关接口简要描述请求URL请求方式参数返回示例返回参数说明备注3)字段生成(coreapi使用)安装pipinstal......
  • OpenGL 之EGL API 介绍
    EGL介绍EGL是OpenGLES和底层Native平台视窗系统之间的接口。OpenGLES本质上是一个图形渲染管线的状态机,而EGL则是用于监控这些状态以及维护Framebuffer和其他渲染Surface的外部层。EGL提供如下机制:与设备的原生窗口系统通信查询绘图表面的可用类型和配置创......
  • 使用TcpDump 和 Wireshark 分析数据库异常
    MySQL:5.7.19OS:rhel6.3jdbc:mysql-connector-java-5.1.45.jarjava:17.0.7问题:MySQL数据库在修改character_set_server和表的对应字段为utf8mb4后,任然无法插入emoji表情1.抓包1、登陆MySQL服务器,确定实际使用的网卡;2、执行tcpdump-s65535-x-nn-......
  • TCP三次握手和四次挥手
    TCP三次握手和四次挥手详解在网络通信中,TCP(传输控制协议)是一个非常重要的协议,用于确保数据在不可靠的网络环境中能够可靠传输。TCP通过三次握手(Three-wayHandshake)建立连接,通过四次挥手(Four-wayTermination)终止连接。一、TCP三次握手TCP的三次握手用于确保客户端和服务器之......
  • python之numpy(1 安装及基本介绍)
    numpy介绍numpy是Python中的一个非常流行的库,它提供了大量的数学函数工具,特别是针对数组和矩阵的操作。numpy的全称是NumericalPython,它极大地简化了数组和矩阵的运算,使得Python成为进行科学计算的一个强大工具。安装numpy要安装numpy,需在终端(win+r---->cmd)提示符下执......
  • LoadRunner常用函数介绍
    内置函数和Jmeter差不多,Jmeter更火,更好百度,毕竟开源,用的人多,所以有些函数如果不太懂用法,可以百度Jmeter作为参考来使用LR。 大家使用中应用函数不会的话留言就行,我开始用的时候反正不懂,不明白怎么使用,怎么应用,有和我一样的童鞋可交流脚本中常用函数事务组lr_start_transac......