志在指尖
用双手敲打未来

tcp数据包(tcp数据包结构图详解)

tcp数据包

TCP报文由首部和数据两部分组成。首部一般由20-60字节(Byte)构成,长度可变。其中前20B格式固定,后40B为可选。
因为,TCP报文还得传给下层网络层,封装成IP包,而一个IP包最大长度为65535,一起IP包首部也包含最少20B,所以一个IP包或TCP包能够包含的数据部分最大长度为65535-20-20=65495B。
TCP报文中数据部分是可选的,即TCP报文能够不包含数据(同理IP包也能够不包含数据)。不含数据的TCP报文通常是一些供认和控制信息类的报文,如TCP树立联接时的三次握手和TCP停止时的四次挥手等。
1、源端口号(SourcePort)
长度为16位,指明发送数据的进程。
2、意图端口号(DestinationPort)
长度为16位,指明意图主机接纳数据的进程。
3、序号(SequenceNumber)记载发送次数
也称为序列号,长度为32位,序号用来标识从TCP发送端向接入端发送的数据字节流进行编号,能够了解成对字节流的计数。
4、供认号(AcknowledgementNumber)
长度为32位,供认号包含发送供认的一端所希望收到的下一个序号。供认号只要在ACK标志为1时才有效。
5、首部长度(数据偏移)
长度为4位,用于标明TCP报文首部的长度。用4位(bit)标明,十进制值便是[0,15],一个TCP报文前20个字节是必有的,后40个字节根据状况或许有或许没有。假如TCP报文首部是20个字节,则该位应是20/4=5。
6、保存位(Reserved)
长度为6位,有必要是0,它是为将来界说新用途保存的。给QOS预留用的。
7、标志(CodeBits)
长度为6位,在TCP报文中不管是握手仍是挥手仍是传数据等,这6位标志都很重要。6位从左到右依次为:

tcp

tcp数据包结构图详解

TCP(TransmissionControlProtocol,传输操控协议)是一种面向衔接的、可靠的、基于字节省的通信协议,数据在传输前要树立衔接,传输结束后还要断开衔接。
客户端在收发数据前要运用connect()函数和服务器树立衔接。树立衔接的目的是保证IP地址、端口、物理链路等正确无误,为数据的传输开辟通道。
TCP树立衔接时要传输三个数据包,俗称三次握手(Three-wayHandshaking)。可以形象的比喻为下面的对话:
[Shake1]套接字A:“你好,套接字B,我这里有数据要传送给你,树立衔接吧。”
[Shake2]套接字B:“好的,我这边已准备就绪。”
[Shake3]套接字A:“谢谢你受理我的恳求。”
TCP数据报结构
咱们先来看一下TCP数据报的结构:
带阴影的几个字段需求要点阐明一下:
序号:Seq(SequenceNumber)序号占32位,用来标识从核算机A发送到核算机B的数据包的序号,核算机发送数据时对此进行符号。
承认号:Ack(AcknowledgeNumber)承认号占32位,客户端和服务器端都可以发送,Ack=Seq+1。
标志位:每个标志位占用1Bit,共有6个,分别为URG、ACK、PSH、RST、SYN、FIN,具体含义如下:
URG:紧急指针(urgentpointer)有效。
ACK:承认序号有效。
PSH:接收方应该尽快将这个报文交给应用层。
RST:重置衔接。
SYN:树立一个新衔接。
FIN:断开一个衔接。
对英文字母缩写的总结:Seq是Sequence的缩写,表明序列;
Ack(ACK)是Acknowledge的缩写,表明承认;SYN是Synchronous的缩写,乐意是“同步的”,这里表明树立同步衔接;FIN是Finish的缩写,表明完结。
衔接的树立(三次握手)
运用connect()树立衔接时,客户端和服务器端会相互发送三个数据包,请看下图:
客户端调用socket()函数创建套接字后,由于没有树立衔接,所以套接字处于CLOSED状况;服务器端调用listen()函数后,套接字进入LISTEN状况,开端监听客户端恳求。
这个时候,客户端开端建议恳求:
当客户端调用connect()函数后,TCP协议会组成一个数据包,并设置SYN标志位,表明该数据包是用来树立同步衔接的。一起生成一个随机数字1000,填充“序号(Seq)”字段,表明该数据包的序号。完结这些作业,开端向服务器端发送数据包,客户端就进入了SYN-SEND状况。
服务器端收到数据包,检测到现已设置了SYN标志位,就知道这是客户端发来的树立衔接的“恳求包”。服务器端也会组成一个数据包,并设置SYN和ACK标志位,SYN表明该数据包用来树立衔接,ACK用来承认收到了方才客户端发送的数据包。
服务器生成一个随机数2000,填充“序号(Seq)”字段。2000和客户端数据包没有关系。
服务器将客户端数据包序号(1000)加1,得到1001,并用这个数字填充“承认号(Ack)”字段。
服务器将数据包宣布,进入SYN-RECV状况。
客户端收到数据包,检测到现已设置了SYN和ACK标志位,就知道这是服务器发来的“承认包”。客户端会检测“承认号(Ack)”字段,看它的值是否为1000+1,如果是就阐明衔接树立成功。
接下来,客户端会继续组成数据包,并设置ACK标志位,表明客户端正确接收了服务器发来的“承认包”。一起,将方才服务器发来的数据包序号(2000)加1,得到2001,并用这个数字来填充“承认号(Ack)”字段。
客户端将数据包宣布,进入ESTABLISED状况,表明衔接现已成功树立。
服务器端收到数据包,检测到现已设置了ACK标志位,就知道这是客户端发来的“承认包”。服务器会检测“承认号(Ack)”字段,看它的值是否为2000+1,如果是就阐明衔接树立成功,服务器进入ESTABLISED状况。
至此,客户端和服务器都进入了ESTABLISED状况,衔接树立成功,接下来就可以收发数据了。
最终的阐明
三次握手的关键是要承认对方收到了自己的数据包,这个目标就是经过“承认号(Ack)”字段实现的。核算时机记载下自己发送的数据包序号Seq,待收到对方的数据包后,检测“承认号(Ack)”字段,看Ack=Seq+1是否成立,如果成立阐明对方正确收到了自己的数据包。

未经允许不得转载:IT技术网站 » tcp数据包(tcp数据包结构图详解)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载