最后更新:2022-07-03 21:03:14 手机定位技术交流文章
TCP/IP包含两个代表层协议,分别是TCP和UDP。


-通过IP地址、端口号、协议号识别通信:五维组的作用是确定特定通信。
端口号的确定:
**标准默认端口数:**这个方法也称为静态方法。这意味着每个应用程序都有指定的端口号码。但这并不是说你可以随意使用任何端口号码。例如,在广泛使用的应用程序协议(例如HTTP、FTP和TELNET)中使用的端口数目是固定的。这些港口被称为著名的港口,分布于0至1023之间;除已知的港口号码外,还有一些正式注册的港口号码,分布于1024至49151之间。然而,这些端口号码可以用于任何通信目的。
**序列分配方法:**服务器需要确定监控端口号码,然而,接受服务的客户端不需要指定端口号码。在这种方法下,客户端应用程序完全可以自由设置自己的端口号码,所有权利都分配给分配的操作系统。动态分配的端口数从49152到65535之间。
端口号码问题目前有一个客户端端口号码的末端问题
端口号与协议:
端口数由它使用的层协议确定,因此,不同的层协议可以使用相同的端口数。
此外,这些众所周知的端口号码与传输层协议无关。 只要端口一致,同样的应用程序将被分配用于处理。
TCP与UDP之间存在着相当大的区别,它能充分实现数据传输中各种控制功能,可以对丢失的包进行重新控制,也可以对破损的包进行序列控制。
此外,TCP作为一种以连接为导向的协议,只在通信对手存在时发送数据,从而控制流量的浪费。
三次握手(重点):
TCP提供以连接为导向的通信传输,以连接为导向的是指在数据通信开始之前,两个端之间进行准备。
所谓“三个手”意味着当一个TCP连接建立时,客户端和服务器端必须一起发送三个包来确认连接的建立。
三次握手:
第一个握手:客户端设置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,并将数据包发送到服务器上,服务器端检查Ack是否是K+1,ACK是否为1,如果正确, 连接成功地建立,客户端和服务器进入“调用”状态,完成三次握手,然后,客户端可以开始在服务器和端之间传输数据。
SYN攻击:
在三次握手过程中,服务器发送SYN-ACK后,在接收客户端ACK之前的TCP连接称为半开连接。此时服务器处于SYN_RCVD状态,当收到ACK后,服务器输入了STABLISHED状态。SYN攻击是一个在短时间内伪造大量不存在的IP地址的客户端,并继续向服务器发送SYN包,服务器答复了确认包,并等待客户确认,因为源地址不存在,因此,服务器需要重复到迟到为止,这些假的SYN包将占不连接的队列的生产时间,导致正常SYN请求被丢弃,因为队列已经满了,这会导致网络阻塞,甚至导致系统瘫痪。当SYN攻击时,一个典型的DDOS攻击,检测SYN攻击的方法非常简单,也就是说,如果服务器有大量的半连接状态和源IP地址是随机的,那么你就可以确定SYN被攻击了,使用下列命令使它运行:
四次挥手:
所谓的四波波手终止了TCP连接。指由TCP连接中断,客户端和服务端需要总共四个包,以确认连接中断。在插座编程中,这个过程由客户端或服务端用户执行关闭,整个过程的图表如下:
因为TCP连接都是双重检查的,因此,每个方向必须单独关闭,原则是当一方完成发送数据的任务时,发送 FIN以终止此方向的连接,收到 FIN 只 意味着 没有 数据 流入 这个 方向,也就是说,不再收到数据,但是,仍然可以发送数据的TCP连接,芬也被派往这个方向。关闭的第一方将执行主动关闭,另一方则实施了消极关闭,这就是上面所描述的。
(1)第一波:客户端发送一个 FIN来关闭客户端的数据传输到服务器,然后客户端输入 FIN_WAIT_1状态。
(2)第二波:服务器接收FIN后,发送ACK给客户端,确认该序列是接收的序列+1(与SYN类似,一个FIN占据一个序列),服务器进入CLOSE_WAIT状态。
(3)第三波:服务器发送一个 FIN来关闭服务器向客户端的数据传输,服务器输入LAST_ACK状态。
(4)第四波:当客户端接收 FIN后,客户端进入 TIME_WAIT状态,然后向服务器发送ACK,确认接收的序列号码+1,服务器进入CLOSED状态,完成第四波。
为什么 TIME_WAIT状态需要通过2MSL(最大报告周期存活时间)才能返回CLOSE状态?
原因有二:
确保TCP协议的全双plex连接可以可靠地关闭
确保此连接的重复数据段从网络中消失
先说第一点,如果客户直接关闭,因此,由于IP协议或其他网络原因的不可靠,因此,服务器没有收到客户端最后的ACK响应。然后服务器将继续在加班后发送 FIN,现在客户已关闭,无法找到与重复 FIN 相符的连接,最后,服务器将接收RST而不是ACK,服务器会认为这是连接错误,并向顶层报告问题。虽然这种情况并不会导致数据丢失,然而,TCP协议不满足可靠的连接的要求。所以,客户不直接关闭,相反,保持时间等待,当你再次得到芬时,可以保证另一方收到ACK,最后正确关闭连接。
再说第二点,如果客户直接关闭,然后再向服务器启动新的连接,我们不能保证这个新连接与新关闭的连接的端口号码不同。这意味着新的连接可能具有与旧连接相同的端口号码。通常没有问题。但有一个特殊情况:假设新的连接与已关闭的旧连接端口号码相同,如果先前的连接数据的一部分仍留在网络中,这些延迟的数据只在建立一个新的连接后到达服务器,因为新连接与旧连接的端口号码相同,另外,由于TCP协议根据接口对判断不同的连接,于是,TCP协议认为延迟的数据属于新连接,这将数据包与真正的新的连接混淆。因此TCP连接必须在 TIME_WAIT状态下等待两次MSL,这确保从这个连接中的所有数据从网络中消失。
上面的例子是,一方面是主动关闭,另一方面是被动关闭,实际上,也有主动关闭的同时启动的例子。
具体流程如下图:
同时挥手

