网络学习-5.TCP与UDP

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.常用协议号和端口号

协议协议号作用
ICMP1Internet控制报文协议
IGMP2Internet组管理协议
TCP6传输控制协议
EGP8外部网关协议
IGP9专用内部网关协议
UDP17用户数据报协议
GRE47通用路由封装协议
ESP50封装安全载荷协议
AH51身份验证标头
EIGRP88增强内部网关路由协议,思科私有
OSPF89开放式最短路径优先协议
VRRP112虚拟路由器冗余协议
L2TP115第二层隧道协议
服务端口号作用传输层协议
FTP-data20文件传输协议数据连接TCP
FTP21文件传输协议控制连接TCP
SSH22远程登陆服务TCP
Telnet23远程登陆服务TCP
SMTP25电子邮件传输协议TCP
DNS53域名解析服务TCP/UDP
DHCP-request67地址分配协议请求的端口UDP
DHCP-reply68地址解析客户端回应端口UDP
TFTP69简单文件传输协议UDP
HTTP80超文本传输协议TCP
POP2109邮局协议2TCP
POP3110邮局协议3TCP
SNMP161简单网络管理协议UDP
BGP179边界网关协议TCP
HTTPS443基于TLS/SSL的超文本传输协议TCP
MSTSC3389远程桌面TCP

参考文章:
https://cloud.tencent.com/developer/article/1613398
https://blog.csdn.net/wdscq1234/article/details/52476231
https://blog.csdn.net/whgtheone/article/details/80983882

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值