1、TCP三次握手具体过程2、请说说SYN攻击3、CLOSE-WAIT和TIME-WAIT的作用4、TCP如何保证可靠性5、TCP如何进行拥塞控制答案分析TCP是connection-面向通信协议通过三次握手建立连接,通信完成后断开连接。由于TCP是面向连接的,它只能用于端到端的通信。TCP提供可靠的数据流服务,采用“肯定确认重传”技术实现传输可靠性。TCP还使用一种称为“滑动窗口”的方法进行流量控制。所谓窗口,其实代表的是接收能力,用来限制发送端的发送速度。如果IP数据包中已经有密封的TCP数据包,那么IP会将它们“向上”发送到TCP层。TCP对数据包进行排序并进行错误检查,同时实现虚电路之间的连接。TCP数据包中包含序列号和确认,因此可以对乱序接收的数据包进行排序,并可以重新传输损坏的数据包。TCP将其信息发送给更高级别的应用程序,例如Telnet的服务程序和客户端程序。应用程序依次将信息发送回TCP层,然后将它们向下传递到IP层、设备驱动程序和物理介质,最后传递到接收方。Telnet、FTP、rlogin、XWindows和SMTP等面向连接的服务需要高度的可靠性,因此它们使用TCP。DNS在某些情况下使用TCP(发送和接收域名数据库),但使用UDP来传送有关各个主机的信息。为什么TCP的三次握手需要三次握手?为什么主机建立连接需要三次握手?为了防止已经失效的连接突然返回服务器造成的错误。”比如客户端发送连接请求报文,虽然没有丢失,但是由于某些原因长时间停留在某个网络节点,以至于断开连接后才到达服务器。这本身就是无效报文.text.但是服务器误认为是客户端的另一个新请求.假设没有三次握手,那么只要服务器发送一个确认链接,连接就建立了.由于客户端没有发送请求到服务端,不回复服务端的确认,但是服务端确认一个新的连接已经开始,等待客户端发送数据,这样很容易造成服务端的资源浪费。握手方式可以防止这种情况发生。TCP提供面向连接的通信传输方式,面向连接是指两端在开始数据通信之前的准备工作。所谓三次握手,就是在建立一个TCP连接时,客户端和服务器一共需要发送三个数据包来确认连接的建立。在socket编程中,这个过程是由客户端执行connect触发的。第一次握手客户端将标志位SYN置1,随机产生一个值seq=J,将数据包发送给服务器,客户端进入SYN_SENT状态,等待服务器确认。第二次握手服务器收到数据包后,标志位SYN=1,知道客户端请求建立连接。服务器将标志位SYN和ACK都设置为1,ack=J+1,并随机产生一个值seq=K,向客户端发送数据包确认连接请求,服务器进入SYN_RCVD状态。第三次握手客户端收到确认后,检查ack是否为J+1,ACK是否为1,如果正确,则设置标志位ACK为1,ack=K+1,发送数据包到serverServer端检查ack是否为K+1,ACK是否为1,正确则连接建立成功。客户端和服务端进入ESTABLISHED状态,完成三次握手,然后客户端和服务端就可以开始传输数据了。TCP的三次握手的漏洞但是TCP的三次握手有一个缺陷,就是如果我们利用三次握手的缺陷进行攻击。这种攻击是SYN泛洪攻击。三次握手中还有第二次握手。服务器响应客户端的请求。需要客户端的IP才能响应请求。服务器需要知道客户端的IP。攻击者伪造此IP并将其发送到服务器。第一次握手的内容,当然第一次握手的客户端IP地址是伪造的,所以服务器忙于第二次握手但是第二次握手当然没有结果,所以服务器被拖垮了,崩溃了当然,在我们的生活中也可能有这样的例子。一个普通家庭的IT男去表白自己的女神,却被拒绝了,因为他家里没有矿。为了报复,IT男使用了泛洪攻击。他请来了很多假扮富豪的人向追雷的女神表白,以至于每次女生想约会的时候,都发现表白的人不见了,联系不上了。面对这种攻击,有以下解决方案,最好的方案是防火墙。Invalidconnectionmonitoringrelease该方法持续监控所有的连接,包括三次握手和一次握手,反正达到某个(和)阈值时全部移除,从而释放系统资源。该方法对所有连接一视同仁,无论是正常连接还是攻击连接,因此不推荐使用该方法。延迟TCB分配方式一般在第一次握手完成后,服务器需要为请求分配一个TCB(connectioncontrolresource)。通常,此资源需要200多个字节。延迟分配TCB,在正常连接建立后再分配TCB,可以有效减少服务器资源的消耗。使用防火墙。防火墙在确认连接有效性后向内部服务器(Listener)发起SYN请求。TCP挥手四次(断开连接)挥手四次终止TCP连接,即断开一个TCP连接,客户端和服务器一共需要发送4个数据包来确认连接断开。在socket编程中,这个过程是由客户端或者服务端执行close触发的。由于TCP连接是全双工的,所以每个方向都必须分别关闭。这个原理是当一方完成数据发送任务后,发送一个FIN终止这个方向的连接。收到一个FIN只是表示这个方向没有数据流,也就是不会再收到数据,但是这个TCP连接上仍然可以发送数据,直到这个方向也发送了FIN。先关闭的一方将执行主动关闭,而另一方将执行被动关闭。客户端进程发送连接释放消息并停止发送数据。释放数据报文头,FIN=1,其序号为seq=u(等于之前传输的数据最后一个字节的序号加1),此时客户端进入FIN-WAIT-1(停止等待1)状态。TCP规定即使FIN段不携带数据,也仍然要消耗一个序号。服务器收到连接释放报文,发送确认报文,ACK=1,ack=u+1,并带上自己的序列号seq=v,此时服务器进入CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层应用进程,客户端向服务器方向释放。此时处于半关闭状态,即客户端没有数据发送,但是如果服务端发送数据,客户端还是要接受。这个状态会持续一段时间,也就是整个CLOSE-WAIT状态的持续时间。客户端收到服务器的确认请求后,此时,客户端进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放消息(在此之前,需要接受服务器发送的最后数据)。服务器发送完最后一个数据后,给客户端发送连接释放消息,FIN=1,ack=u+1,因为是半关闭状态,服务器可能又发送了一些数据,假设序列号此时对于seq=w,此时服务端进入LAST-ACK(最终确认)状态,等待客户端的确认。客户端收到服务器的连接释放报文后,必须发送确认,ACK=1,ack=w+1,自己的序号为seq=u+1。这时,客户端进入TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,只有经过2??MSL(maximumsegmentlife)的时间,客户端才会进入CLOSED状态,对应的TCB被客户端撤销。如服务器只要收到客户端的确认,就会立即进入CLOSED状态。同样,TCB被撤销后,这个TCP连接就结束了。可以看出,服务器比客户端更早结束TCP连接。为什么挥手比握手多一次?因为tcp连接是全双工的,每个方向都要单独断开。客户端申请断开连接,但不再发送数据,但仍能接收到数据。需要等待服务器发送数据,然后等待服务器申请断开连接。TCP/IP中的数据包在每一层中,发送的数据都附有一个头部,头部包含了该层所必需的信息,如目的地址和协议相关信息。通常,为协议提供的信息是包头,要发送的内容是数据。从下一层的角度来看,所有从上层收到的数据包都被认为是本层的数据。网络中传输的数据包由两部分组成:一部分是协议使用的包头,一部分是协议使用的包头。另一部分是从上层传输的数据。头部的结构由协议的特定规范详细定义。在数据包的包头中,明确标明了协议应该如何读取数据。反之,看到头部,就可以了解协议的必要信息和要处理的数据。应用程序处理首先,应用程序会进行编码处理,相当于OSI的表示层功能;编码转换后,邮件可能不会立即发送出去。这种什么时候建立通信连接,什么时候发送数据的管理功能,是完全基于OSI的会话层功能的。TCP模块的处理TCP负责根据应用程序的指令建立连接、发送数据和断开连接。TCP提供可靠的传输,将数据从应用层平滑地发送到对端。为了实现这个功能,需要在应用层数据前面附加一个TCP头。IP模块的处理IP将TCP头和TCP传输过来的TCP数据合并为自己的数据,在TCP头的前端加上自己的IP头。IP报文生成后,根据路由控制表确定接收IP报文的路由或主机。网络接口的处理(Ethernet驱动)从IP传过来的IP包是到Ethernet的数据。将以太网包头附加在数据上发送,生成的以太网数据包会通过物理层传送到接收端。网络接口处理(以太网驱动)主机收到以太网包后,首先从以太网包头中查找MAC地址,判断是否是发给自己的包,如果不是则丢弃数据。如果是发给自己的数据包,从以太网数据包头中的类型判断数据类型,然后传递给相应的模块,如IP、ARP等,这里的例子是IP。IP模块的处理IP模块收到数据后也进行类似的处理。从包头判断这个IP地址是否与自己的IP地址匹配,如果匹配,则根据包头的协议类型,如TCP、UDP,将数据发送给相应的模块。这里的例子是TCP。另外,在路由器的情况下,接收端的地址往往不是自己的地址。这时候就需要使用路由控制表在查明应该发送的主机或路由器后转发数据。TCP模块的处理在TCP模块中,首先计算校验和,判断数据是否损坏。然后检查是否按序列号接收数据。最后通过查看端口号来确定具体的应用。完整接收数据后,将其传递给由端口号标识的应用程序。应用程序的处理接收端应用程序将直接接收发送端发送的数据。通过解析数据,显示相应的内容。TCPSocket的通信原理SocketSocket的本意是“套接字”。在计算机通信领域,socket译为“套接字”,是计算机之间的一种约定或通信方式。通过套接字协议,一台计算机可以从其他计算机接收数据,也可以向其他计算机发送数据。TCP使用主机的IP地址加上主机上的端口号作为TCP连接的端点。这个端点称为套接字。为了区分不同应用进程之间的网络通信和连接,主要有三个参数:通信的目的IP地址、使用的传输层协议(TCP或UDP)、使用的端口号。通过将这三个参数组合起来,绑定到一个“套接字”Socket上,应用层就可以通过套接字接口与传输层进行通信,以区分来自不同应用进程或网络连接的通信,实现数据传输的并发服务。pair是定义连接的两个端点的四元组:本地IP地址、本地TCP端口号、外部IP地址和外部TCP端口号。套接字对唯一标识网络上的每个TCP连接。TCP缓冲区每个TCPSocket在内核中都有一个发送缓冲区和一个接收缓冲区。现在我们假设使用write()方法发送数据,使用read()方法接收数据。write()方法不会立即将数据发送到网络,而是先将数据写入缓冲区,然后从中发送数据通过TCP协议将缓冲区发送到目标机器。一旦数据写入缓冲区,函数就可以成功返回,无论它们是否到达目标机器,也不管它们何时发送到网络,这些都是TCP协议要处理的事情。TCP协议独立于write()函数。数据可能一写入缓冲区就发送到网络,也可能继续在缓冲区中累积。多次写入的数据会一次性发送到网络上,具体取决于时间。当前网络情况、当前线程是否空闲等很多因素,都不是程序员可以控制的。read()也是如此,它也是从输入缓冲区中读取数据,而不是直接从网络中读取。一般来说,I/O缓冲区独立存在于每个TCP套接字中;I/O缓冲区在创建套接字时自动生成;TCP的可靠性在TCP中,当发送端的数据到达接收主机时,接收主机会返回一个消息已经收到的通知。此消息称为确认(ACK)。发送方发送数据时,会等待对方的确认响应。如果有确认响应,则表示数据已成功到达对端。反之,数据丢失的可能性非常大。如果在一定时间内没有确认响应,发送方可以认为数据已经丢失,重新发送。因此,即使发生丢包,仍然可以保证数据能够到达对端,实现可靠传输。没有收到确认并不意味着数据一定会丢失。也有可能是对方收到了数据,但是返回的确认回复在途中丢失了。这种情况也会导致发送方误认为数据没有到达目的地而重新发送数据。此外,可能还有一些其他原因导致确认响应延迟到达,这种情况并不少见确认在源主机重新发送数据后到达。此时,源主机只需要按照机制重新发送数据即可。目标主机不宜重复接收相同的数据。为了向上层应用程序提供可靠的传递,目标主机必须丢弃重复的数据包。为此我们引入了序列号。序列号是一个编号,它按顺序标记发送数据的每个字节(8位字节)。接收端查询接收到的数据的TCP头中的序号和数据的长度,并返回下一步应该接收的序号作为确认响应。通过序号和确认响应号,TCP可以识别数据是否已经接收,也可以判断是否需要接收,从而实现可靠传输。TCP中的滑动窗口发送方和接收方都维护着一个数据帧序列,称为窗口。发送方的窗口大小由接收方确认。目的是控制发送速度,避免接收方缓冲区不足导致溢出。同时,控制流量也可以避免网络拥塞。在TCP可靠性图中,我们可以看到发送方每发送一条数据,接收方都要给发送方一个ACK来确认数据。发送方只有收到这个确认数据后,才能传输下一个数据。存在的问题:如果窗口太小,在传输比较大的数据时需要不断的确认数据,此时会造成较大的延迟。如果窗口太大,我们假设发送方一次发送100个数据,但是接收方只能处理50个数据,这样每次只确认这50个数据。发送方下次仍然发送100个数据,但是接收方只能处理50个数据。这避免了不必要的数据阻塞我们的链接。因此,我们引入了滑动窗口。一般来说,滑动窗口是一种流量控制技术。本质上是描述接收方TCP数据报缓冲区大小的数据。发送方根据这个数据计算出自己可以发送的最大数据长度。如果发送方收到一个接收方窗口大小为0的TCP数据报,那么发送方将停止发送数据,等待发送窗口大小不为0的数据报到来。固定窗口大小的问题我们可以看下面图片来分析固定窗口大小的问题。这里我们可以看到,假设窗口大小为1,一次只能发送一条数据,第二条数据只有在接收方确认后才能发送数据。我们可以看到,发送方每发送一条数据,接收方都要给发送方一个ACK来确认数据。只有收到确认数据后,发送方才能传输下一个数据。滑动窗口如何工作?我们考虑一下,如果窗口太小,在传输比较大的数据时需要不断的确认数据,此时会造成很大的延迟。如果窗口的大小定义太大。我们假设发送方一次发送100个数据。但是接收器只能处理50个数据。这样每次只会确认这50条数据。发送方下次仍然发送100个数据,但是接收方只能处理50个数据。这避免了不必要的数据阻塞我们的链接。所以我们引入了滑动窗口机制。窗口的大小不是固定的,而是取决于我们之间链路的带宽。此时链路是否拥塞。接收方是否可以处理这么多数据。首先,第一次发送数据时的窗口大小是根据链路带宽确定的。我们假设此时窗口大小为3。这时候接收方接收到数据后,会对数据进行确认,并告诉发送方下次我要获取多少数据。这里我们看到接收方发送了ACK=3。这时候发送方收到这个数据后就知道对方只收到了我第一次发送的3个数据中的2个。已知对方没有收到第三数据。下次发送时,从第三个数据开始发送。此时窗口大小变为2。此时发送方发送2个数据。看到接收方发送的ACK为5表示他下次期望收到的数据为5,发送方知道我刚发送的2个数据已经被对方收到了,此时开始发送第5个数据。这就是滑动窗口的工作机制。当链路变得更好或更差时,窗口将发生变化。它不会在第一次谈判后永远改变。所以滑动窗口协议是TCP使用的一种流量控制方式。该协议允许发送方在停止并等待确认之前连续发送多个数据包。由于发送方不必在每次发送数据包时都停下来等待确认,因此该协议可以加快数据传输速度。只有当接收窗口向前滑动时(同时也发送确认),发送窗口是否可以向前滑动。发送端和接收端的窗口按照上面的规则不断向前滑动,所以这个协议也叫滑动窗口协议。如果本文对您有帮助,欢迎关注点赞`,您的支持是我坚持创作的动力。转载请注明出处!