如需发送答复数据,ACK将立即向另一方发送答复数据;
如果没有响应数据,ACK将延迟发送,等待查看响应数据是否可以一起发送。 在Linux系统中,默认延迟时间是40ms;
如果另一方的第二批包裹在等待运送货物时到达,则立即运送货物。
Nagle算法:
Nagle算法是一种通过减少网络传输包来提高TCP/IP网络效率的方法。它以发明家约翰·纳格尔的名字命名,约翰·纳格尔(John Nagle)于1984年首次尝试这种算法来解决福特汽车公司的网络拥堵问题。
想象一下,如果应用程序一次生成一个字节的数据,所有这些都以网络数据包的形式发送到远程服务器,因此,由于太多的包,很容易重载网络。在这种情况下,只传输一个有效数据的字节的数据包,但额外花费40字节(即IP头上20字节 + TCP头上20字节),这种有效载荷的利用率非常低。
具体如下:
如果消息大于一个MSS(MSS是每个TCP包传输的最大数据段),则立即发送;
如果一个包不是以前的ACK, 缓存发送的内容;
如果收到ACK,立即发送缓存内容
延迟ACK和Nagle算法同时使用:
Nagle 和 Delayed ACK 可以提高网络传输效率, Nagle 在发送者上使用, Delayed ACK 在接收者上使用。
A和B负责数据传输,运行纳格尔算法,B运行延迟ACK算法;如果A发送一个包到B,B因为延迟的ACK没有立即响应;而A使用Nagle算法,你会等B的ACK,ACK并不总是缓存剩余的包;如果两个包都响应相同的请求,那么这个请求将延迟40ms。
**重复加班是指重复数据发生前的时间,等待特定时间间隔来确认应收到答复。**如超过该期间没有收到确认,发送器将检索数据.最理想的是,找到一个最小时间,它可以保证“确认答复必须在这段时间内返回”。
TCP要求在任何网络环境中提供高性能通信,不管网络拥塞有多大,所有 国家 都 必须 保持 这 一 特点 。为此,它计算了每次装运的回程时间及其偏差。再加这个24小时时间和偏差时间,加班的复发比总数稍大.
在BSD、Unix和Windows中,超时为0.5秒是单元控制的,所以复发超时为0。 乘5秒整数。
如果数据被重新传输,并且确认响应没有收到,则再发送。 此时,响应确认的等待时间将由指数函数延长2到4倍。
一旦达到一定数量的重复,如果仍然没有确认应返回的响应,它将确定在网络或外围主机上发生了异常,并迫使连接关闭。 并通知异常通信的应用,迫使终止。
以段为单位发送数据
在建立TCP连接的同时,也可以确定发送数据包的单元,也可以称之为“最大消息长度”(MSS)**。
在传输大量数据时,TCP将数据单独发送到MSS的大小。 在重复情况下,该单元也称为MSS。
**MSS当你握手三次时,它被计算在主机两端之间。**当两个端的主机发出建立连接的请求时,在TCP标题中写MSS选项,告诉对方自己的接口能容纳的MSS的大小。然后在两者之间选择一个较小的值输入。P209
TCP协议中的窗口机制分为两部分:
如下图所示:
我们假设这个固定窗口的大小是1,也就是说,你只能一次发送一个数据。只有接收机确认数据后才能发送第二个数据。在图中我们可以看到,每个发送者发送一个数据接收器给发送者一个ACK确认数据。只有收到此确认数据后,发送者才能发送下一个数据。
有一个问题:如果窗口太小,在发送较大的数据时需要不断确认时,它会造成大量延迟。
如果窗口过大,我们假设发送者一次发送100个数据,但是接收机只能处理50个数据,所以每次,只有这些50个数据被证实。下次发送者发送100个数据,但接收器只能处理50个数据。这防止不必要的数据堵塞我们的链路。
总结了后续内容等。
我推荐免费的公共课程在自由声音学院,我个人认为老师讲得很好。
与您分享:[Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,ongoDB,ZK,flow media,CDN,P2P,K8S,Docker,
TCP/IP,编码,DPDK和其他技术内容,点击学习即时:服务器课程
本文由 在线网速测试 整理编辑,转载请注明出处。