1.TCP
TCP(Transmission Control Protocol)协议是TCP/IP协议簇中传输层的一个协议,是TCP/IP模型中的第四层传输层,因为在传输数据之前TCP会向接收方的TCP模块发送一些TCP控制段,然后与接收方建立一个TCP连接,只有在建立连接之后才开始TCP段的传输。所以TCP是一种面向连接的、可靠的传输协议。一个TCP数据包称为TCP segment,即TCP段。
1.1TCP段格式
TCP头部格式:
(1)源端口
(Source Port),表示载荷数据是应用层哪个应用模块产生并发送的
(2)目的端口
(Destination Port),表示载荷数据是应用层哪个应用模块接收并处理
(3)序号
(Sequence Number)是发送数据包的序列号,接收方可以根据序号来判断是否存在分段重收和漏收的情况
(4)确认号
(Acknowledgment Number)指明下一个期待收到的字节序号,表明该序号之前的所有数据已经正确无误的收到。
(5)数据偏移
(Offset)又表示头部长度。由于首部可能含有可选项内容,因此TCP报头的长度是不确定的,但头部字节数一定是4的整倍数。数据偏移的值X4=头部字节数,这个值最大是15,所以头部最大是60字节。
(6)保留
,为将来定义新的用途保留,现在一般置0。
(7)标志
(flags),URG、ACK、PSH、RST、SYN、FIN,共6个,每一个标志位表示一个控制功能,值为1时生效,为0时不生效。可简写成UAPRSF,有时抓包会用两个字符以16进制显示,如UAPRSF=010010,16进制就以“12”表示。
1)URG:紧急指针标志,置1时紧急指针才有效
2)ACK:确认序号标志,连接建立后所有发送的报文的ACK必须为1
3)PSH:接收方应该尽快将这个报文交给应用层。
4)RST:重置连接标志,用于重置由于主机崩溃或其他原因而出现错误的连接。或者用于拒绝非法的报文段和拒绝连接请求。
5)SYN:同步序号,在建立TCP连接的时候使用
6)FIN:结束标志,即将断开TCP连接
(8)窗口
(window)接收缓冲区的空闲空间,用来告诉TCP连接对端自己能够接收的最大数据长度。
(9)检验和
(Checksum)对TCP段进行差错校验
(10)紧急指针
(Urgent Pointers)只有URG标志位为1时有效,表示紧急数据相对序列号的偏移
(11)选项
(options),是可变长的可选信息,这部分最多包含40字节。
每个选项的开始都是1个Byte的kind字段,说明选项的类型,Kind为0或1的时候,选项只占1个Byte,其他选项在kind字段后面还有len字节,说明总长度包括kind和len的字节。
kind=0代表选项表结束。
kind=1代表无操作(nop),一般用于将TCP选项的总长度填充为4字节的整数倍。
kind=2代表MSS(Maximum Segment Size)最长报文大小,一般在TCP三次握手时指明这个选项,它表示本端所能接受的最大报文段的长度。
kind=3代表窗口扩大因子(wscale),提高TCP通信的吞吐量。
kind=4或5是SACK(Selective Acknowledgment,)选择性确认,它使TCP模块只重新发送丢失的TCP报文段,不用发送所有未被确认的TCP报文段。
kind=8代表时间戳(timestamp),提供了较为准确的计算通信双方之间的回路时间的方法,从而为TCP流量控制提供重要信息。
(12)填充
:选项长度不一定是4字节的整数倍,所以要加填充位,会在这个字段中加入额外的零,以保证TCP头部大小是4的整数倍。
1.2TCP三次握手
所谓TCP三次握手是指TCP在建立连接的过程中客户端和服务端总共交换了三个TCP控制段,当这三次TCP段交换完成就会建立TCP连接。
图片来源于龙跃十二的文章,TCP三次握手和四次挥手讲得非常不错。
第一次握手
:客户端将标志位SYN置为1,随机产生一个值saq=i,并将该数据包发送给服务器端。
第二次握手
:服务器端收到数据包后由标志位SYN=1,ACK=1知道客户端请求建立连接,服务器端将标志位SYN和ACK都置为1,ack=i+1,随机产生一个值seq=j,并将该数据包发送给客户端以确认连接请求。
第三次握手
:客户端收到确认后,检查ack是否为i+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=j+1,并将该数据包发送给服务器端,服务器端检查ack是否为j+1,ACK是否为1,如果正确则连接建立成功。完成三次握手,随后客户端与服务器端之间可以开始传输数据了。
1.3TCP四次挥手
TCP四次挥手指断开一个TCP连接时,需要客户端和服务端总共发送4个TCP控制段来确认TCP连接的断开。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭。
第一次挥手
:客户端发送一个FIN=1,seq=x用来关闭客户端到服务器端的数据传送。
第二次挥手
:服务器端收到FIN后,发送ACK=1,ack=x+1,seq=y,如果这时候服务器还在向客户端发送数据,服务器会在数据传输完成之后再发送FIN报文。
第三次挥手
:当服务器端确定数据已发送完成,则向客户端发送FIN=1,ACK=1,seq=m,ack=x+1。
第四次挥手
:客户端发送FIN=1的报文后,验证收到服务器的确认是否为ACK=1,ack=x+1,若正确,又收到服务器发送的FIN=1,ACK=1,ack=x+1,就发送最后的确认报文了。发送确认ACK=1,seq=x+1,ack=m+1,如果Server端没有收到ACK则可以重传。服务器端收到ACK后,就知道可以断开连接了。客户端等待2个MSL(最大报文段生存时间)后依然没有收到回复,则证明服务器端已正常关闭,客户端也可以关闭连接了。最终完成了四次握手。
注:TCP三次握手和四次挥手两边主机的11种状态。
状态 | 描述 |
---|---|
CLOSED | 阻塞或关闭状态,表示主机当前没有正在传输或者建立的链接 |
LISTEN | 监听状态,表示服务器做好准备,等待建立传输链接 |
SYN RECV | 收到第一次的传输请求,还未进行确认 |
SYN SENT | 发送完第一个SYN报文,等待收到确认 |
ESTABLISHED | 链接正常建立之后进入数据传输阶段 |
FIN WAIT1 | 主动发送第一个FIN报文之后进入该状态 |
FIN WAIT2 | 已经收到第一个FIN的确认信号,等待对方发送关闭请求 |
TIMED WAIT | 完成双向链接关闭,等待分组消失 |
CLOSING | 双方同时关闭请求,等待对方确认时 |
CLOSE WAIT | 收到对方的关闭请求并进行确认进入该状态 |
LAST ACK | 等待最后一次确认关闭的报文 |
1.4捎带确认机制
在计算机通信中,当一个数据帧到达的时候,接收方并不是立即发送一个单独的控制帧,而是抑制一下自己并且开始等待,直到网络层传递给它下一个分组。然后,确认信息被附在往外发送的数据帧上(使用帧头中的ack域)。实际上,确认报文搭了下一个外发数据帧的便车。这种“将确认暂时延迟以便可以钩到下一个外发数据帧”的技术称为捎带确认(piggybacking)。
当主机收到远程主机的TCP数据包之后,通常不马上发送ACK数据包,而是等上一个短暂的时间,如果这段时间里面主机还有发送到远程主机的TCP数据包,那么就把这个ACK数据包“捎带”着发送出去,把本来两个TCP数据包整合成一个发送。一般的,这个时间是200ms。可以明显地看到这个策略可以把TCP数据包的利用率提高很多。
如果客户端和服务器同时发起连接会发生什么呢?答案是TCP握手可以建立连接,但是整个过程只有四个段而已不是六个。两边同时建立,发现少了最后一个ACK应答,其实最后一个应答是因为捎带机制和第二个ACK合并了。
TCP三次挥手?经常抓包的人会发现挥手过程可能会出现三次挥手的情况。比如客户端使用SSH登录服务器,又立即断开连接时,TCP断开只有三次挥手,其中第二次的ACK确认和第三次发送的FIN中的ACK合并了,这就是捎带ACK机制。三次挥手一般是在服务器没有向客户端发送数据断开连接时发生。
1.5TCP超时重传机制
超时重传是TCP协议保证数据可靠性最重要的机制。其原理是在发送某一个数据以后就开启一个计时器,在一定时间内如果没有得到发送的数据报的ACK报文,TCP就认为报文段中的数据已丢失或损坏,那么就重新发送数据,直到发送成功为止。尽管超时重传的概念十分简单,但是在实现中TCP处理超时重传的机制与其他可靠性协议相比是相当复杂的。所以我这里也只讲解一下重传的过程。
重传超时时间RTO
(Retransmission time-Out):发送端每发送一个报文段,TCP便为其保留一个副本、设定一个计时器并等待确认信息。如果计时器超时,而发送的报文段中的数据仍未得到确认,则重传这一报文段,直到发送成功为止。RTO是计算是超时重传的关键部分,TCP要求能大致估计出当前的网络状况。
传输往返时间RTT
(Round Trip Time)判断超时采取的比较简单的方法就是指定一个固定的超时值,启动一个时间间隔为该值的计时器,计时器超时后就进行重发。RTT就是所有网络上报文段的数据传输加上确认传输的时间,这个时间一过就可以确定报文段已经丢失了。
RTO的取值会略大于RTT以保证数据包的正常传输。RFC 2988中建议RTO的计算方式为:RTO = RTTs + 4 X RTTd
其中RTTs 为加权平均往返时间,RTTd是偏差的加权平均值。
超时重传的流程:
(1)发送方发送第一个段,seq=1
(2)发送方发送第二个段,seq=11,此段因网络原因丢失
(3)接收端收到了第一个段,回复ack=11
(4)发送方发送第三个段,seq=21
(5)定时器到期,但是发送方仍没有收到第二段的ack,而且后续收到的ack都是11
(6)接收端收到第三个段后放入缓存,但不会发送ACK,等待丢失的段收到之后累计进行发送
(7)发送方进行第二个段重传
(8)接收方收到第二个段后,直接回复ack=31,表示收到丢失的段并且第三个段也收到了,发送方直接发送第四段,而不需要将第三段也进行重传。
接收端虽然知道第二段没收到但收到了第三段,但确认ack一直回复11。发送方不知道接收方第二段之后的包有没有收到,如果第二段定时器到期,在发送方发送完成第二段的时候,需要等待接收方的回应。在这期间是发送第三段还是继续之前后面段的发送呢?还记得TCP选项中SACK项吗,它会告诉发送方哪一段丢失了,重传时只需要发送丢失的段就行了。所以重传第二段之后,发送方就会按原来正常的顺序发送了。
1.6TCP快速重传机制
超时重传时当一个报文段丢失,会等待一定的超时周期然后才重传分组,增加了端到端的时延。由于TCP采用的是累计确认机制,即当接收端收到比期望序号大的报文段时,便会重复发送最近一次确认的报文段的确认信号,我们称之为冗余ACK(duplicate ACK)。
如果连续收到3次dup ACK,发送方就认为这个序号的段丢失了,立刻进行重传,这样如果接收端回复及时的话,就可以在重传定时器到期之前将丢失的段重传了。
2.UDP
UDP(User Datagram Protocol)用户数据报协议, 和TCP不同的是UDP为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法,提供面向事务的简单不可靠信息传送服务。
UDP报文没有可靠性保证、顺序保证和流量控制字段等,可靠性较差。但是正因为UDP协议的控制选项较少,在数据传输过程中延迟小、数据传输效率高,适合对可靠性要求不高的应用程序,或者可以保障可靠性的应用程序,如DNS、TFTP、SNMP等。
2.1UDP报文头部格式
UDP报文头部格式非常简单
(1)源端口
和目的端口
,作用和TCP段头部的源端口和目标端口含义和作用完全一样,表示载荷数据是应用层哪个应用模块接收发送和处理的。
(2)报文长度
,是指包括报头和数据部分在内的总字节数。
(3)检验和
,为报文提供错误检测,但检测到错误时,UDP不做错误校正,只是简单地把损坏的消息段扔掉,或者给应用程序提供警告信息。
2.2UDP的特性
(1)UDP是一个无连接协议,传输数据之前源端和终端不建立连接,抓取来自应用程序的数据,并尽可能快地把它扔到网络上。
(2)UDP报文头部很短,只有8个字节,相对于TCP的20个字节信息包的额外开销很小。
(3)由于不需要连接,一台服务器可同时向多个客户机传输相同的消息。
3.常用协议号和端口号
协议 | 协议号 | 作用 |
---|---|---|
ICMP | 1 | Internet控制报文协议 |
IGMP | 2 | Internet组管理协议 |
TCP | 6 | 传输控制协议 |
EGP | 8 | 外部网关协议 |
IGP | 9 | 专用内部网关协议 |
UDP | 17 | 用户数据报协议 |
GRE | 47 | 通用路由封装协议 |
ESP | 50 | 封装安全载荷协议 |
AH | 51 | 身份验证标头 |
EIGRP | 88 | 增强内部网关路由协议,思科私有 |
OSPF | 89 | 开放式最短路径优先协议 |
VRRP | 112 | 虚拟路由器冗余协议 |
L2TP | 115 | 第二层隧道协议 |
服务 | 端口号 | 作用 | 传输层协议 |
---|---|---|---|
FTP-data | 20 | 文件传输协议数据连接 | TCP |
FTP | 21 | 文件传输协议控制连接 | TCP |
SSH | 22 | 远程登陆服务 | TCP |
Telnet | 23 | 远程登陆服务 | TCP |
SMTP | 25 | 电子邮件传输协议 | TCP |
DNS | 53 | 域名解析服务 | TCP/UDP |
DHCP-request | 67 | 地址分配协议请求的端口 | UDP |
DHCP-reply | 68 | 地址解析客户端回应端口 | UDP |
TFTP | 69 | 简单文件传输协议 | UDP |
HTTP | 80 | 超文本传输协议 | TCP |
POP2 | 109 | 邮局协议2 | TCP |
POP3 | 110 | 邮局协议3 | TCP |
SNMP | 161 | 简单网络管理协议 | UDP |
BGP | 179 | 边界网关协议 | TCP |
HTTPS | 443 | 基于TLS/SSL的超文本传输协议 | TCP |
MSTSC | 3389 | 远程桌面 | TCP |
参考文章:
https://cloud.tencent.com/developer/article/1613398
https://blog.csdn.net/wdscq1234/article/details/52476231
https://blog.csdn.net/whgtheone/article/details/80983882