定义:
Transmission Control Protocol,即传输控制协议。是一种面向连接(连接导向)的、可靠的、基于字节流的运输层通信协议,由IETF的RFC793说明。
功能:
在计算机网络OSI模型中,它完成第四层传输层所指定的功能,给数据提供可靠的端到端的传输,能够处理顺序传输和恢复错误,并且保证数据能够到达目的地。
端口号:
1、TCP段结构中端口地址都是16比特,可以有在0~65535范围内的端口号。1至1023号端口属于标准端口组,往往是特定的服务所使用的。而1024至65535号端口则是临时端口,需要使用时,操作系统会在通信时以随机的方式或者采用一定的策略进行选择。
2、所有TCP通信都会使用源端口和目的端口,这些信息可以在每个TCP数据包的头部找到。为了能够将数据传输到远程服务器或设备的特定应用中去,TCP数据包必须知道远程服务所监听的端口。
例子:
分析: 查看第一个数据包的TCP头部。可以看到这个数据包源地址和目的地址,它的源端口号是2826,属于临时端口,它是由操作系统选取的。目的端口是80端口,这是一个标准端口,这个端口通常提供给使用HTTP的Web服务器。
查看wireshark的端口关联的常用服务
选择菜单栏的“Edit”——“Preference”——“Name Resolution”——勾选“Resolve transport names”,就可以打开传输端口的解析,在Packet Details面板就能显示啦,但有时wireshark的解析不一定对,我的另一个文章有解释哟https://blog.csdn.net/Woolemon/article/details/124004225
所有基于TCP的通信都以相同的方式工作
选择一个随机的源端口与一个已知的目标端口进行通信。在发出数据包之后,远程设备就会与源设备使用建立起的端口进行通信。
为了提高传送效率避免出现丢包现象
发送方需要知道接收方的接收窗口和网络带宽哪一个才是瓶颈,然后在限制的范围内发送。一口气能发送的数据量等于TCP窗口大小。
Seq:请求的序列号,ACK:确认序列号,SYN和ACK:控制位。
1、第一次握手
在第一次握手 建立连接时,客户端会向服务器发送SYN数据包(SYN=1,seq=x),并进入SYN_SENT状态,等待服务器的确认。
2、第二次握手 分为两步来完成的,即SYN加上ACK,也就是请求和确认数据包。
(1)服务器收到了客户端的请求,向客户端回复一个确认信息(ack=x+1)。
(2)服务器再向客户端发送一个SYN包(seq=y)从而建立连接请求,此时服务器进入了SYN_RCVD状态。
3、第三次握手 客户端收到服务器的回复,也就是SYN加上ACK数据包。此时,客户端也要向服务器发送确认数据包(ACK)并置发送序号。
发送完毕之后,客户端和服务器就进入了ESTABLISHED的状态,从而完成了三次握手。客户端和服务端就可以开始传输数据了。
如:假设接收方并未收到2号数据包,那么这里可以先计算一下1号数据包的Seq+Len的值,假设为4131971144,再减去下一个数据包的Seq,假设结果是1448,那么就可以知道有Len=1448的数据包丢失了。
将TCP数据包的序列号恢复为原始值:
选择菜单栏的“Edit”——“Preference”——展开窗口左侧的“Protocols”——选择“TCP”——取消勾选“Analyze TCP sequence numbers”——单击OK
在TCP通信中,每次握手之后都会有断开的操作,一旦TCP通信结束,就会使用4个数据包以及一个FIN标志表明连接的结束。
TCP的断开步骤如下:
1、客户端向服务器发送一个设置了FIN和ACK标志位的TCP数据包,告诉服务器通信完成。
2、服务器收到客户端发来的数据包后,发送一个ACK数据包来回应客户端。
3、服务器再向客户端传输一个自己的FIN/ACK数据包。
4、客户端收到服务器的FIN/ACK数据包后,再向服务器发送一个ACK数据包,之后就结束通信过程。
原因:正常情况下,TCP通信的连接都会以TCP的四次握手断开。但现实中,网络连接有时会出现断掉,有可能是遭受到了网络攻击,也有可能是出现了配置错误的情况等等。此时就需要建立TCP通信重置告诉对方,即使用设置了RST标志的TCP数据包,表示出现了连接被异常终止或拒绝连接的请求。
在TCP重传的理论中,重传计时器是用于决定是否有必要进行数据包重传的一个主要机制。
重传计时器:维护着一个叫做重传超时(Retransmission timeout,RTO)的值。
往返时间(Round-trip time,RTT):从发送数据包到接收到确认数据包的时间。
判断包是否丢失:
1、在使用TCP进行数据包的传送时,重传计时器就会被启动。
2、当收到数据包的ACK,也就是确认数据包时,计时器就会停止。
3、然后将若干个往返时间求和并计算平均值,就可以得出最终的RTO值。一旦RTO值被确定下来,重传计时器就被应用于每个传输的数据包,从而确定数据包是否丢失。
!注意在最终计算出RTO值之前,数据的传输操作将会一直依赖于默认的RTT值。这个设置用于主机之间的初始通信,并基于接收到的数据包的RTT进行调整,从而形成真正的RTO值。
什么时候重传
1、当数据包发送出去,但接收方没有发送TCP ACK数据包时,发送方就假设原来发送的数据包并没有发送到目标主机,认为它丢失了,于是就进行重传。
2、因为Seq序列号可以帮助数据进行有序的传输,如果接收方遇到不符合顺序的序列号,就知道数据包丢失了,然后接收方会发送重复的包含丢失数据包序列号的ACK数据包给发送方,发送方看到就会立刻发起快速重传的机制。
每次的重传,都会导致RTO的值翻倍,直至收到ACK数据包,或者发送方达到配置的最大重传次数为止。
wireshark中将TCP重传数据包标志
Edit——Preferences——Protocols——tcp——将analyze tcp sequence numbers勾选——apply——ok
判断数据包是否是重传
当接收端接收到第一个数据包之后,往往很快就可以看到用于响应的TCP ACK数据包。但如果第二个数据包是一个TCP Retransmission数据包,则这个是重传数据包。
重传数据包特征
重传数据包和第一个数据包的Data区段,也就是所传输数据的主体内容,是完全一致的。
展开查看Packet Details面板中的TCP,还可以发现相应的RTO的值等信息,并且这个RTO与每个数据包的发送时间是相吻合的,呈指数增长。
定义:
UDP指的是User Datagram rotocol,即用户数据报协议,是在现代网络中最常使用的另外一种第四层的协议。是无连接的传输层协议,提供面向事物的、简单的、不可靠的信息传输服务。
TCP与UDP主要区别:
TCP是为了满足带有内在错误检测的可靠数据传输,那么UDP主要是为了提供高速的传输,并不会正式地建立和结束主机之间的连接,也不会像TCP那样存在握手和终止的过程。
UDP协议特点:
1、因为UDP是无连接协议,是一种不可靠的服务,所以UDP的流量一点都不稳定。
2、UDP能提供高速的传输,其他协议常常需要结合它。比如,应用层协议DNS和DHCP需要高度依赖数据包在网络上的传输速度,因此需要使用UDP协议,并利用它们自身的错误检查以及重传计时来保证数据的正确传输。
3、UDP并不关心传输的可靠性,所以任何使用UDP的应用在必要的时候都需要采取特殊的步骤,从而保证传输的可靠性。
TCP三次握手数据包捕获
如:
1、打开wireshark,然后设置储存捕获到的tcp文件(Capture——Options——在Capture Filter里输入tcp——在Flie里填入文件路径)
2、打开一个网站 ,开始捕获数据包
3、打开刚刚储存捕获到的tcp文件,对数据包进行特定条件筛选(通过“Edit”->“Find Packet”,在弹出的对话框中以String的形式搜索字符串->网站的名称),根据http数据包就能知道源IP地址以及目标IP地址
4、利用筛选器,输入筛选条件ip.addr==源地址的ip && ip.addr==目标地址ip
,获得两个IP地址之间的流量
5、寻找Tcp的三次握手方法一:逐一查看数据包,根据数据包中seq以及ack的值进行匹配
方法二:将握手相关的数据包着色直接显示(选择一个握手的数据包——右键——colorize converstation——tcp——选一个颜色),在根据数据包中seq以及ack的值进行筛选6、将Tcp的三次握手三个数据包导出来,
(将TCP三次握手的数据中标志(右键——make packet)——选择“File”->“Export Specified Packets”->在弹出的对话框中给文件起一个名字->在“packet Range”选择maked packets>选择“保存”)那么只包含有三个数据包的捕获文件就生成了。
捕获DUP数据包
如:
如果要捕获UDP的数据包,最简单的便是开启了QQ的视频聊天,因为QQ视频所使用的是UDP协议,所以抓取的包大部分是采用UDP协议的包。然后就可以根据数据包分析啦