TCP头(一)TCP协议头TCP是指传输控制协议,其头格式如下:1)Source/destinationportnumber:表示数据来自哪个进程,它来自哪个进程去。2)32位序列号/32位确认号:用于可靠传输。3)4-bitTCPheaderlength:表示TCPheader有多少个32-bit位(多少个4字节),所以TCPheader的最大长度为15*4=60。4)6位标志位:TCP协议中的6个标志位,URG、ACK、PSH、RST、SYN、FIN。A、UGR(urgent):UGR=1表示urgent指针字段有效。它告诉系统这个段有紧急数据,应该尽快发送。从报文段开始到紧急指针指向的地方就是紧急数据。B.ACK(确认):当ACK=1时,确认号字段有效。C.PSH(push):让对方立即收到响应。与URG不同的是,URG中的紧急数据直接交给上层逻辑,不经过缓冲区,而PSH仍然需要从缓冲区中交给,但不需要等到缓冲区区域已满。D、RST(reset):当RST=1时,表示TCP连接出现严重错误,必须释放连接,然后重新连接。RST包用于以下场景(访问不存在的端口。异常终止连接,通常发送FIN,因为FIN是在所有排队数据发送完后发送的,但也可以发送RST异常释放连接。检测一个半开链接,即一端关闭,另一端不知道。此时会发送一个RST进行监控。当连接长时间不使用时,经过连接断开,再次访问连接时会发送一个RST)。E.SYN(同步):用于在建立链接时同步序号。当SYN=1,ACK=0时,表示请求报文。SYN=1,ACK=1表示连接被接受。所以SYN=1表示链接请求或链接接受消息。F、FIN(终止):用于释放一个链接。5)16位窗口大小:表示数据传输的最大长度。6)16位校验和:发送端填充,CRC校验,接收端校验失败,则认为数据有问题。这里的校验和不仅包括TCP头,还包括TCP数据部分。7)16紧急指针:标识哪部分数据是紧急数据。8)40-byteheaderoption:存放窗口扩展因子等信息。tcp_time_wait_linux详细解释了tcp连接是如何建立的tcpflags(2)UDP协议头UDP是指UserDatagramProtocol,其头格式如下:TCP优缺点(1)TCP优点:TCP优点是:可靠、稳定。体现在TCP传输数据之前,会进行三次握手建立连接;传输数据时,它使用校验和、序列号、确认响应、超时重传、流量控制和拥塞控制。为了提高性能,它还使用了滑动窗口、延迟响应和piggyback响应等机制;数据传输完毕后,将断开连接以节省系统资源。(2)TCP的缺点:TCP的缺点:运行缓慢,效率低,占用系统资源多,容易被攻击。因为TCP在传输数据之前需要先建立连接,这会消耗时间;在数据传输过程中,确认机制、重传机制、拥塞控制机制等都会消耗大量的时间,而且所有的传输都必须在每个设备上保持连接,每个连接都会占用系统的CPU、内存等资源;TCP具有确认机制和三次握手机制,这使得TCP容易受到DOS、DDOS、CC等攻击。收到STNflood攻击ji是因为使用TCP时服务器需要监听,此时需要设置一个backlog。UDP的优缺点(1)UDP的优点:运行速度比TCP快,安全。1)运行速度快,因为UDP连接没有TCP的三次握手、确认响应、超时重传、流量控制、拥塞控制等机制,而且UDP是无状态传输协议,所以速度很快传输数据。2)更安全,因为没有TCP的机制,UDP被攻击者利用的漏洞比TCP少。但UDP无法避免攻击ji,例如:UDPFlood攻击ji等。(2)UDP的缺点:不可靠、不稳定。由于UDP没有TCP的可靠机制,如果在数据传输过程中网络质量不好,很容易丢包。tcp连接如何工作TCP和UDP的特点(1)TCP的特点TCP协议是一种连接的、可靠的、面向字节流的、相对较慢的、点对点的传输层协议。TCP协议适用于对可靠性要求高的场合。(2)UDP的特点UDP协议是一种无连接、不可靠、面向数据报、速度相对较快、一对一、多对一的传输层协议。UDP协议适用于需要实时性的场合。因为UDP不保证可靠性,所以UDP也没有重传机制,也没有拥塞机制,它只是尽力传递数据。TCP保证数据可靠性和提高性能的机制(1)确认应答(ACK)机制TCP对数据的每个字节进行编号,即序号。每个ACK都有一个对应的确认序号,意思是告诉发送方已经收到了哪些数据,下次从哪里开始发送。(2)超时重传机制1)超时重传机制的工作过程主机A向B发送数据后,由于网络拥塞等问题,数据可能无法到达主机B。如果主机A在一定时间间隔内没有收到B的确认,它将重传。但是主机A并没有收到B的确认,也可能是因为ACK丢了,所以主机B会收到很多重复的数据。然后TCP协议需要能够识别哪些数据包是重复的并丢弃重复的数据包。这时候可以利用序列号轻松达到去重的效果。2)如何确定超时时间?理想情况下,找一个最短的时间,保证必须在这个时间内返回“确认响应”。但是这个时间的长短会随着不同的网络环境而有所不同。超时时间设置过长,会影响整体的重传效率;如果超时时间设置得太短,可能会频繁发送重复数据包。为了保证在任何环境下的高性能通信,TCP动态计算最大超时时间。在Linux中,超时以500ms为单位进行控制,每次超时重传的超时时间为500ms的整数倍。如果重传一次还是没有响应,等待2500ms后再重传;如果仍然没有得到响应,则等待4500ms后再重传,以此类推,呈指数增长。在累积一定的重传次数后,TCP认为网络或对端主机异常,强行关闭连接。(3)滑动窗口1)为什么需要滑动窗口?上面讨论了确认响应策略。对于发送的每个数据段,给出ACK确认响应,收到ACK后发送下一个数据段。这样做的一大缺点是性能较差,尤其是在数据往返时间较长的情况下。既然发送和接收的性能都比较低,那么如果一次发送多条数据,是不是可以重叠多个段的等待时间来提高性能呢?2)工作进程的窗口大小指的是可以不等待确认响应而继续发送数据的最大值。规定发送前4段时,需要等待任何ACK直接发送。收到第一个ACK后,滑动窗口向后移动,继续发送第五段数据,以此类推。为了维护这个滑动窗口,操作系统内核需要创建一个发送缓冲区来记录当前有哪些数据没有被应答。只有已经确认和回答的数据才能从缓冲区中删除。窗口越大,网络吞吐量越高。那么如果发生丢包,如何重传呢?情况一:数据包已经到达,但是ACK丢了。在这种情况下,部分ACK是否丢失并不重要,因为可以通过后续的ACK来确认。情况二:数据包直接丢失。当某段报文丢失时,发送方总会收到类似1001的ACK,好像在提醒发送方“接收方要1001”。如果发送端主机连续3次收到相同的“1001”,则重新发送1001-2000对应的数据。此时接收端收到1001后,再次返回的ACK是7001,因为2001-7000的接收端其实之前已经收到过,放在接收端操作系统内核的接收缓冲区中.这种机制称为“高速重传控制”,也称为“快速重传”。tcp_window_scaling(四)流量控制1)什么是流量控制?接收端处理数据的速度是有限的。如果发送端发送速度太快,接收端的缓冲区就会被填满。这时候如果发送端继续发送,就会造成丢包,进而造成丢包重传等连锁反应。因此,TCP支持根据接收端的处理能力来决定发送端的发送速度。这种机制称为流量控制。2)工作流程接收端将自己可以接收的缓冲区大小放入TCP头中的“窗口大小”字段,通过ACK端通知发送端。窗口大小字段越大,网络的吞吐量就越高。一旦接收端发现自己的缓冲区快满了,就会将窗口大小设置一个较小的值并通知发送端,发送端收到这个窗口后就会放慢发送速度。如果接收端缓冲区已满,则窗口会置0。此时发送方将不再发送数据,但需要周期性发送一个窗口检测数据段,以便接收端告知发送端窗口大小。3)接收方如何告诉发送方窗口大小?在TCP头中,有一个16位的窗口字段用于存储窗口信息。16位的最大值是65535,那么TCP窗口最大是65535字节吗?实际上,TCP头中的40字节选项还包含了一个窗口扩展因子M,实际的窗口大小是窗口字段左移M位的值。(5)拥塞控制1)拥塞控制的必要性虽然TCP有滑动窗口这个大杀器,可以高效可靠的发送大量数据,但是如果在初始阶段发送大量数据,可能仍然会导致问题。由于网络中有很多计算机,当前的网络状况可能已经比较拥堵,在不知道当前网络状况的情况下贸然发送大量数据很可能会使事情变得更糟。2)慢启动TCP引入了慢启动机制,先发送少量数据探路,找出当前网络拥塞状态,然后决定以多快的速度传输数据。这里引入一个概念——拥塞窗口。当传输开始时,拥塞窗口的大小被定义为1。每收到一个ACK响应,拥塞窗口加1,每发送一个数据包,将拥塞窗口与接收主机反馈的窗口大小进行比较,取较小的值作为实际值发送窗口。3)慢启动阈值像上面这样的拥塞窗口的增长速度是指数级的。“慢启动”只是指开始缓慢但增长非常快。为了不那么快地增长,不能使用简单的加倍拥塞窗口。这里引入一个叫做慢启动的阈值。当拥塞窗口超过这个阈值后,不再呈指数增长,而是线性增长。当TCP开始启动时,慢启动阈值等于窗口的最大值。每次超时重传时,慢启动阈值会变成原来的一半,拥塞窗口会重新设置为1。少量丢包只会触发超时重传,大量丢包会被认为是网络拥塞。当TCP通信开始时,网络吞吐量会逐渐增加,随着网络拥塞,吞吐量会立即下降。拥塞控制。归根结底,TCP协议是想以最快的速度将数据传输给对方,但也需要避免妥协导致网络压力过大。(TCP拥塞控制的过程就像是热恋的感觉)(6)延迟响应如果主机收到数据后立即返回ACK响应,此时返回的可能性比较小。假设接收缓冲区为1M,一次接收500k数据,如果立即响应,则返回窗口为500k。但实际上处理端的处理速度可能很快,10ms内就会从buffer中消耗掉500k的数据。在这种情况下,接收端的处理还远远没有达到极限,即使将窗口放大,它仍然可以处理。如果接收端等待一段时间才响应,比如等待200ms才响应,那么此时返回的窗口大小为1M。注意:窗口越大,网络吞吐量越大,传输效率越高。在保证网络不拥塞的情况下,尽量提高传输效率。那么,是否所有的数据包都可以延迟响应呢?肯定不是,因为有包数限制,每N个包就回复一次;而且是有时间限制的,超过最大延迟时间就回复一次。具体次数和时间因操作系统而异。一般N取2,超时时间取200ms。(7)Piggyback在延迟响应的基础上,很多时候客户端服务器也在应用层“发送和接收”,也就是说客户端向服务器说“你好吗”,服务器也会发送给客户端的消息会有一个“Fine,thankyou”,那么这时候ACK可以搭便车,连同服务器“Fine,thankyou”的响应一起返回给客户端。更多细节:tcp与udp
