关于tcp:一张图感受真实的-TCP-状态转移续

前文采纳 tracepoint 和 kprobe 等追踪伎俩画出了 tcp 状态转移的时序图,仔细的读者可能留神到,文中的时序仿佛有点问题: ts:2220445792791:client:CLOSE:SYN_SENTts:2220446761789:client:SYN_SENT:ESTABLISHEDts:2220447626787:server:LISTEN:SYN_RECVts:2220448026786:server:SYN_RECV:ESTABLISHEDts:2220454118771:client:ESTABLISHED:FIN_WAIT1ts:2220455075769:server:ESTABLISHED:CLOSE_WAITts:2220455593768:server:CLOSE_WAIT:LAST_ACKts:2220456264766:client:FIN_WAIT1:FIN_WAIT2ts:2220456525766:client:FIN_WAIT2:TIME_WAITts:2220456623765:client:FIN_WAIT2:CLOSEts:2220456768765:server:LAST_ACK:CLOSEts:2282464966825:client:TIME_WAIT:CLOSE为什么 client 的 ESTABLISHED 在 server 的 SYN_RECV 后面? 事实上,我的测试内核版本是 6.1.11,它蕴含了这个commit [https://github.com/torvalds/linux/commit/10feb428a5045d5eb18a5d755fbb8f0cc9645626], 及其系列 [https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linu...]。所以测试内核中 TCP_SYN_RECV 曾经不是原始 TCP 协定中 server 收到第一个 syn 包的状态了,取而代之的是 TCP_NEW_SYN_RECV,TCP_SYN_RECV 自身次要被用于反对 fastopen 个性了。 既然这样,咱们怎么还原协定中的状态呢?通过一番检索,发现了这个办法:inet_reqsk_alloc,该办法是内核收到第一个 syn 包后,为连贯调配 struct request_sock 这个轻量级数据结构表征的中央,于是咱们能够进行追踪: SEC("fexit/inet_reqsk_alloc")int BPF_PROG(inet_reqsk_alloc,const struct request_sock_ops *ops, struct sock *sk_listener, bool attach_listener,struct request_sock *req ) { __u64 ts = bpf_ktime_get_boot_ns(); const struct sock_common skc1 = BPF_CORE_READ(sk_listener,__sk_common); const struct sock_common skc = BPF_CORE_READ(req,__req_common); const int family = BPF_CORE_READ(&skc,skc_family); if(family != AF_INET){ return 0; } const char oldstate = (BPF_CORE_READ(&skc1,skc_state)); const char newstate = (BPF_CORE_READ(&skc,skc_state)); __u32 dip = (BPF_CORE_READ(&skc1,skc_daddr)); __u16 dport = (BPF_CORE_READ(&skc1,skc_dport)); __u32 sip = (BPF_CORE_READ(&skc1,skc_rcv_saddr)); __u16 sport = bpf_htons(BPF_CORE_READ(&skc1,skc_num)); return judge_side(ctx,ts,(long long)req,dip, dport, sip, sport,oldstate,newstate);}前面三步握手实现,为连贯建设 struct sock 重量级数据结构表征的中央:tcp_v4_syn_recv_sock->tcp_create_openreq_child->inet_csk_clone_lock。通过这个办法,咱们能够将 inet_reqsk_alloc 中的状态转移和前文的 sock 关联起来: ...

June 15, 2023 · 1 min · jiezi

关于tcp:一张图感受真实的-TCP-状态转移

各位读者无论是作为候选人还是面试官,想必对 “TCP 三步握手,四步挥手” 都烂熟于心了。然而百闻不如一见,明天咱们就来 在实在环境中把这个过程可视化,实地看一看,TCP的状态到底是如何转化的。 TL;DR本文生成的后果如图: 每一段代表一个状态,起始点是绝对工夫戳和状态名字。 环境咱们用一个 nginx 作为 server(server_ip:server_port),同时用 curl 作为 client,就有了一个简略的实在环境。 那么怎么观测TCP状态转移呢? inet_sock_set_state内核为咱们提供了一个 tracepoint: inet_sock_set_state。这个 tracepoint 会在 TCP 状态发生变化的时候被调用,于是咱们就有了 TCP 状态转移的观测点,这也是《用eBPF/XDP来代替LVS》系列 中应用的技巧。用 ebpf/libbpf 写下来大略是这样: SEC("tp_btf/inet_sock_set_state")int BPF_PROG(trace_inet_sock_set_state, struct sock *sk, int oldstate, int newstate){ const int type = BPF_CORE_READ(sk,sk_type); if(type != SOCK_STREAM){//1 return 0; } const struct sock_common skc = BPF_CORE_READ(sk,__sk_common); const struct inet_sock *inet = (struct inet_sock *)(sk); return track_state((long long)sk,&skc,inet,oldstate,newstate);}咱们监听到状态转移事件后就能够从中提取这个连贯的 4元组 static int track_state(long long skaddr,const struct sock_common *skc, const struct inet_sock *inet, int oldstate, int newstate){ __u32 dip = (BPF_CORE_READ(skc,skc_daddr)); __u16 dport = (BPF_CORE_READ(skc,skc_dport)); __u32 sip = (BPF_CORE_READ(inet,inet_saddr)); __u16 sport = (BPF_CORE_READ(inet,inet_sport)); return judge_side(skaddr,dip, dport, sip, sport,oldstate,newstate);}而后根据4元组判断是哪个side ...

May 27, 2023 · 3 min · jiezi

关于tcp:如何使用了-SOREUSEADDR处于-TIMEWAIT-状态的连接还能安全地释放资源吗

参考:socket服务器开发中的SO_REUSEADDR选项与让人心烦的TIME_WAIT 应用了 SO_REUSEADDR 选项之后,处于 TIME_WAIT 状态的连贯会在 socket 敞开之后立刻开释资源,而不会期待 2MSL 工夫。这意味着这些资源能够立刻被从新应用,但也可能导致某些问题。 一种可能性是,如果 TIME_WAIT 状态的连贯在 2MSL 工夫内从新关上,可能会接管到旧的或意外的数据包,这可能导致不可预测的行为或平安问题。因而,开启 SO_REUSEADDR 选项时须要审慎,特地是在须要解决反复端口的状况下。 另外,如果多个过程在同一个端口上监听,当一个过程敞开连贯时,SO_REUSEADDR 可能会导致另一个过程接管到未预期的数据包。在这种状况下,应该应用 SO_REUSEPORT 选项来防止这种状况。

May 5, 2023 · 1 min · jiezi

关于tcp:深入理解TCP解答这10个关键问题

TCP介绍TCP(Transmission Control Protocol,传输控制协议)是一种面向连贯、牢靠的传输层协定,它提供了数据传输的可靠性,保障了数据传输的有序性和完整性。具备一下特点: 可靠性:TCP保障数据传输的可靠性,确保数据可能精确地达到接管方,并且可能依照发送方发送的程序进行重组。面向连贯:TCP在传输数据前须要先建设连贯,数据传输结束后再断开连接,这种形式能够保证数据的可靠性。面向字节流:TCP把传输的数据看成一个间断的字节流,而不是数据块,这样可能更好地控制传输过程。拥塞管制:TCP可能依据网络拥塞的水平来调整发送速率,防止网络拥塞而导致数据失落或提早。全双工通信:TCP容许发送方和接管方同时进行数据传输,这样能够进步数据传输的效率。TCP连贯为什么须要三次握手?TCP连贯建设须要三次握手的起因是确保单方都认可对方的初始序列号并且建设起牢靠的通信信道。具体来说,三次握手的步骤如下: 客户端发送SYN包给服务器,示意客户端申请建设连贯,并随机生成一个初始序列号seq。此时客户端处于SYN_SEND状态。服务器收到SYN包后,回复ACK包和SYN包给客户端,ACK包确认收到客户端的SYN包,SYN包示意服务器批准建设连贯,并且服务器也随机生成一个初始序列号seq+1。此时服务器处于SYN_RECEIVED状态。客户端收到服务器的ACK包和SYN包后,回复ACK包给服务器,ACK包确认收到服务器的SYN包,此时客户端和服务器均建设起了连贯,并能够进行数据传输。此时客户端处于ESTABLISHED状态。三次握手的过程中,客户端和服务器都能够确保对方认可了本人的初始序列号,并建设起了牢靠的连贯。同时,三次握手也能够避免因为提早的ACK导致的谬误连贯,以及避免因为旧的连贯申请信息反复发送而导致的谬误连贯。因而,TCP连贯建设须要三次握手来确保连贯的可靠性。 TCP协定如何保障可靠性?TCP协定通过序列号和确认应答、超时重传、流量管制和拥塞管制等机制来保障传输的可靠性。 序列号和确认应答:每个TCP报文段都蕴含一个序列号,用于批示发送方发送的数据的字节流中的地位。接管方收到TCP报文段后会发送确认应答,通知发送方收到了哪个序列号之前的数据。如果发送方没有收到确认应答,它就会重传这些数据。超时重传:如果发送方没有在肯定工夫内收到确认应答,就会认为数据包失落了,并且会从新发送这些数据。流量管制:接管方能够通过TCP窗口大小来通知发送方能够发送多少数据。这个窗口大小会依据接管方的可用缓冲区大小动静调整,以避免接管方的缓冲区溢出。拥塞管制:TCP应用拥塞窗口来管制网络中的拥塞水平。如果网络拥塞,发送方会升高拥塞窗口的大小,以缩小发送的数据量,从而加重网络拥塞。TCP连贯如何放弃沉闷状态?TCP连贯的放弃沉闷状态通常有两种形式: TCP keepalive机制:TCP keepalive机制是一种放弃TCP连贯状态的办法。当一段时间内没有数据传输时,TCP keepalive会向对端发送一个探测包。如果对端收到了探测包,则会回复一个确认包,证实连贯依然存在。如果对端没有回复,则会在肯定工夫内重试探测,若重试屡次后依然没有回复,则会认为连贯曾经断开。TCP keepalive的默认设置是2小时。应用层心跳包:应用层心跳包是一种应用层协定,用于放弃TCP连贯状态。应用层心跳包是由应用程序发送的一个小的数据包,用于通知对端连贯依然存在。个别状况下,应用层心跳包的发送频率会比TCP keepalive要高一些,能够依据具体的业务需要进行调整。这两种形式都能够放弃TCP连贯状态,然而TCP keepalive机制是在TCP协定层面实现的,而应用层心跳包则须要应用程序本人实现。 什么是TCP窗口大小?TCP窗口大小指的是接收端主机能够接管的数据量大小。在TCP连贯建设时,单方会替换窗口大小信息,以便发送方发送适宜接管方的数据量,避免发送方发送过多的数据导致接管方无奈及时处理而失落数据或呈现阻塞。 TCP窗口大小的单位是字节(byte),通常是由接收端主机来设置和管制。接收端主机通过设置窗口大小来通知发送端主机,本人能够接管多少数据,发送端主机在发送数据时就不会超过这个窗口大小,以确保数据可能被接收端主机及时处理和接管。 TCP窗口大小的优化能够通过调整零碎参数、硬件优化以及网络拓扑构造等形式来实现,从而进步TCP连贯的传输效率和稳定性。 TCP协定的流量管制是如何实现的?TCP协定的流量管制是通过窗口机制实现的。每个TCP连贯都会有一个发送窗口和一个接管窗口,它们管制着数据的流动。 发送窗口:发送方通过发送窗口的大小通知接管方本人还能够发送多少数据。发送窗口的大小由接管方动静调整,取决于接管方的可用缓存空间和网络情况。 接管窗口:接管方通过接管窗口的大小通知发送方本人还能接管多少数据。接管窗口的大小由发送方动静调整,取决于发送方的发送速率和网络情况。 通过这种窗口机制,TCP协定能够在不失落数据的前提下控制数据的流动速度,避免发送方发送过多数据导致接管方无奈及时处理,从而实现流量管制。 TCP拥塞管制的机制是什么?TCP拥塞管制是一种管制网络拥塞的机制,它通过调整发送方的数据发送速率和接管方的数据接管速率来防止网络拥塞和网络解体。TCP拥塞管制的次要机制有以下几个: 慢启动:在开始时,TCP发送方会以指数级别递增数据的发送速率,直到达到网络的最大容量。拥塞防止:一旦发送方确定了网络的最大容量,就会以线性增长的形式逐渐减少数据的发送速率,直到呈现拥塞。快重传:当TCP发送方接管到一个反复的ACK(确认),示意有些数据曾经达到接管方,它将立刻从新发送最近发送的没有确认的数据段,而不是期待超时重传计时器超时。快复原:在接管到反复的ACK时,TCP发送方会缩小数据发送速率,并立刻发送曾经确认的但还未发送的数据,以便更快地复原数据的发送速率。拥塞超时:如果发送方没有在指定工夫内收到ACK确认,则假设数据包曾经失落并重传数据,同时将数据发送速率减半。这些机制组合起来,能够无效地管制TCP连贯的数据发送速率,从而防止网络拥塞和解体。 如何实现TCP多路复用?TCP多路复用指的是在一个TCP连贯中同时发送和接管多个数据流,它能够显著进步网络通信的效率和吞吐量。在TCP多路复用中,能够应用以下两种形式来实现: 应用多线程或多过程:每个线程或过程解决一个数据流,通过对不同的数据流进行解决,从而实现多路复用。应用select、poll或epoll等I/O多路复用机制:在应用这种机制的时候,应用程序只须要在一个过程中创立一个TCP连贯,而后应用I/O多路复用机制来同时监听多个数据流的I/O事件,从而达到多路复用的成果。应用I/O多路复用机制的形式能够更好地利用系统资源,防止了多线程或多过程的上下文切换开销,同时也缩小了代码的复杂性。因而,在实现TCP多路复用时,倡议应用I/O多路复用机制来实现。 TCP传输中呈现超时或提早,如何解决?TCP传输中呈现超时或提早,能够通过以下形式进行解决: 调整超时工夫:TCP协定中有一个超时重传机制,当数据包发送后肯定工夫内没有收到ACK确认,就会进行重传。能够通过调整超时工夫来优化网络提早,比方减小超时工夫能够使数据包更快地被重传,放慢数据传输速度。应用疾速重传:疾速重传是指当发送方间断接管到3个反复的ACK确认时,就能够认为数据包曾经失落,立刻进行重传,而不用期待超时重传。这能够减小重传的延迟时间,进步数据传输速度。减少拥塞窗口:当网络拥塞时,能够通过减少拥塞窗口来进步网络吞吐量。拥塞窗口是指在一个RTT(Round Trip Time,往返工夫)内容许发送的数据量,能够依据网络拥塞水平动静调整。查看网络链路:有时超时和提早是由网络链路问题导致的,能够通过查看网络链路状态,排查故障并解决问题。应用更疾速的传输协定:如果TCP协定无奈满足需要,能够思考应用更疾速的传输协定,如UDP或QUIC。这些协定不仅能够提供更快的传输速度,还具备更好的适应性和鲁棒性,可能适应不同的网络环境和传输需要。什么是TCP协定中的TIME_WAIT状态?它的作用是什么?TCP协定中的TIME_WAIT状态指的是TCP连贯敞开后,期待2倍的MSL工夫(Maximum Segment Lifetime,最大分段生存工夫)后才会敞开的状态。MSL是指一个TCP分段在网络中最长的生存工夫,通常为2分钟。 TIME_WAIT状态的作用是确保网络中所有的分段都曾经被接管并且被正确处理。在TCP连贯敞开后,可能还会有一些未达到的分段存在于网络中,这些分段可能会在敞开连贯之后达到,如果不期待这些分段达到并被正确处理,可能会导致后续的连贯呈现问题,因而TCP协定会通过TIME_WAIT状态来期待这些分段的达到和解决。 此外,TIME_WAIT状态还能够避免旧的连贯申请被误认为是新连贯的申请,从而确保连贯的安全性和可靠性。 如何在Linux零碎中查看TCP连贯状态?在 Linux 零碎中,能够应用 netstat 或 ss 命令查看 TCP 连贯状态。 应用 netstat 命令: perlCopy codenetstat -ant | grep ESTABLISHED该命令能够列出所有已建设的 TCP 连贯,其中 -a 选项示意显示所有连贯,包含已建设、正在期待和曾经敞开的连贯;-n 选项示意以数字模式显示 IP 地址和端口号;-t 选项示意只显示 TCP 连贯;grep ESTABLISHED 示意只显示已建设的连贯。 应用 ss 命令: perlCopy codess -ant | grep ESTAB该命令与 netstat 相似,其中 -a 选项示意显示所有连贯,包含已建设、正在期待和曾经敞开的连贯;-n 选项示意以数字模式显示 IP 地址和端口号;-t 选项示意只显示 TCP 连贯;grep ESTAB 示意只显示已建设的连贯。 ...

April 22, 2023 · 1 min · jiezi

关于tcp:TCPIP和OSI的基础层级关系图TCPIP四层模型关系TCPIP和HTTPHTTPS的关系图

TCP/传输控制协议英文全称Transmission Control Protocol。IP/网际互连协定英文全称Internet Protocol。tcp和ip是互联网泛滥通信协议中最为驰名的。 1.OSI参考模型与TCP/IP的关系 计算机网络分层模型 OSI七层模型 TCP/IP四层模型 TCP/IP五层模型 应用层 应用层 应用层 应用程序 表示层 会话层 传输层 传输层 传输层 操作系统 网络层 网络层 网络层 数据链路层 网络接口层 网卡层(数据链路层) 设施驱动程序与网路接口 物理层 物理层(硬件) 2.模型层与协定的关系 模型层与协定的关系 TCP/IP四层模型 TCP/IP五层模型 蕴含的协定 应用层 应用层 HTTP,HTTPS,DNS, URI,HTML,TLS/SSL, SMTP,SMTP,POP, IMAP,MIME,TELNET, SSH,FTP,SNMP, MIB,SIP,RTP, LDAP... 传输层 传输层 TCP,UDP,UDP-Lite, SCTP,DCCP... 网络层 网络层 IP,ARP,ICMP... 网络接口层 网卡层(数据链路层) 物理层(硬件) (PS:局部材料来源于《图解TCP/IP》这本书)

April 2, 2023 · 1 min · jiezi

关于tcp:一天吃透TCP面试八股文

本文曾经收录到Github仓库,该仓库蕴含计算机根底、Java根底、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等外围知识点,欢送star~ Github地址:https://github.com/Tyson0314/Java-learning 为什么须要TCP协定?IP 层是「不牢靠」的,它不保障网络包的交付、不保障网络包的按序交付、也不保障网络包中的数据的完整性。 因为 TCP 是一个工作在传输层的牢靠数据传输的服务,它能确保接收端接管的网络包是无损坏、无距离、非冗余和按序的。 说说TCP的三次握手假如发送端为客户端,接收端为服务端。开始时客户端和服务端的状态都是CLOSED。 第一次握手:客户端向服务端发动建设连贯申请,客户端会随机生成一个起始序列号x,客户端向服务端发送的字段中蕴含标记位SYN=1,序列号seq=x。第一次握手前客户端的状态为CLOSE,第一次握手后客户端的状态为SYN-SENT。此时服务端的状态为LISTEN。第二次握手:服务端在收到客户端发来的报文后,会随机生成一个服务端的起始序列号y,而后给客户端回复一段报文,其中包含标记位SYN=1,ACK=1,序列号seq=y,确认号ack=x+1。第二次握手前服务端的状态为LISTEN,第二次握手后服务端的状态为SYN-RCVD,此时客户端的状态为SYN-SENT。(其中SYN=1示意要和客户端建设一个连贯,ACK=1示意确认序号无效)第三次握手:客户端收到服务端发来的报文后,会再向服务端发送报文,其中蕴含标记位ACK=1,序列号seq=x+1,确认号ack=y+1。第三次握手前客户端的状态为SYN-SENT,第三次握手后客户端和服务端的状态都为ESTABLISHED。此时连贯建设实现。两次握手能够吗?之所以须要第三次握手,次要为了避免已生效的连贯申请报文段忽然又传输到了服务端,导致产生问题。 比方客户端A收回连贯申请,可能因为网络阻塞起因,A没有收到确认报文,于是A再重传一次连贯申请。而后连贯胜利,期待数据传输结束后,就开释了连贯。而后A收回的第一个连贯申请等到连贯开释当前的某个工夫才达到服务端B,此时B误认为A又收回一次新的连贯申请,于是就向A收回确认报文段。如果不采纳三次握手,只有B收回确认,就建设新的连贯了,此时A不会响应B的确认且不发送数据,则B始终期待A发送数据,浪费资源。说说TCP的四次挥手 A的利用过程先向其TCP收回连贯开释报文段(FIN=1,seq=u),并进行再发送数据,被动敞开TCP连贯,进入FIN-WAIT-1(终止期待1)状态,期待B的确认。B收到连贯开释报文段后即收回确认报文段(ACK=1,ack=u+1,seq=v),B进入CLOSE-WAIT(敞开期待)状态,此时的TCP处于半敞开状态,A到B的连贯开释。A收到B的确认后,进入FIN-WAIT-2(终止期待2)状态,期待B收回的连贯开释报文段。B发送完数据,就会收回连贯开释报文段(FIN=1,ACK=1,seq=w,ack=u+1),B进入LAST-ACK(最初确认)状态,期待A的确认。A收到B的连贯开释报文段后,对此收回确认报文段(ACK=1,seq=u+1,ack=w+1),A进入TIME-WAIT(工夫期待)状态。此时TCP未开释掉,须要通过工夫期待计时器设置的工夫2MSL(最大报文段生存工夫)后,A才进入CLOSED状态。B收到A收回的确认报文段后敞开连贯,若没收到A收回的确认报文段,B就会重传连贯开释报文段。第四次挥手为什么要期待2MSL?保障A发送的最初一个ACK报文段可能达到B。这个ACK报文段有可能失落,B收不到这个确认报文,就会超时重传连贯开释报文段,而后A能够在2MSL工夫内收到这个重传的连贯开释报文段,接着A重传一次确认,重新启动2MSL计时器,最初A和B都进入到CLOSED状态,若A在TIME-WAIT状态不期待一段时间,而是发送完ACK报文段后立刻开释连贯,则无奈收到B重传的连贯开释报文段,所以不会再发送一次确认报文段,B就无奈失常进入到CLOSED状态。避免已生效的连贯申请报文段呈现在本连贯中。A在发送完最初一个ACK报文段后,再通过2MSL,就能够使这个连贯所产生的所有报文段都从网络中隐没,使下一个新的连贯中不会呈现旧的连贯申请报文段。为什么是四次挥手?因为当Server端收到Client端的SYN连贯申请报文后,能够间接发送SYN+ACK报文。然而在敞开连贯时,当Server端收到Client端收回的连贯开释报文时,很可能并不会立刻敞开SOCKET,所以Server端先回复一个ACK报文,通知Client端我收到你的连贯开释报文了。只有等到Server端所有的报文都发送完了,这时Server端能力发送连贯开释报文,之后两边才会真正的断开连接。故须要四次挥手。 说说TCP报文首部有哪些字段,其作用又别离是什么? 16位端口号:源端口号,主机该报文段是来自哪里;指标端口号,要传给哪个下层协定或应用程序32位序号:一次TCP通信(从TCP连贯建设到断开)过程中某一个传输方向上的字节流的每个字节的编号。32位确认号:用作对另一方发送的tcp报文段的响应。其值是收到的TCP报文段的序号值加1。4位头部长度:示意tcp头部有多少个32bit字(4字节)。因为4位最大能标识15,所以TCP头部最长是60字节。6位标记位:URG(紧急指针是否无效),ACk(示意确认号是否无效),PSH(缓冲区尚未填满),RST(示意要求对方从新建设连贯),SYN(建设连贯音讯标记接),FIN(示意告知对方本端要敞开连贯了)16位窗口大小:是TCP流量管制的一个伎俩。这里说的窗口,指的是接管通告窗口。它通知对方本端的TCP接收缓冲区还能包容多少字节的数据,这样对方就能够管制发送数据的速度。16位校验和:由发送端填充,接收端对TCP报文段执行CRC算法以测验TCP报文段在传输过程中是否损坏。留神,这个校验不仅包含TCP头部,也包含数据局部。这也是TCP牢靠传输的一个重要保障。16位紧急指针:一个正的偏移量。它和序号字段的值相加示意最初一个紧急数据的下一字节的序号。因而,确切地说,这个字段是紧急指针绝对以后序号的偏移,无妨称之为紧急偏移。TCP的紧急指针是发送端向接收端发送紧急数据的办法。TCP有哪些特点?TCP是面向连贯的运输层协定。点对点,每一条TCP连贯只能有两个端点。TCP提供牢靠交付的服务。TCP提供全双工通信。面向字节流。TCP和UDP的区别?TCP面向连贯;UDP是无连贯的,即发送数据之前不须要建设连贯。TCP提供牢靠的服务;UDP不保障牢靠交付。TCP面向字节流,把数据看成一连串无构造的字节流;UDP是面向报文的。TCP有拥塞管制;UDP没有拥塞管制,因而网络呈现拥塞不会使源主机的发送速率升高(对实时利用很有用,如实时视频会议等)。每一条TCP连贯只能是点到点的;UDP反对一对一、一对多、多对一和多对多的通信形式。TCP首部开销20字节;UDP的首部开销小,只有8个字节。TCP 和 UDP 别离对应的常见应用层协定有哪些?基于TCP的应用层协定有:HTTP、FTP、SMTP、TELNET、SSH HTTP:HyperText Transfer Protocol(超文本传输协定),默认端口80FTP: File Transfer Protocol (文件传输协定), 默认端口(20用于传输数据,21用于传输管制信息)SMTP: Simple Mail Transfer Protocol (简略邮件传输协定) ,默认端口25TELNET: Teletype over the Network (网络电传), 默认端口23SSH:Secure Shell(平安外壳协定),默认端口 22基于UDP的应用层协定:DNS、TFTP、SNMP DNS : Domain Name Service (域名服务),默认端口 53TFTP: Trivial File Transfer Protocol (简略文件传输协定),默认端口69SNMP:Simple Network Management Protocol(简略网络管理协定),通过UDP端口161接管,只有Trap信息采纳UDP端口162。TCP的粘包和拆包TCP是面向流,没有界线的一串数据。TCP底层并不理解下层业务数据的具体含意,它会依据TCP缓冲区的理论状况进行包的划分,所以在业务上认为,一个残缺的包可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的TCP粘包和拆包问题。 为什么会产生粘包和拆包呢? 要发送的数据小于TCP发送缓冲区的大小,TCP将屡次写入缓冲区的数据一次发送进来,将会产生粘包;接收数据端的应用层没有及时读取接收缓冲区中的数据,将产生粘包;要发送的数据大于TCP发送缓冲区残余空间大小,将会产生拆包;待发送数据大于MSS(最大报文长度),TCP在传输前将进行拆包。即TCP报文长度-TCP头部长度>MSS。解决方案: 发送端将每个数据包封装为固定长度在数据尾部减少特殊字符进行宰割将数据分为两局部,一部分是头部,一部分是内容体;其中头部构造大小固定,且有一个字段申明内容体的大小。说说TCP是如何确保可靠性的呢?首先,TCP的连贯是基于三次握手,而断开则是基于四次挥手。确保连贯和断开的可靠性。其次,TCP的可靠性,还体现在有状态;TCP会记录哪些数据发送了,哪些数据被接管了,哪些没有被承受,并且保障数据包按序达到,保障数据传输不出差错。再次,TCP的可靠性,还体现在可管制。它有数据包校验、ACK应答、超时重传(发送方)、失序数据重传(接管方)、抛弃反复数据、流量管制(滑动窗口)和拥塞管制等机制。说下TCP的滑动窗口机制TCP 利用滑动窗口实现流量管制。流量管制是为了管制发送方发送速率,保障接管方来得及接管。 TCP会话的单方都各自保护一个发送窗口和一个接管窗口。接管窗口大小取决于利用、零碎、硬件的限度。发送窗口则取决于对端通告的接管窗口。接管方发送的确认报文中的window字段能够用来管制发送方窗口大小,从而影响发送方的发送速率。将接管方的确认报文window字段设置为 0,则发送方不能发送数据。 TCP头蕴含window字段,16bit位,它代表的是窗口的字节容量,最大为65535。这个字段是接收端通知发送端本人还有多少缓冲区能够接收数据。于是发送端就能够依据这个接收端的解决能力来发送数据,而不会导致接收端解决不过去。接管窗口的大小是约等于发送窗口的大小。 具体讲一下拥塞管制?避免过多的数据注入到网络中。 几种拥塞管制办法:慢开始( slow-start )、拥塞防止( congestion avoidance )、快重传( fast retransmit )和快复原( fast recovery )。 ...

March 17, 2023 · 1 min · jiezi

关于tcp:TCP协议是如何保证数据的可靠传输的

一、TCP协定简介1、数据包的发送流程一个数据包,从聊天框里收回,音讯会从聊天软件所在的用户空间拷贝到内核空间的发送缓冲区(send buffer),数据包在传输层增加一个TCP头部、在网络层增加一个IP首部,进入到数据链路层增加一个首部和尾部,将其封装为帧,在这里数据包会通过流控(qdisc),再通过RingBuffer发到物理层的网卡。数据就这样顺着网卡发到了纷繁复杂的网络世界里。这里头数据会通过多个路由器和交换机之间的转发和跳转,最初达到目标机器的网卡处。 此时目标机器的网卡会告诉DMA将数据包信息放到RingBuffer 接收缓冲区中,再触发一个硬中断给CPU,CPU触发软中断让ksoftirqd去RingBuffer轮询收包,于是一个数据包就这样顺着物理层,数据链路层,网络层,传输层逐层解封,最初从内核空间拷贝到用户空间里的聊天软件里。 数据从发送端到接收端,链路很长,任何一个中央都可能产生丢包,简直能够说丢包不可避免。那数据包的牢靠传输是如何保障的呢? 2、TCP协定在五层模型中的地位计算机网络体系结构中的物理层、数据链路层和网络层,它们独特解决了将主机通过异构网络互联起来所面临的问题,实现了主机到主机的通信。 网络层的IP 协定实现了路由性能,容许某个局域网的 A 主机,向另一个局域网的 B 主机发送音讯,而它并不保障数据包的残缺。 如何为运行在不同主机上的利用过程提供间接的逻辑通信服务,就是运输层的次要工作。 TCP协定位于传输层,次要解决数据的牢靠传输的问题。 3、什么是TCP协定TCP 是面向连贯的、牢靠的、基于字节流、全双工的传输层通信协议。 面向连贯:要求正式发送数据之前须要通过「握手」建设一个逻辑连贯,完结通信时也是通过有序的四次挥手来断开连接。 牢靠:无论的网络链路中呈现了怎么的链路变动,TCP都能保证数据从A机器的传输层牢靠地发到B机器的传输层; 基于字节流:流的含意是没有固定的报文边界。假如你调用 2 次 write 函数往 socket 里顺次写 500 字节、800 字节。write 函数只是把字节拷贝到内核缓冲区,最终会以多少条报文发送进来是不确定的。 全双工:通信的单方在任意时刻既能够是接收数据也能够是发送数据 二、撑持 TCP 协定的基石 —— 首部字段 1、源端口号、指标端口号TCP 的报文里是没有源 ip 和指标 ip 的,只有源端口号和指标端口号,因为那是 IP 层协定的事件。 2、序列号TCP 是面向字节流的协定,通过 TCP 传输的字节流的每个字节都调配了序号,序列号指的是本报文段第一个字节的序列号。用来解决网络包乱序问题。 3、确认号TCP 应用确认号来告知对方下一个冀望接管的序列号,小于此确认号的所有字节都曾经收到。用来解决丢包的问题。 4、窗口字段发送本报文段的一方的接管窗口的大小,即接管缓存的可用空间大小,这用来示意接管方的接管能力。这个字段用来管制发送方的数据发送量,这就是所谓的流量管制。 5、测验和字段用来查看整个TCP报文段在传输过程中是否呈现了误码,如果接管方检测到校验和有过错,则该 TCP 报文段会被间接抛弃。 6、管制位ACK:确认位,该位为 1 时,「确认应答」的字段变为无效,TCP 规定除了最后建设连贯时的 SYN 包之外该位必须设置为 1 。SYN:同步标记位 ,用于TCP“三次握手”建设连贯,该位为 1 时,示意心愿建设连贯,并在其「序列号」的字段进行序列号初始值的设定。FIN:终止标记位,该位为 1 时,示意今后不会再有数据发送,心愿断开连接。三、序列号与确认应答机制TCP为发送的每个字节都调配了序号,并将每个报文段的第一个序号放到首部的序列号上,以便接管的一方依照程序还原。 确认应答机制就是接管方收到 TCP 报文段后就会返回一个确认应答音讯,示意这个序列号以前的数据曾经收到。 ...

January 11, 2023 · 2 min · jiezi

关于tcp:抓包分析-TCP-握手和挥手

前言首先须要明确的是 TCP 是一个牢靠传输协定,它的所有特点最终都是为了这个牢靠传输服务。在网上看到过很多文章讲 TCP 连贯的三次握手和断开连接的四次挥手,然而都太过于实践,看完感觉总是似懂非懂。重复思考过后,感觉我本人还是偏工程型的人,要学习这些理论性的常识,最好的形式还是要通过理论案例来了解,这样才会具象粗浅。本文通过 Wireshark 抓包来剖析 TCP 三次握手和四次挥手,如果你也对这些实践感觉似懂非懂,那么强烈建议你也联合抓包实际来强化了解这些理论性的常识。 三次握手TCP 建设连贯的三次握手是连贯的单方协商确认一些信息(Sequence number、Maximum Segment Size、Window Size 等),Sequence number 有两个作用:一个是 SYN 标识位为 1 时作为初始序列号(ISN),则理论第一个数据字节的序列号和相应 ACK 中的确认号就是这个序列号加 1;另一个是 SYN 标识位为 0 时,则是以后会话的 segment(传输层叫 segment,网络层叫 packet,数据链路层叫 frame)的第一个数据字节的累积序列号。Maximum Segment Size 简称 MSS,示意最大一个 segment 中能传输的信息(不含 TCP、IP 头部)。Window Size 示意发送方接管窗口的大小。上面看看我在本地拜访博客 mghio 的三次握手过程: 图中三个小红框示意与服务器建设连贯的三次握手。 第一步,client 端(这个示例也就是浏览器)发送 SYN 到 server 端;第二步,server 端收到 SYN 音讯后,回复 SYN + ACK 到client 端,ACK 示意曾经收到了 client 的 SYN 音讯;第三步,client 端收到回复 SYN + ACK 后,也回复一个 ACK 示意收到了 server 端的 SYN + ACK 了,其实到这一步,client 端的 60469 端口曾经是 ESTABLISHED 状态了。能够看到,其实三次握手的外围目标就是单方相互告知对象本人的 Sequence number,蓝框是 client 端的初始 Sequence number 和 client 端回复的 ACK,绿框是 server 端的初始 Sequence number 和 client 端回复的 ACK。这样协商好初始 Sequence number 后,发送数据包时发送端就能够判断丢包和进行丢包重传了。 ...

November 6, 2022 · 2 min · jiezi

关于tcp:TCP如何实现可靠传输流量控制拥塞控制

上一篇文章中讲述了TCP首部的存储的数据,这一篇来聊聊这些数据帮忙TCP实现一些个性。 牢靠传输TCP传输会保障数据的牢靠和残缺,如果数据传输过程失落了,会从新传输。 保障的第一种协定形式是 进行期待ARQ协定,发送一条数据,收到确认音讯之后再发送第二条数据,如果期待了肯定的时候还没有收到确认音讯,则从新发送刚刚那条数据。 此时接管方可能存在雷同的数据,那么它会抛弃反复数据,并重传确认的音讯。发送方也有可能因为确认音讯超过了设定的重传工夫,而收到多条确认音讯。 进行期待ARQ协定简略,但信道的利用率低,每次要等到确认才会发送下一条数据。那有没有方法晋升信道的利用率,一次多传些数据呢? 间断ARQ和滑动窗口协定提供了解决方案,在接管方和发送方别离存在缓存区域,数据发送或确认后,窗口滑动到下一片区域。 其中发送缓存暂存发送应用程序传给发送方TCP筹备发送的数据及TCP已发送但尚未收到确认的数据,接管缓存暂存按需达到的、但尚未被接管应用程序读取的数据及未按序达到的数据。 发送方将多条数据按肯定工夫距离发送,接管方确认该次传递数据的最初一条,发送方收到确认的申请之后,窗口滑动到下一批次须要发送申请的范畴。 那么如果在发送过程中存在数据失落的申请呢,比方M1-M4的数据,其中M3失落了,此时接管方会发送确认M2的数据,发送方会从新发送M3和M4。 但M4是被接管方失常接管的,无需再反复发送,这时候须要用到抉择确认ACK,这部分的数据保留在TCP首部的选项局部,接管方通过它告知发送方,须要重传的内容,比方M3失落,那么范畴值就会少了M3这部分,发送方通过TCP首部得悉只须要重传M3。 应用间断ARQ、滑动窗口协定和抉择确认ACK保障TCP的牢靠传输。 流量管制如果接管方的缓存区满了,而发送方依然不停的发送数据,这样接管方只能将收到的数据包丢掉,这样造成了极大的网络资源节约,流量管制就是为了防止这样的问题呈现。 通过确认报文中TCP首部的窗口属性,来限度发送方的发送速率,数据发送越大,缓存区内可存储的范畴越小,那么窗口的大小也会发生变化。 如果发送方接管到的窗口大小为0,那么发送方就会进行发送,但它同时会开启一个定时器,隔一段时间就发个测试报文去询问接管方最新的窗口大小,如果接管的窗口大小还是为0,则发送方再次刷新启动定时器,这样当接管方的缓存区有空余时,发送方就能够持续发送数据。 流量管制是点对点通信量的管制,是接收端管制发送端的问题,克制发送端的发送速率,以便接收端来得及接管。但当网络设备过多,即便限度了每个设施的发送数据大小,依然可能链路过载,这时候须要一个全局性的通信管制。 拥塞管制拥塞管制,避免过多的数据注入到网络中,防止网络中的路由器或链路过载。理论中的拥塞管制并不会任由吞吐量稳步达到负载的最大值,而后在高峰放弃,而是指数增长到肯定值后缓存回升。 因为当负载总量为1000时,最大能达到可能就800、900,当达到300左右就会轻度拥塞(丢包),达到800就会达到拥塞顶部,再继续输入吞吐量升高,如果没有拥塞管制,可能会丢包重大最初死锁。 在理解拥塞管制的办法前,首先要晓得几个名词 MSS(Maxium segment size) 每个段最大的数据局部大小,建设连贯时确认,存在选项属性中,首部共计32字节,发送方和接管方可能不一样,取最小值cwnd(congestion window) 拥塞窗口,在发送方,依据网络状况而定,比方5000rwnd(receive window) 接管窗口,在接受方,通知发送方所有段加起来的总和,比方3000swnd(send window) 发送窗口,取拥塞窗口和接管窗口的最小值,此时为3000swnd = min(cwnd, rwnd)拥塞管制的算法有四种,慢开始(slow start)、拥塞防止(congestion avoidance)、疾速重传(fast retransmit)、疾速复原(fast recovery)。 慢开始:刚开始发的很慢,比方rwnd为3000,mss为100,一次最多能够发30个段,但cwnd不会发这么多,而是从100到200,到400再到800,指数减少。 拥塞防止:拥塞窗口(cwnd)迟缓增大,免得网络过早呈现拥塞。 加法增大 --- 慢开始有一个阈值ssthresh(slow start threshold),比方cwnd为2400,阈值1600,那么当拥塞窗口达到1600当前,就不指数增长,而是以线性减少(每次加一点)乘法减小 --- 当网络拥塞(发送方发了很多数据但没有收到接管方确认)时,将ssthresh减为拥塞窗口的一半(1200),【与此同时,执行慢开始算法,cwnd复原初始值(100)】(旧版本)如果网络频繁拥塞,ssthresh值会降落得很快,因为一直的减半疾速重传:接管方收到谬误程序的数据时,比方m1、m2都胜利确认,m3失落,m4发送胜利,此时会反复确认m2、发送方收到三个间断的m2反复确认,立即重传m3,在此之前应用的是超时重传(期待肯定的工夫没有收到确认的报文再重传)。 疾速复原:当网络拥塞,ssthresh减为拥塞峰值的一半时,拥塞窗口给(cwmd)不复原到初始值,间接从ssthresh减半后的阈值1200开始,再加法增大。 这四个算法造成了TCP的拥塞管制,初始发送申请应用慢开始,线性增长阈值后,开启加法增大到拥塞窗口的值后,减法减小将阈值减小为拥塞窗口的一半,如果此时再应用慢开始从初始值开始,发送数据会比拟小,疾速复原在从图标5处,间接从阈值开始,减少发送窗口数据。 TCP协定通过牢靠传输、流量管制、拥塞管制保障数据的残缺、网络的顺畅。TCP还有一个十分重要的属性,连贯治理,它是如何建设连贯和断开连接呢?敬请期待我下一篇文章~ 以上就是对于 TCP如何实现牢靠传输、流量管制、拥塞管制的内容 , 更多无关 前端、网络协议的内容能够参考我其它的博文,继续更新中~

October 30, 2022 · 1 min · jiezi

关于tcp:容器化-TCP-Socket-缓存接收窗口参数

本文转自我的 Blog: 容器化 TCP Socket 缓存、接管窗口参数 目录背景说说历史 TCP High Performance ExtensionsKernel 主动调整窗口与缓存大小容器化/NamespaceifyTCP 的 sysctl 配置 rmem_defaultrmem_maxwmem_defaultwmem_maxtcp_moderate_rcvbufnet.ipv4.tcp_rmem 容器化/Namespaceifynet.ipv4.tcp_wmem 容器化/Namespaceifynet.ipv4.tcp_memtcp_adv_win_scaletcp_keepalivenet.core.somaxconntcp_max_syn_backlogSO_RCVBUFCGroup Memory Control Kernel CGroup Memory ControlKubernetesGoogle Cloud: TCP Memory Isolation How is TCP memory accounted?What happens on TCP pressure?Current TCP memory accounting causes isolation issuesSolving Problem 1Solution: TCP memory accounting using memory cgroupsTCP 参数容器化/Namespaceify KernelKubernetes其它参考最近须要反对一个单 POD 的 TCP 连接数上 10k 的根底服务(Cassandra)的容器化。须要对其应用的资源(特地是TCP缓存内存),以及对相邻 Pod(同一 worker node 上运行的)影响(即容器隔离状况),等进行预估。故写本文,以备忘。心愿对读者也有肯定参考价值,毕竟做技术要较真,要么有工夫和能力就本人看内核源码,如果不能,要看文档和文章的话,只能货比三家才靠谱。 材料收集不单单是个技术活,也是语言艺术活。如,输出什么关键字才适合、哪些材料起源看来更靠谱…… 因为是材料收集,加上自己的翻译程度无限,所以我是尽量少翻译,放弃原文,谢谢了解。同时我会退出一些集体注解,以供参考。 背景最近须要反对一个单 POD 的 TCP 连接数上 10k 的根底服务(Cassandra)的容器化。须要对其应用的资源(特地是TCP缓存内存),以及对相邻 Pod(同一 worker node 上运行的)影响(即容器隔离状况),等进行预估。Cassandra 的官网推崇应用的 TCP 参数: ...

October 14, 2022 · 18 min · jiezi

关于tcp:TCP-滑动窗口是个什么东西这篇讲清楚

明天咱们来看TCP的滑动窗口问题,无论是在工作中,还是在口试面试中,滑动窗口都是十分重要的概念,明天,图文并茂给大家讲清楚,一起来看看。 一、TCP的劣势 TCP通过多年厮杀,早已确立了松软的江湖根底,是面向连贯,牢靠,基于字节流的传输层协定。所谓牢靠,就是确保数据精确的,不反复,无提早的达到目的地; TCP的总结如下: ①数据分片:在发送端对用户数据进行分片,在接收端进行重组,由TCP确定分片的大小并管制分片和重组; ②达到确认:接收端接管到分片数据时,依据分片数据序号向发送端发送一个确认; ③超时重发:发送方在发送分片时启动超时定时器,如果在定时器超时之后没有收到相应的确认,重发分片; ④滑动窗口:TCP连贯每一方的接管缓冲空间大小都固定,接收端只容许另一端发送接收端缓冲区所能接收的数据,TCP在滑动窗口的根底上提供流量管制,避免较快主机以致较慢主机的缓冲区溢出; ⑤失序解决:作为IP数据报来传输的TCP分片达到时可能会失序,TCP将对收到的数据进行从新排序,将收到的数据以正确的程序交给应用层; ⑥反复解决:作为IP数据报来传输的TCP分片会产生反复,TCP的接收端必须抛弃反复的数据; ⑦数据校验:TCP将放弃它首部和数据的测验和,这是一个端到端的测验和,目标是检测数据在传输过程中的任何变动。如果收到分片的测验和有过错,TCP将抛弃这个分片,并不确认收到此报文段导致对端超时并重发。 其中很重要的一环就是“滑动窗口”,上面咱们重点关注一下。 二、滑动窗口的引入 IP 层协定属于不牢靠的协定,IP 层并不关系数据是否发送到了对端,在简单的网络中,因为各种各样的起因,接管到数据包的程序不肯定和发送的程序雷同,这就是乱序问题。这种状况下,有必要为每个包定义一个序号seq,每个包用一个校验和确保数据完整性。 而后发送方不能不论接管方的承受能力,只顾着发。举个栗子,一个高速公路如果没有收费站,那么车辆就会一拥而入,此时不凑巧,产生了追尾事变,导致公路拥塞,如果不管制公路的进入车辆,那么整个高速公路都会变成“露天停车场”。说到这里你可能就明确了,TCP须要这样的“收费站”,而这个收费站就是“滑动窗口”。 而后,平时在高速上的时候,仔细的你留神到了:除了入口有个收费站,进口也有个收费站。TCP也是一样的,除了入口有发送方滑动窗口,出口处也设立有接管方滑动窗口。 收费站除了限度流速以外还有什么作用鸭?是不是要免费呢,毕竟这是国家修的路,不能白走是吧。 对于发送方滑动窗口(入口收费站),咱们把数据包看成车辆,枚举它们的状态: 还未进入入口收费站车辆。对应的是下图Not Sent,Recipient Not Ready to Receive。这些数据属于发送端未发送,同时接收端也未筹备接管的。进入收费站,但未进入高速路。对应的是图中的Not Sent,Recipient Ready to Receive。这部分数据是发送端未发送,但曾经告知接管方的,这部分其实曾经在窗口中(发送端缓存)了,期待发送。在高速公路上行驶的车辆。对应的是Send But Not Yet Acknowledged。这部分数据称为发送但没有被确认,数据被发送进来,没有收到接收端的 ACK,认为并没有实现发送,这个属于窗口内的数据。达到进口收费站的车辆。对应的是Sent and Acknowledged。这些数据表示曾经发送胜利并曾经被确认的数据,这些数据曾经来到窗口了。 对于接管方滑动窗口(进口收费站),相似发送端,接收端的数据有 4 个分类,因为接收端并不需要期待 ACK 所以它没有相似的接管并确认了的分类,状况如下 车辆还未达到进口收费站。对应Not Received:有空位,还没有被接管的数据车辆达到进口收费站,但未实现缴费。对应Received Not ACK: 曾经接管并,然而还没有回复 ACK,这些包可能输属于 Delay ACK 的领域了。车辆实现缴费,但不晓得走哪条路。对应Received and ACK Not Send to Process:这部分数据属于接管了数据然而还没有被下层的应用程序接管,也是被缓存在窗口内。车辆来到进口收费站。对应Received and ACK Send to Process。来到了窗口缓存。这样讲是不是就很明确了,上面给出滑动窗口的正式定义。 Left edge和Right edge别离示意滑动窗口的左边界和右边界。Usable Window:示意窗口的缓冲区。Send Window :发送窗口, 这部分值是有接管方在三次握手的时候进行设置的,同时在接管过程中也一直地通告能够发送的窗口大小,来进行适应。Window Already Sent: 曾经发送的数据,然而并没有收到 ACK。滑动窗口所谓的“滑动”,并不是说窗口在动,而是因为数据在一直进入和来到窗口,也就是说真正“动”的是数据,上面一幅图就示意了这点: ...

October 9, 2022 · 8 min · jiezi

关于tcp:tcp-window

概念TCP协定中的window,用于向对端发送本人的TCP接管音讯的缓冲区大小。其作用为疏导对方在必要的时候调整数据发送的速度,以便本地能够的解决缓冲区的音讯,避免缓冲区被填满,从而产生有效的音讯传输。 例子在TCP两端进行数据传输的过程中,会不断更新本人的window,从而实现流量管制的目标。一个形象的例子为TCP两端通过一根水管(TCP 连贯)连贯,两端各有一个水桶(接收缓冲区)用来接管对端流过来的水(发送的数据)。而window就用来示意以后水桶残余的闲暇容量(残余的接收缓冲区大小)。如果window过小,对端就会缩小发送水流(数据)速度,留更多的工夫以便水桶中的水被应用(数据被利用应用)。在桶中的水(数据)被耗费后,window变大,再进步水流(发送数据)的速度。 Window scalewindow的大小最后被定义为2个byte,最大能够示意65535Byte。随着网络带宽的进步,不能满足大数据量的利用需要。为了进步window大小,并且尽可能的缩小对已有利用的影响,TCP协定并没有间接减少window的位数,而是通过Window scale对window进行裁减。在反对Window scale的状况下,理论的window大小(由Calculated window size代表)为windowWindow size scaling factor。最大为655352^14,略微小于1GB,远高于以前的65535B。 在TCP3次握手的时候,单方会协商是否反对Window scale,如果反对Window scale则在第一个音讯(SYN或者SYN,ACK)中携带Window scale Option。只有单方都反对Window scale时,后续单方才会应用Window scale。 参考资料https://blog.csdn.net/TWTFHVK...https://www.qacafe.com/resour...

September 23, 2022 · 1 min · jiezi

关于tcp:字节一面说说TCP的三次握手

上周有敌人去了字节面试,问到了TCP三次握手的问题,过后答复的不是很好,对于三次握手的发送的报文信息都不太熟,本文次要做一下总结和记录。TCP全称为Transmission Control Protocol(传输控制协议),是一种面向连贯的、牢靠的、基于字节流的传输层通信协议。TCP也是全双工通信协议,示意客户端能够给服务端发送音讯,服务端也能够向客户端发送音讯。 报文TCP处于ISO七层模型的传输层,传输层的单位是报文,报文信息如下: Source port 和 Destination port其中Source port和Destination port别离代表发送端口和接管端口。两个不同机器上的过程通信,须要通过端口和IP协定中的IP标识惟一的过程。 Sequence number 和 Acknowledgment numberSequence number示意序列号,示意要发送数据的起始号,在上面的三次握手应用seq示意,Acknowledgment number示意确认号,返回确认号,示意音讯曾经接管,返回下次要发送的起始号。在上面的三次握手应用ackNum标识。 TCP flagTCP flag示意TCP标记位,次要介绍两个ACK和SYN: SYN同步序号,用于建设连贯过程。ACK确认序号标识,标识示意发送信息已确认接管。Windows SizeTCP应用滑动窗口来实现流量管制,依据窗口大小,确认要发送数据包的个数。 TCP 三次握手TCP三次握手,是指建设一个TCP连贯时,须要客户端和服务器总共发送3个包。三次握手的目标是连贯服务指定端口,建设 TCP 连贯,并确认连贯单方的序列号和确认号,确认TCP窗口大小信息。 三次握手详解: 第一次握手 SYN=1,seq=x 客户端发送一个TCP的SYN标记位为1的包,指定客户端连贯的服务器端口,初始序列号seq为x。发送结束之后客户端进入SYN_SEND。第二次握手 SYN=1,ACK=1,seq=y,ACKnum=x+1 服务器发回确认包ACK应答。即SYN标记位和ACK标记位均为1。服务器端发送序列号seq为y,同时将确认序号ackNum设置为客户端的序列号seq+1,ackNum示意要下次要发送数据包序列号的起始值。发送结束后,服务端进入SYN_SEND状态。第三次握手 ACK=1,ACKnum=y+1 客户端再次发送确认包ACK,ACK 标记位为1,并且把服务器发来的ackNum作为起始序号seq发送给服务端,确认号ackNum为服务端发送的序列号+1也就是y+1,放在确认字段中发送给对方,发送结束后,客户端进入ESTABLISHED状态,当服务器端接管到这个包时,也进入ESTABLISHED状态,开始数据传输。wireshake 抓包为了更好了解三次握手,应用wireshakej进行抓包。首先申请拜访链接,TCP三次握手对应上面编号57、63、64: 第一步:192.168.5.150 ----> 47.98.202.133 [SYN] seq=0第二步:47.98.202.133 ----> 192.168.5.150 [SYN ACK] seq=0 ack=1第三步:192.168.3.150 ----> 47.98.202.133 [ACK] seq=1 ack=1记忆口诀那么在面试的时候应该如何记忆三次握手的流程?三次握手是为了建设连贯,其中次要是为了确认客户端和服务端的序列号seq,那么确认序列号就须要接管方返回序列号,来确保本人发送的序列号能胜利发送。 第一次握手和第二次握手确保客户端的序列号,所以第一次发送seq,第二次返回ack,当接管到返回信息,表明确认了客户端序列号。第一次和第二次都是建设连贯过程,所以都带有SYN标记位。而第二次返回号,所以第二次带ACK标记位。第一次发送了序号seq为x,返回确认号ackNum为x+1,因为发送耗费了一个序号,所以ackNum要加1。第二次握手和第三次握手是为了确保服务端的序列号,服务端发送序列号seq,客户端返回确认号ackNum,值为seq+1。第二次握手要发送序号和返回上一次的握手的确认号,所以第二次握手带有SYN和ACK标记位。并且要发送序列号seq和确认号ackNum。第三次握手是确认服务端发送序列号,所以带有标记位ACK,返回确认号ackNum。为啥 TCP 须要三次握手,不是两次,四次TCP三次握手是为了确认单方的序列号,这就像一个发送—应答机制,客户端发序列号,服务端返回确认号,此时确认了客户端的序列号。如果是两次握手,只能确认客户端的序列号,无奈确认服务端的序列号。三次握手是确认两个序列号最小的连贯次数。四次也能够,然而没有必要,须要缩小握手的次数,放慢连贯速度。 总结本文先介绍了报文头信息,三次握手次要用到了: 序列号seq,确认号ackNum。TCP标记位,SYN同步序号,示意建设连贯过程。ACK确认序号标识,标识示意发送信息已确认接管三次握手详解: 第一次握手,客户端发送带有SYN标记位的包,带有初始化序列号x,发送结束客户端进入SYN_SEND状态。第二次握手,服务端返回应答标记位ACK,并返回确认号ackNum为x+1,x+1示意发送耗费了一个序列号。返回了确认号示意确认了客户端序列号。服务端也要发送序列号y,所以也要带有SYN的标记位。第三次握手客户端发送确认包ackNum为y+1,所以带确认序号标记ACK。建设连贯,发送序号x+1,开始传输数据。参考TCP协定

August 28, 2022 · 1 min · jiezi

关于tcp:TCP-学习笔记三-可靠传输

前言让咱们来回顾一下TCP,TCP位于传输层(也有人称之为运输层),TCP提供牢靠交付的服务,无差错、不失落,不反复,并且按序达到 ,这句话出自教科书。 其实这个不失落我感觉能够了解为就算是有个数据包失落的状况下,TCP提供的超时重传也能保障你能收到残缺的数据包。失落的最奢侈的场景就是数据包被确定要走哪一片光缆的时候,这片光纤被挖断了,我大学的时候某个月,光纤就老是被挖断,那被调配到这片光缆上的数据包就能够了解为失落了。那失落了怎么办呢,再重传一次。但其实在网络这里,重传并不是一件简略的事件,因为有的时候,数据包未必失落,也可能是早退,除此之外,还要思考效率问题。 让咱们从最简略的模型谈起全双工的通信的意思是,单方既是发送方也是接管方,然而为了探讨问题不便,咱们目前只思考A发送数据,而B接管,这里是探讨牢靠传输的原理,所以不思考 数据包在哪一个档次进行传输,因而把传送的数据单元称之为分组(传输层传送的数据单元叫报文段,网络层传输的协定数据单元叫做IP数据包)。 让咱们先从最简略的模型谈起,也就是进行期待协定,进行期待的意思是,每发送完一个分组就进行发送,期待对方的确认。在收到确认之后再发送下一个分组。 在这种模型下有以下几种状况: 无差错这种状况最简略,A发送分组M1,发送完就暂停发送,期待B的确认。B收到了M1就向A发送确认。A在收到了对M1的确认之后,就再发送下一个分组M2。呈现过错分组在传输过程中呈现过错。B接管M1时检测出了过错,就抛弃了M1,其余什么也不做(不告诉A收到有过错的分组,在牢靠传输的协定中,也能够检测出有过错时发送“否定报文”给对方。这样做的益处是可能让发送方及早晓得呈现过错。不过因为这样解决会使协定变得复杂,当初实用的牢靠传输协定都不应用这种否定报文了)。也可能是M1在传输的过程中失落了,这时B当然什么都不晓得。在这两种状况下,B都不会发送任何信息,个别的牢靠传输协定是这么设计的: A只有超过了一段时间依然没有收到确认,就认为方才发送的分组失落了,因此重传后面发送过的分组。这叫超时重传。要实现超时重传,就要在每发送完一个分组时设置一个超时计时器,如果在超时计时器到期之前收到了对方的确认,就撤销已设置的超时计时器。确认失落和确认早退B发送的对M1的确认失落了。A在设定的超时重传工夫内没有收到确认,并无奈晓得是本人发送的分组出错、失落,或者B发送的确认失落了。因而A的超时计时器失落之后就会重传M1。假设在这种状况下B就又收到了M1,对于B来说解决这个重传的M1就要采取两个口头: 抛弃这个反复的分组M1,不向下层进行交付。向A发送确认,不能认为曾经发送过确认就不再发送。因为A之所以重传M1,就示意没有收到对M1的确认。再有一种状况,B对M1的确认报文没有失落,而是早退了,在这种状况下A可能就会反复收到确认。对反复确认的解决很简略:收下后,就抛弃。B依然会收到反复的M1,并且同样抛弃反复的M1,并重传确认分组。 通常A最终总是能够收到对所有收回的分组的确认。如果A一直重传分组但总是收不到确认,就阐明通信线路太差,不能进行通信。设想一下,你的手机在弱网环境下,收回去的音讯会转圈圈,如果转了很长时间也没收回去,微信就认为这条音讯没收回去。 应用上述的确认和重传机制,咱们就能够在不牢靠的传输网络上实现牢靠的通信。介绍这个模型次要是为了引出为了牢靠传输会遇到哪些问题,这个模型的传输效率是非常低的,信道的利用率只有5.66%,这意味着信道在大多数工夫内都是闲暇的。 为了进步传输效率,发送方采取了流水线传输,流水线传输就是发送方能够间断发送多个分组,不用每发送一个分组就停顿下来,期待对方的确认。当应用流水线传输时,就引出了间断ARQ协定和滑动窗口协定。滑动窗口协定比ARQ协定简单,咱们这里先介绍间断ARQ协定,再介绍滑动窗口协定。 间断ARQ协定 下面是一个典型TCP报文首部格局,我这里不打算一一介绍TCP首部中各个字段的意思,这里只介绍一些咱们本篇所须要的字段: 源端口和目标端口各占两个字节,别离写入源端口号和目标端口号窗口占两个字节,窗口值是[0, 2^16^-1] 之间的整数,是指接管方容许对方发送的数据量,之所以有这个限度,起因就在于接管方的数据缓存空间是无限的。 窗口字段明确指出了当初容许对方发送的数据量。窗口值常常在动静的变动着。 序号占4字节。序号范畴为是[0,2^32^ -1], 共2^32^ 个序号,序号达到最大值之后,又回到0。在一个TCP连贯中传送的字节流中每一个字节都按程序编号,TCP报文首部的序号值则指的是本报文段所发送的数据的第一个字节的序号。确认号占4字节,是冀望收到对方下一个报文段的第一个数据字节的序号。TCP是双工的协定,会话的单方都能够同时接管、发送数据。TCP会话的单方都各自保护一个“发送窗口”和一个“接管窗口”。其中各自的“接管窗口”大小取决于利用、零碎、硬件的限度(TCP传输速率不能大于利用的数据处理速率)。各自的“发送窗口”则要求取决于对端通告的“接管窗口”,要求雷同 下图示意的是发送方维持的发送窗口: 示意的意义是:位于发送窗口内的5个分组都能够间断发送进来,而不须要期待对方的确认。这样,信道利用率就进步了。 间断ARQ协定规定,发送方没收到一个确认,就把发送窗口向前滑动一个分组的地位。接管方个别都采纳累积确认的形式。这就是说,接管方不用对收到的分组一一发送确认,而是在收到几个分组之后,对按序达到的最初一个分组发送确认,这就示意: 到这个分组为止的所有分组都曾经正确收到了。 然而累积确认有长处也有毛病, 长处是:容易实现。毛病是不能向发送方反映出接管方曾经正确收到的所有分组的信息。 举一个例子: 发送方发送了五个分组,两头第三个分组失落了,留神咱们下面的确认形式是对按序达到的最初一个分组发送确认,咱们收到了1、2、4、5,就只能发送对2的确认,于是发送方就只好将3、4、5再重传一次,咱们将这种状况称之为Go-back-N(回退N),示意须要再退回来重传曾经发送过的N个分组。可见当通信线路品质不好时,间断ARQ协定会带来负面的影响。对于这种协定TCP打上的补丁为抉择确认SACK,咱们前面会讲。 滑动窗口协定上面咱们探讨TCP中的滑动窗口协定,为了探讨问题,咱们还是先假设数据传输只在一个方向进行,即A发送数据,B接收数据,这个模型其实曾经足够阐明滑动窗口协定了。 现假设A收到B发来的确认报文段,其中窗口是10字节,而确认号是31(这表明B冀望收到的下一个序号是32),而序号30为止的数据曾经收到了),依据这两个数据,A就结构进去本人的滑动窗口: 下面的发送窗口示意:在没收到B的确认的状况下,A能够间断把窗口内的数据都发送进来。但凡曾经发送过的数据,在未收到确认之前都必须临时保留,以便在超时重传时应用。发送窗口也可能变小,当对方告诉的窗口放大,但TCP的规范强烈不倡议这样做。因为很可能发送方在收到这个告诉以前曾经发送了窗口的很多数据,当初又要膨胀窗口,不让发送这些数据,这样就会产生一些谬误。 当初假设A发送了序号为31-35的数据,这时发送窗口地位并未产生扭转,但发送窗口内靠后面有5个字节示意已发送但未收到确认。而发送窗口靠前面的五个字节(36-40)是示意容许发送但尚未发送的。 从以上所述能够看出,要形容一个发送窗口的状态须要是三个指针: P1,P2和P3: 小于P1的是已发送并已收到确认的局部,而大于P3的是不容许发送的局部。P3-P1=A的发送窗口,P2-P1 = 曾经发送但尚未收到确认的字节数。P3-P2=容许发送但以后尚未发送的字节数。 再看下B的接管窗口。B的接管窗口大小是10.在接管窗口里面,到30号地位的数据是曾经发送过确认。因而B能够不再保留这些数据,接管窗口内的序号(31-40)是容许接管的。在上面的图中,B收到了序号为32-33的数据。这些数据没有按序达到,因为序号为31的数据没有收到(兴许失落了,兴许滞留在网路中的某处),因为31没收到,所以B发送的确认报文段中的确认号依然是31(即冀望收到的序号),而不能是32或33. 当初假设B收到了A重传的31-33的数据,并把序号31-33的交付给应用层的程序,而后B删除这些数据。接着把接管窗口向前挪动3个序号,同时给A发送确认,其中窗口值依然是10,但确认号是34。这表明B曾经收到了到序号33为止的数据。 收到确认之后,A的可用滑动窗口变大,这个时候如果A发送完序号36-43的数据,P2会和P3重合。发送窗口内的序号曾经用完,但还没有再收到确认。A的发送窗口已满,就不能再发送数据,必须进行发送数据。此时存在两种状况: 数据包还在路上,未达到BB曾经给A发送了确认,然而还在路上。为了保障牢靠传输,A通过一段时间之后(在超时计时器到期之后),就会重传这部分数据,从新设置超时计时器,直到收到B的确认地位。如果A收到确认号落在发送窗口内,那么A就能够发送窗口持续向前滑动,并发送新的数据。 抉择确认-SACK下面的阐述中还有一个问题,就是B遗失了两头序号的数据包,会申请A再重传,然而在下面的探讨中窗口值较小,影响还不是很大,然而如果窗口值很大,遗失了两头的一个包,这样有的时候可能导致网络拥挤,对于这种状况,TCP提出了抉择确认。咱们举一个例子来阐明抉择确认的原理. 假如A收到了以下三个字节流: 从图中咱们能够看到短少了1001-1500、3001-3500,一个直白的思路就是,收到这三个字节流的时候,算出短少的区间,再申请回传的时候带上这些区间。咱们下面画出了TCP首部,目前看来没有哪个字段可能提供边界信息。RFC 2018对此做了规定,如果要应用抉择确认SACK,那么在建设TCP连贯时候,就必须在TCP的首部的选项中增加上“容许SACK”的选项,而单方必须当时约定好。 超时工夫的抉择下面咱们提到了超时重传,这里来进行详尽的探讨,设置固定的超时工夫是齐全不可取的,因为不同地区的网络品质不同,所以这个超时工夫该当是自适应的,这也是TCP的思路,TCP采纳了一种自适应算法,记录一个报文段收回的工夫,以及收到相应的确认的工夫。这两个工夫之差就是报文段的往返工夫RTT。TCP保留了RTT的一个加权均匀往返工夫RTTs(这又被称为平滑的往返工夫,S示意Smoothed。因为进行的是加权均匀,因而得出的后果更加平滑)。 每当第一次测量到RTT样本时,RTTs值就取为所测量到的RTT样本值。但当前每测量到一个新的RTT样本,就按上面的共识从新计算一次RTTs: 新的RTTs = (1 - ) × (旧的RTTs)+ × (新的RTT样本) 在上式中,0 ≤ ≤ 1. 若很靠近0,则示意新的RTTs值和旧的差距不大,若靠近于1,则示意新的RTTs受新的RTT样本影响较大。RFC 6298举荐值为1/8。 ...

August 7, 2022 · 1 min · jiezi

关于tcp:可能是最完整的-TCP-连接健康指标工具-ss-的说明

写在后面TCP 连贯衰弱的重要性如何查看 TCP 连贯衰弱 容器化时代曾神秘的 ss更神秘的无文档指标ss 简介字段阐明 Recv-Q与Send-Q根本信息MTU/MSS 相干 mssadvmsspmturcvmssFlow control 流控 cwndssthreshretrans 重传相干 retransbytes_retranstimer 定时器Other app_limited特地操作 specified network namespacekill socket监听连贯敞开事件过滤器原理 NetlinkNETLINK_INET_DIAG idiag_extNetlink in deep参考写在后面我不是网格专家,只是在经验了多年的生产和测试环境网络问题排查后,不想再得过且过,于是记录下所学到的常识。因为对 TCP 栈的实现理解无限,所以内容仅作参考。 TCP 连贯衰弱的重要性TCP 连贯衰弱起码包含: TCP 重传统计,这是网络品质的风向标MTU/MSS 大小,拥挤窗口的大小,这是带宽与吞吐的重要指标各层收发队列与缓存的统计这个问题在《从性能问题定位,扯到性能模型,再到 TCP - 都微服务云原生了,还学 TCP 干嘛系列 Part 1》中我聊过,不再反复。 如何查看 TCP 连贯衰弱Linux 的 TCP 连贯衰弱指标有两种: 整机的统计 聚合了整机(严格来说,是整个 network namespace 或 整个 container) 的网络衰弱指标。可用 nstat 查看。 每个 TCP 连贯的统计 每个 TCP 连贯均在内核中保留了统计数据。可用 ss 查看。 本文只关注 每个 TCP 连贯的统计 ,整机的统计 请到 这篇 查看。 ...

August 2, 2022 · 8 min · jiezi

关于tcp:面试突击为什么-TCP-需要-3-次握手

TCP 三次握手是一道经典的面试题,它是指 TCP 在传递数据之前,须要进行 3 次交互能力正式建设起连贯,并进行数据传递。TCP 之所以须要 3 次握手是因为 TCP 单方都是全双工的。所谓全双工指的是,TCP 任何一端既是发送数据方,又是接收数据方,因而这就要求 TCP 通信单方既要保障本人的发送能力,又要保障本人的接管能力才行。这就如同打电话时,通信单方都要保障本人能话筒(传递声音)和耳机(接管声音)都是失常的才行,这样能力进行无效的交换,通常打电话时,都是这样结尾的: 我:喂,能听到我谈话吗?对方:能听到你谈话,你能听到我谈话吗?我:能听到你谈话,那咱们就来聊闲事吧。TCP 三次握手也是雷同的情理,3 次握手证实的能力详情如下: TCP 三次握手流程TCP 三次握手流程如下: 客户端发送 SYN 给服务器端,示意心愿建设连贯;服务器端接管到音讯之后,回应一个 SYN 和 ACK(确认应答)给客户端;客户端收到服务器端的 SYN 报文之后,回应一个 ACK 报文。具体执行流程如下图所示: 总结TCP 之所以须要 3 次握手,是因为 TCP 通信单方都是全双工的,所以要通过 3 次交互能力确认单方的发送能力和接管能力,并且 TCP 握手必须是 3 次,如果是 2 次握手,不能证实服务器端的发送能力和客户端的接管能力;也不能是 4 次握手,因为 3 次曾经能证实的事件,再交互握手 1 次齐全没有必要。

July 25, 2022 · 1 min · jiezi

关于tcp:科普达人丨漫画图解什么是eRDMA

在一个当先的阿里云数据中心里,数百台服务器(也就是大型的计算机)在疯狂工作和通信,他们正在合力实现一个大型的大数据处理工作,每台服务器领到本人的小工作,算完之后,得把后果互相同步,再计算下一步。 每一台服务器外面也有一个小团队,CPU、内存、网卡,都有着本人的分工。 然而这个看似完满的零碎,如同呈现了一些不谐和。服务器小C的工作得特地慢,就像木桶的短板个别拖慢了团队的速度,这引起了服务器小A的好奇。 在小C的世界中(应用通用的TCP/IP协定):数据从一台服务器,传到另一台服务器的时候,都是通过内存传到CPU,CPU实现打包之后,给网卡转发进来,对方再拆包。 RDMA技术是一种网络减速技术,它将数据间接从一台计算机的内存传输到另一台计算机。这实现了高吞吐、低提早的网络通信,尤其适宜在大规模并行计算机集群中应用。因为用了不同的传输协定,RDMA须要专用的网卡和交换机等低廉的设施。 说完了这些,小A一回头,发现小C早已没了踪影,小A想,可能小C去找它的神龙架构去了吧…… 终于,整个数据中心,都迈入了eRDMA新时代。 报名大赛,体验“神龙架构eRDMA”的大规模减速能力看到了下面的“漫画”,是不是对“eRDMA”产生了超强的好奇心呢?收费体验的机会就在你背后。 第二届阿里云 ECS CloudBuild 开发者大赛乘风而来!本届大赛是由阿里云与英特尔主办,阿里云天池平台、弹性计算、神龙计算平台与云平安独特承办的顶级赛事。 赛事秉持“云上开发,高效智能”的理念,为参赛者提供基于英特尔Ice Lake CPU的顶级算力、基于SGX 2.0的当先加密计算能力与神龙架构eRDMA的大规模减速能力,无影架构弱小算力以及一系列云上CloudOps自动化运维套件,让参赛者跟咱们一起摸索平安与性能减速命题,体验云上开发的高效与便捷。 扫描海报中的二维码,即刻报名,近距离体验阿里云相干产品及神龙架构eRDMA的大规模减速能力,亲自感知无处不在的超强算力,更有高达51万的赛事奖金等你获取! (点击图片可放大并扫码报名) 同时在赛事进行期间还有“大赛征稿”环节,将你对阿里云相干产品的应用评测、体验、感触等观点整体成文公布在“开发者社区”,更有机械键盘、便携充电宝等精美好礼等着你! 点击这里 ,立刻报名参赛,更有机会体验“神龙架构eRDMA”的大规模减速能力。 丨流动福利7月4日,云上自动化运维CloudOps系列沙龙 第一弹:可观测才牢靠,行将线上开启,欢送大家预约。

June 30, 2022 · 1 min · jiezi

关于tcp:一台服务器最大并发-tcp-连接数多少65535

首先,问题中形容的65535个连贯指的是客户端连接数的限度。 在tcp利用中,server当时在某个固定端口监听,client被动发动连贯,通过三次握手后建设tcp连贯。那么对单机,其最大并发tcp连接数是多少呢? 如何标识一个TCP连贯在确定最大连接数之前,先来看看零碎如何标识一个tcp连贯。零碎用一个4四元组来惟一标识一个TCP连贯:{localip, localport,remoteip,remoteport} = {本地ip,本地port,近程ip,近程port} client最大tcp连接数client每次发动tcp连贯申请时,除非绑定端口,通常会让零碎选取一个闲暇的本地端口(local port),该端口是独占的,不能和其余tcp连贯共享。tcp端口的数据类型是unsigned short,因而本地端口个数最大只有65536,端口0有非凡含意,不能应用,这样可用端口最多只有65535,所以在全副作为client端的状况下,一个client最大tcp连接数为65535,这些连贯能够连到不同的serverip。 server最大tcp连接数server通常固定在某个本地端口上监听,期待client的连贯申请。不思考地址重用(unix的SO_REUSEADDR选项)的状况下,即便server端有多个ip,本地监听端口也是独占的,因而server端tcp连贯4元组中只有remoteip(也就是clientip)和remote port(客户端port)是可变的,因而最大tcp连贯为客户端ip数×客户端port数,对IPV4,不思考ip地址分类等因素,最大tcp连接数约为2的32次方(ip数)×2的16次方(port数),也就是server端单机最大tcp连接数约为2的48次方。 理论的tcp连接数下面给出的是实践上的单机最大连接数,在理论环境中,受到机器资源、操作系统等的限度,特地是sever端,其最大并发tcp连接数远不能达到实践下限。在unix/linux下限度连接数的次要因素是内存和容许的文件描述符个数(每个tcp连贯都要占用肯定内存,每个socket就是一个文件描述符),另外1024以下的端口通常为保留端口。 所以,对server端,通过减少内存、批改最大文件描述符个数等参数,单机最大并发TCP连接数超过10万,甚至上百万是没问题的。 这显著是进入了思维的误区,65535是指可用的端口总数,并不代表服务器同时只能承受65535个并发连贯。举个例子: 咱们做了一个网站,绑定的是TCP的80端口,后果是所有拜访这个网站的用户都是通过服务器的80端口拜访,而不是其余端口。可见端口是能够复用的。 即便Linux服务器只在80端口侦听服务, 也容许有10万、100万个用户连贯服务器。Linux零碎不会限度连接数至于服务器能不能接受住这么多的连贯,取决于服务器的硬件配置、软件架构及优化。 01咱们晓得两个过程如果须要进行通信最根本的一个前提是:可能惟一的标示一个过程。在本地过程通信中咱们能够应用PID来惟一标示一个过程,但PID只在本地惟一,网络中的两个过程PID抵触几率很大。 这时候就须要另辟它径了,IP地址能够惟一标示主机,而TCP层协定和端口号能够惟一标示主机的一个过程,这样能够利用IP地址+协定+端口号惟一标示网络中的一个过程。 可能惟一标示网络中的过程后,它们就能够利用socket进行通信了。socket(套接字)是在应用层和传输层之间的一个形象层,它把TCP/IP层简单的操作形象为几个简略的接口供应用层调用以实现过程在网络中通信。 socket源自Unix,是一种"关上—读/写—敞开"模式的实现,服务器和客户端各自保护一个"文件",在建设连贯关上后,能够向本人文件写入内容供对方读取或者读取对方内容,通信完结时敞开文件。 02惟一可能确定一个连贯有4个货色: 服务器的IP服务器的Port客户端的IP客户端的Port服务器的IP和Port能够放弃不变,只有客户端的IP和Port彼此不同就能够确定一个连接数。 一个socket是能够建设多个连贯的,一个TCP连贯的标记为一个四元组(source_ip, source_port, destination_ip, destination_port),即(源IP,源端口,目标IP,目标端口)四个元素的组合。只有四个元素的组合中有一个元素不一样,那就能够区别不同的连贯。 举个例子: 你的主机IP地址是1.1.1.1, 在8080端口监听当一个来自 2.2.2.2 发来一条连贯申请,端口为5555。这条连贯的四元组为(1.1.1.1, 8080, 2.2.2.2, 5555)这时2.2.2.2又发来第二条连贯申请,端口为6666。新连贯的四元组为(1.1.1.1, 8080, 2.2.2.2, 6666)那么,你主机的8080端口建设了两条连贯; (2.2.2.2)发来的第三条连贯申请,端口为5555(或6666)。第三条连贯的申请就无奈建设,因为没有方法辨别于下面两条连贯。同理,能够在同一个端口号和IP地址上绑定一个TCP socket和一个UDP socket因为端口号尽管一样,但因为协定不一样,所以端口号是齐全独立的。TCP/UDP个别采纳五元组来定位一个连贯:source_ip, source_port, destination_ip, destination_port, protocol_type即(源IP,源端口,目标IP,目标端口,协定号) 综上所述,服务器的并发数并不是由TCP的65535个端口决定的。服务器同时可能接受的并发数是由带宽、硬件、程序设计等多方面因素决定的。所以也就能了解淘宝、腾讯、头条、百度、新浪、哔哔哔哔等为什么可能接受住每秒种几亿次的并发拜访,是因为他们采纳的是服务器集群。服务器集群散布在全国各地的大型机房,当访问量小的时候会敞开一些服务器,当访问量大的时候会一直地开启新的服务器。 65535从哪来的,干啥的? 要解释好这个问题,就要先说分明65535的含意。在Linux零碎中,如果两个机器要通信,那么相互之间须要建设TCP连贯,为了让单方相互意识,Linux零碎用一个四元组来惟一标识一个TCP连贯:{local ip, local port, remote ip, remote port},即本机IP、本机端口、近程IP、近程端口,IP和端口就相当于小区地址和门牌号,只有拿到这些信息,通信的单方能力相互认知。在Linux零碎中,示意端口号(port)的变量占16位,这就决定了端口号最多有2的16次方个,即65536个,另外端口0有非凡含意不给应用,这样每个服务器最多就有65535个端口可用。因而,65535代表Linux零碎反对的TCP端口号数量,在TCP建设连贯时会应用。 TCP怎么建设连贯,与端口号是什么关系?Linux服务器在交互时,个别有两种身份:客户端或者服务器端。典型的交互场景是:(1)服务器端被动创立监听的socket,并绑定对外服务端口port,而后开始监听(2)客户端想跟服务器端通信时,就开始连贯服务器的端口port(3)服务端承受客户端的申请,而后再生成新的socket(4)服务器和客户端在新的socket里进行通信 能够看到,端口port次要用在服务器和客户端的“握手意识”过程,一旦相互意识了,就会生成新的socket进行通信,这时候port就不再须要了,能够给别的socket通信去应用,所以很显著TCP连贯的数量能够大于TCP端口号的数量65,535。 考虑一下两个极其场景,即某台Linux服务器只作为客户端或者服务器端 (1)Linux服务器只作为客户端 这时候每发动一个TCP申请,零碎就会指定一个闲暇的本地端口给你用,而且是独占式的,不会被别的TCP连贯抢走,这样最多能够建设65535个连贯,每个连贯都与不同的服务器进行交互。这种场景,就是题主所形容的样子,然而因为条件过于刻薄,属于小概率事件,所以更多的还是实践上的可能,事实的环境中简直不会呈现。 (2)Linux服务器只作为服务端 这种场景下,服务端就会固定的监听本地端口port,等着客户端来向它发动申请。为了计算简略,咱们假如服务器端的IP跟端口是多对一的,这样TCP四元组外面就有remote ip和remote port是可变的,因而最大反对创立TCP个数为2的32次方(IP地址是32位的)乘以2的16次方(port是16位的)等于2的48次方。 事实中单台Linux服务器反对的TCP连贯数量通过后面的剖析咱们晓得,在事实场景中,因为存在端口port复用的状况,服务器可同时反对的TCP连接数跟65535没有一一对应关系,事实上,真正影响TCP连贯数量的,是服务器的内存以及容许繁多过程同时关上文件的数量,因为每创立一个TCP连贯都要创立一个socket句柄,每个socket句柄都占用一部分零碎内存,当零碎内存被占用殆尽,容许的TCP并发连接数也就到了下限。一般来讲,通过减少服务器内存、批改最大文件描述符个数等,能够做到单台服务器反对10万+的TCP并发。 ...

June 28, 2022 · 1 min · jiezi

关于tcp:TCP-握手与一些概念

如果你只是在编写 Web 利用,你齐全无需理解三次握手的细节——因为我真的没想到利用场景,如果你晓得,能够通知我。故事要从我第一次编写长连贯利用说起,从 HTTP 下的需要开发,到编写 TCP 长连贯利用,于我而言,假使不了解握手流程,就很难了解: 什么是数据包?如何解析一个包?握手流程里的事件用处?怎么的体现是传输出错?如果呈现传输问题,哪个步骤出了错?该怎么解决?框架有问题,想提个修复 PR,但这个代码正文说 MSS?MTU?我须要反对自有包格局,该怎么写解析、封装?TCP/UDP/HTTP 等理论应用的协定(此处并非指某一层,譬如 HTTP 也是基于 TCP,不是说这个),性能差距差在哪里?etc.如果此时你选用 Socket.IO 或相似的框架,状况还好一些,如果没有必要,你无需关注数据包问题——当数据出现异常时,了解握手有时候会成为解决问题的必须条件。 这就是我对 TCP 握手第一次产生趣味的时刻。 TCP 握手流程SYN:Synchronize;ACK:Acknowledge;FIN:Finished。 发起方接管方意义发送:SYN + A序列号;状态:SYN-SENT 发送:ACK-SYN + A序列号 + B序列号状态:SYN-RCVD接管方确认:接管方可收,发动方可发发送:ACK,状态:Established 发起方确认单方可收发,我方序列号被承受 状态:Established接管方确认单方可收发,我方序列号被承受通信中....通信中.... 发送:FIN 发起方想完结连贯 发送:ACK接管方理解发起方想完结连贯发起方收到 发起方理解接管方已通晓 发送:FIN接管方知晓数据传完,可敞开发送:ACK 发动方知晓数据传完,可敞开 接管方收到,不再维持连贯接管方知晓发起方已通晓连贯可敞开期待 2 个 MSL 工夫...不再维持连贯 发起方需确认最初音讯未丢包,则敞开本身序列号TCP 协定采纳序列号+1的形式,来确认单方通信的有序性。 在很老的 TCP 版本中,该起始序列号是固定的——这导致了轻松的连贯劫持,只须要模仿固定的序列号即可。 不必放心,后续版本已将它降级为随机起始值。且对采纳了 SSL / HTTPS 等平安协定的服务,这种问题简直不存在。 注意安全,仍有其余劫持可能运作,譬如复合了 IP 坑骗或自觉劫持等伎俩后,发动的钓鱼、中间人攻打等劫持形式。 MSL 工夫数据段的最大生命工夫(Maximum segment lifetime),这里有三个重点: 超过此工夫的数据段将被抛弃(数据段或叫报文?)。在 Linux,你能够通过 tcp_fin_timeout 和 tcp_keepalive_time 来调整它。如果你喜爱 Windows Service,能够尝试 How Do I Reduce the Time for Canceling TCP Connections in TIME_WAIT State on Windows1981 年的原始协定规定 MSL = 120s,实际上,Linux 内核将其缩短为 30s——这对于某些利用来说,依然过长了。SYN 泛洪攻打指: ...

June 27, 2022 · 2 min · jiezi

关于tcp:SYN-洪水攻击

SYN 洪水(半开连贯攻打)通过反复发送初始化连贯申请(SYN)数据包,攻击者将占用服务器上的所有可用端口,导致服务器无奈创立新的连贯。工作形式如下: 攻击者通常应用伪造的 IP 地址向指标服务器发送大量 SYN 数据包。服务器别离对每一项连贯申请做出响应,并关上一个可用端口,做好接管响应的筹备。在服务器期待最初一个 ACK 数据包(永远不会达到)的过程中,攻击者将持续发送更多 SYN 数据包。每当有新的 SYN 数据包达到,服务器都会长期关上一个新的端口并在一段特定工夫内放弃连贯;用遍所有可用端口后,服务器将无奈失常运行。在网络中,如果服务器连贯处于关上状态但另一端的机器连贯未关上,则视为半开连贯。因而,SYN 洪水攻打也叫做「半开连贯攻打」。 歹意用户通常采取分布式攻打(DDoS)的形式发动 SYN 洪水攻打。 DDoS,distributed denial-of-service:分布式拒绝服务攻打,攻击者通过管制被恶意软件感化的网络设备来动员攻打。被恶意软件感化的网络设备称为机器人(或僵尸),一组机器人称为僵尸网络。 我置信很多敌人在浏览网站时都会遇到过测验是否是机器人的页面,这里的机器人就是指被歹意管制的计算机了。 攻击者近程管制每一个机器人,发送申请到指标服务器,导致服务器不堪重负,从而造成对失常流量的拒绝服务。因为每个机器人都是失常的互联网设施,因而很难辨别攻打流量和失常流量。 如何缓解 SYN 洪水攻打? 回收最先创立的半开连贯:当半开连贯队列填满后,新的连贯笼罩掉最先创立的连贯。毛病:这有可能导致用户无奈失常连贯到服务器,并且当攻打量小于半开连贯队列的容量时,这种办法会生效。SYN Cookie:服务器不再维持半开连贯状态,发送了 SYN+ACK 数据包后,保留这个初始连贯序号到 Cookie 中,而后从半开队列中删除客户端的 SYN 申请,当客户端发送 ACK 报文后,查看是否非法,非法再重建一个 TCP 连贯。毛病:服务器丢失了重发 SYN+ACK 数据包的能力,可能导致用户无奈连贯到服务器。参考资料: SYN 洪水 DDoS 攻打什么是分布式拒绝服务攻打?

June 13, 2022 · 1 min · jiezi

关于tcp:TCPIPUDP相关知识点梳理

梳理下传输层相干的知识点,前期缓缓更新残缺。仓库地址

June 2, 2022 · 1 min · jiezi

关于tcp:TCP学习笔记二-相识篇

前言很久之后,你开始学习计算机网络,不是为了面试,只是为了解决工作中遇到的问题,在遇到工作中遇到网络问题之前,你的想法是工作中作为一个CRUD仔,网络是通顺的,不要放心网络问题,然而这次碰到的网络问题很让你头疼,为了解决这个问题你用尽了浑身解数,最终问题被解决,这次问题解决之后,你打算彻底学习一下计算机网络。聊一下三次握手吧,我在实习筹备面试题的时候,三次握手和四次握手就是高频面试题,我选择性的放弃了这个经典的面试题,因为大学的时候学的计算机网络并不好,其实刚开始我还是蛮有趣味的,然而前面发现越听越听不懂,索性就开始刷知乎,看数学书,过后听不懂这门课的起因,我想一大部分起因在于过后没有多少代码量,程序是认知计算机世界的桥梁,而后老师显然没有意识到这一点,当然学校也没意识到,其实还有其余课程,也面临这样的问题。然而有的时候工作中会碰到,所以只好花工夫重修,然而也不悔恨大学将工夫奉献给了数学,我很思念那段时光,忽然懂得某一个数学定理,我过后记得花了一个月还是多久才解出了低等代数的一道课后习题,过后开心了很久。 咱们来回顾一下《TCP学习笔记(二) 初遇篇》的内容: TCP是面向连贯的运输层协定,这就是说应用程序在应用TCP协定之前,必须先建设TCP连贯,在数据开释完之后,必须开释曾经建设的TCP连贯。 TCP提供牢靠交付的服务。通过TCP连贯传送的数据。无差错、不失落、不反复,并且按序达到。 为了确保不失落,在报文在网络环境中失落之后,TCP建设了重传机制,在网络拥挤的状况,报文失落的频率比拟高,在这种状况下,进行重传会进一步加深网络拥挤的水平,所以TCP引入了拥塞管制。 TCP提供全双工通信。TCP容许通信单方的利用过程在任何时候都可能发送数据 TCP是面向连贯的协定,连贯能够了解为通信单方之间的一条路线,通过连贯进行运输报文。在TCP中传送报文分为三个阶段: 连贯建设数据传送连贯开释TCP连贯的建设次要是为了解决以下三个问题: 要使得通信的单方可能确知对方的存在要容许单方协商一些参数可能对运输实体资源(缓存大小、连贯表中的我的项目)进行调配。TCP连贯的建设采取客户和服务器模式。被动发动连贯建设的利用过程称之为客户,而被动期待连贯建设的利用过程叫做服务端。我在写TCP的时候想找两个客户端的通信的代码示例,因为Java外面应用TCP协定大抵上有ServerSocket和Socket这两个类,ServerSocket是服务端,Socket是客户端。看到这里才发现人家TCP自身就是客户和服务器模式。 咱们本篇次要讲连贯建设和连贯开释,也就是为宽广程序员耳熟能详的三次握手和四次握手。 连贯建设-三报文握手其实是三报文握手,不是三次握手,其实是一次握手中替换了三个报文,而并不是握了三次手,参见RFC 793(谢希仁的那本教材说是RFC 973,我在百度上找了好久没找到,搜寻RFC 793就找到了,想来是不是作者手滑打错了)。在RFC 793三次握手对应的形容如下: The procedures to establish connections utilize the synchronize (SYN) control flag and involves an exchange of three messages. This exchange has been termed a three-way hand shake [3] 程序在建设连贯应用SYN管制标记并进行三次音讯替换,这种替换也被称之为三报文握手。 教材中认为叫应该三报文握手的起因在于,三次握手从字面上推断为握手握了三次,其实是一次握手替换了三个报文,像是初次见面握手高低摇摆了三次。 我批准这个观点,晚期我看到三次握手就认为是握了三次手,咱们先大抵介绍三报文的握手来领会为什么,客户端和服务端替换三个报文之后就可能确知对方的存在和协商后续的报文传输的相干问题。 TCP建设连贯的过程叫做握手,握手须要在客户和服务器之间替换是三个TCP报文段,为了探讨问题,咱们当初首先要引入两台通信的计算机A和B,A和B的通信过程应用TCP协定,A为客户端,B为服务端。一开始B的服务器过程首先创立运输管制块TCB(Transmission Control Block), 而后服务器过程就开始解决Listen状态,期待客户端的连贯申请。写到这里Java程序员有没有想到Java中的Socket编程,在BIO中也是先new ServerSocket, 而后监听某个端口,而后调用accept办法侦听客户端过程,该办法会阻塞到直到有客户端申请进来,会返回一个Socket对象: public void serverSocketDemo() throws Exception{ // 申明该Socket占用的过程 ServerSocket serverSocket = new ServerSocket(8080); // 监听哪个端口 serverSocket.bind(new InetSocketAddress(9090)); // 开始监听,有客户端申请进来,会返回给一个Socket对象 // Socket中有输入输出流 // 能够用来读写数据 Socket socket = serverSocket.accept(); InputStream inputStream = socket.getInputStream(); OutputStream outPutStream = socket.getOutputStream(); }基本上高级语言Socket编程都是这个步骤,先创立ServerSocket,而后占用端口,只不过侦听办法有的叫accept,有的叫listen,其实都是一样的原理。 ...

May 29, 2022 · 2 min · jiezi

关于tcp:如何判断TCP-socket-接收是否及时

服务中,如果一个socket来往的数据较多,可能存在接管不及时,buffer 满的状态,延时减少;如何判断buffer 状态netstat -nt |grep -E '8101|Recv-Q' 后果中 Recv-Q 即为接收缓冲区以后字节数,如果继续的放弃不变,无奈归零,那么就会存在程序接管不及时的状况;当一个线程(1个CPU) 负责多个socket.recv 时就会存在接管性能问题;程序中,倡议将socket.recv 接管函数,独自应用一个线程,接管与业务解决异步进行如何设置socket 的buffer 大小socket.setsockopt(xx,xx)socket 的默认大小linux 零碎手册的默认值 cat /proc/sys/net/core/rmem_default-cat /proc/sys/net/core/wmem_defaulttcp socket 的默认配置 cat /proc/sys/net/ipv4/tcp_wmemcat /proc/sys/net/ipv4/tcp_rmemtcp 缓冲区的最大值配置 cat /proc/sys/net/core/rmem_max当设置的值超过,这个最大值,那么最终=2倍的最大值

May 11, 2022 · 1 min · jiezi

关于tcp:如何处理SYN

SYN 是 TCP 三次握手的一部分,开发网络应用时通常不会关注,但它与申请中偶发的长时延 (latency spike) 密切相关,是服务器保护环节中不可漠视的重要局部。如果SYN 在发送过程中丢包了,通常客户端会在 1s, 3s, 7s, 15s, 31s 后重,这就是长提早的起源之一。备受游戏公司困扰的 SYN Flood 攻打也是利用了 SYN 的特点。 查看原文 Linux 是如何解决 SYN 的如上面 TCP 状态图 的上局部 所示,当利用 listen() 之后,就能够接管 SYN 并发送SYN+ACK,进入 SYN RECEIVED 状态;期待收到 ACK 之后,进入 ESTABLISHED状态。之后就能够被利用 accept()。 这意味着一个 TCP 连贯的建设过程里,有两个期待: 1 是期待 ACK,2 是期待利用accept()。Linux 应用 2 个队列实现这两次期待, 队列中保留struct inet\_request\_sock 构造。咱们不思考非凡状况,如 TCP\_SAVED\_SYN,TCP\_DEFER\_ACCEPT, TCP\_FAST\_OPEN 。 第一个队列是 SYN queue (也叫未实现队列),当收到 SYN 并返回 SYN+ACK 之后,连贯会保留在这个队列中,并期待 ACK,连贯进入 SYN RECEIVED 状态。期待 ACK超时的话会重传 net.ipv4.tcp_synack_retries 次。因为 SYN Cookie 的存在,这个队列的长度并不非常重要。 ...

May 7, 2022 · 2 min · jiezi

关于tcp:TIMEWAIT-and-Its-Design-Implications

近来产品销量不错,带来的是服务器疯狂告警:TIME_WAIT连贯数量过多。TCP的大抵协定我有理解,但其中的很多细节以及中间状态抓得并不深。因而打算翻译这篇TIME_WAIT and its design implications for protocols and scalable client server,学习的同时思考一下怎么解决服务器上的告警问题。 以下为原文翻译: 在建设应用TCP进行通信的client-server零碎时,很容易因为一些小谬误重大影响零碎的扩展性。其中的一个谬误就是没有思考TIME_WAIT状态。在这篇文章中,我将解释TIME_WAIT状态存在的起因、它可能引发的问题、以及你围绕整个状态应该和不应该做的一些事件。 TIME_WAIT是一个在TCP状态转换图中常常被误会的状态。它标记着一些socket可能进入或停留在了一个绝对长时间的状态中。如果你的服务器有大量的socket处在TIME_WAIT状态,那么就很有可能影响你持续创立新的socket连贯,从而影响你的服务器扩大能力。首先,对于socket如何以及为什么会进入TIME_WAIT状态就常常有一些误会。按理说这不应该,这个状态转换也并不神奇。从上面的TCP状态转换图能够看到,TCP客户端通常最终都会进入TIME_WAIT状态。 只管图中显示TIME_WAIT是client的最终状态,但并不示意肯定是client才会进入TIME_WAIT。在TCP连贯对中,无论是client还是server,谁发动了“active close”,谁就会最终进入TIME_WAIT状态。那么问题来了,“active close”指的是什么呢? 在TCP连贯中,一端发动了“active close”示意由这一端在连贯中先调用了Close()。在很多协定和client/server架构设计中,都是由client触发。但在HTTP和FTP服务器上,发动的通常是server。导致TCP一端进入TIME_WAIT状态的理论过程如下图所示: 当初咱们晓得了socket是如何进入TIME_WAIT状态的。这有助于咱们了解为什么存在这个状态,以及为什么它可能暗藏着潜在问题。 TIME_WAIT状态也常常被称为2MSL wait状态,这是因为socket在转变成TIME_WAIT状态当前,会停留2倍的Maximum Segment Lifetime(MSL)工夫。MSL指的是组成TCP协定的任何数据包在被抛弃前能够在网络中保留的最大工夫。这个工夫限度最终会绑定在传输TCP数据的IP报文里的TTL字段中。在不同实现中,MSL会有不同的取值,而最通常的取值是30s,1分钟或2分钟。RFC 793中将这个值定义为2分钟,Windows零碎也把2分钟设定为默认值,不过能够通过TcpTimedWaitDelay这个注册设置进行调整。 TIME_WAIT状态可能影响零碎扩展性的起因是,一旦一个TCP连贯中的socket被敞开了,它依然会停留在TIME_WAIT状态长达4分钟。如果有大量的连接不断被创立和敞开,那么TIME_WAIT状态的socket就会开始一直累加。你能够用netstat来察看处于TIME_WAIT状态的socket。一台服务器同一时间可能建设的连贯数量是无限的,其中的一个限度就是服务器的本地端口数量。如果有太多连贯处于TIME_WAIT状态,那么你会发现很难再对外建设连贯,因为曾经没有足够的本地端口来反对新连贯。既然有这样的问题,那么为什么还会存在TIME_WAIT状态呢? 设计TIME_WAIT状态有两个起因。第一个就是避免连贯中提早达到的数据包被误认为是后续的新连贯报文。当一个连贯处于2MSL wait状态时,任何后续到达的报文都会被抛弃。 在上图中能够看到从终端1向终端2建设的两个连贯,在各个连贯中它们的地址和端口都是一样的。第一个连贯由终端2发动了“active close”。如果终端2不在TIME_WAIT状态停留足够长的工夫来抛弃前一次连贯中所有后续报文,那么后续到来的报文(带有正当的sequence number)就有可能被认为是一个新的连贯。 请留神,其实这类提早报文触发的问题很难产生。首先它须要连贯中地址和端口都一样,这自身概率就很低,因为应用什么客户端端口是由操作系统从长期端口中抉择的,通常不同连贯会有不同端口。其次,提早报文携带的sequence number也很难凑巧在新连贯中被断定非法。总之,当这两种状况都产生时,TIME_WAIT状态能够阻止新连贯中的数据被提早报文所影响。 TIME_WAIT状态存在的另一个起因是保障TCP全双工连贯中断的可靠性。如果终端2发来的最初一个ACK包丢包了,那么终端1会重发最初一个FIN包。但如果此时终端2上连贯曾经进入了CLOSED状态,那么它只会回一个RST,因为此时收到的FIN包并不在预期内。这就会导致终端1即便正确发送了所有报文,但最初依然收到了一个谬误回复。 可怜的是,不少操作系统对TIME_WAIT状态的实现看起来略显简略。只有那些真正符合条件的socket才须要被阻塞来取得TIME_WAIT状态提供的爱护。须要爱护的是那些可能通过client地址和端口,server地址和端口准确匹配标识进去的连贯。但有些操作系统实现的限度更加严格,那些处于TIME_WAIT状态的连贯应用的本地端口号都不能被复用。如果有足够多的socket进入了TIME_WAIT状态,那么零碎就会因为短少可用的本地端口,而无奈创立新的出站连贯。 Windows操作系统并不会这样做,它只会限度建设那些与TIME_WAIT状态下的已有连贯各属性完全一致的新出站连贯。 入站连贯很少受TIME_WAIT状态的影响,当一个连贯在server的“active close”操作下进入TIME_WAIT状态时,服务器监听的本地端口并不会在一个新的入站连贯中被阻止应用。在Windows操作系统中,server正在监听的TIME_WAIT连贯的出名端口能够被用于组成新的连贯,而如果新连贯中的远端地址和端口恰好与将要复用的这个正处于TIME_WAIT状态的连贯统一,那么这条连贯只承受比TIME_WAIT连贯中最初一个sequence number更大sequence number报文。尽管TIME_WAIT对入站连贯影响比拟小,但一台服务器上的TIME_WAIT连接不断累积会对性能和资源造成影响,因为解决TIME_WAIT过期会须要一些操作,而且连贯在最终完结TIME_WAIT状态进而敞开前,会继续占用系统资源(只管占用的资源不多)。 既然TIME_WAIT状态会因为占用本地端口从而影响服务器创立出站连贯,而创立连贯时应用的本地端口是由操作系统从长期端口范畴中抉择的,那么为了改善这种状况,你能够做的第一件事就是确保你的长期端口范畴足够大。在Windows操作系统中,你能够调节MaxUserPort这个注册表配置。请留神在默认设置下Windows零碎可用的长期端口范畴大略在4000个左右,对很多client/server零碎来说都太小了。 只管能够缩小socket处于TIME_WAIT状态的工夫,但这项操作通常不会有什么帮忙。因为只有大量连贯建设,而后被active close,才会进入TIME_WAIT状态并引发问题,调节2MSL等待时间通常只会容许在一段时间内创立和敞开更多的连贯,所以你须要继续调低2MSL工夫直到TIME_WAIT的爱护性能生效,此时就可能触发提早包在后续连贯中呈现,从而带来问题。当然这种问题只会在几种状况下呈现:你对同一个远端地址和端口建设连贯而且短时间内用尽了所有的本地端口,或者你须要应用一个固定的本地端口对远端同一个地址和端口建设连贯。 批改2MSL工夫通常是一个全局失效的配置,除了批改这个配置你还能够尝试批改SO_REUSEADDR同样在socket层面解决TIME_WAIT。这个选项容许创立一个与已有socket的地址和端口都雷同的socket,新的socket会劫持老的socket。你能够通过容许SO_REUSEADDR来容许应用一个处在TIME_WAIT状态的端口被用来创立新socket,但也须要承当拒绝服务攻打和数据包窃取的危险。在Windows平台中,另一个socket配置SO_EXCLUSIVEADDRUSE能够防止SO_REUSEADDR引起的一些问题。不过在我看来,与其扭转这些配置,不如从新设计零碎来齐全躲避TIME_WAIT问题。 之前图中的TCP状态转换都展现了有序的TCP连贯敞开。然而还有另一种敞开TCP连贯的办法,叫做abort close,也就是发送一个RST包而不是FIN包。这通常能够通过设置SO_LINER这个socket配置为0。这会导致连贯间接应用一个RST来敞开,抛弃期待传输的数据,而不是像失常状态一样传输期待数据并发FIN包完结连贯。须要留神的是一旦连贯被中断,会间接传输一个RST包,连贯中所有的数据都会被抛弃。通常状况下会产生一个error标识“connection has been reset by the peer”。而后对端会晓得连贯被中断,两边都不会进入TIME_WAIT。 当然一个连贯在被RST终止后也会受到TIME_WAIT所爱护的提早报文的影响。不过触发的条件很严苛,简直不可能。如果要防止中断操作后受提早报文影响(比方是由中间设备,像是路由器触发了连贯敞开),就须要TCP两端都进入TIME_WAIT状态。不过这简直不会产生,TCP两端目前都只是简略的敞开了连贯。 你有很多操作能够阻止TIME_WAIT状态引发问题。其中一些操作假如你有能力来扭转你的client和server之间的交互协定。对于大多数自行设计server端的场景都合乎这个条件。 对于一个从来不会被动对外建设连贯的服务器来说,除了维持处在TIME_WAIT状态下的连贯所须要的资源和性能以外,你不须要过分放心。 对于一个既接入连贯,又会对外创立连贯的服务器来说,黄金准则是保障连贯在对端敞开,最好的方法就是无论什么起因,从不发动“active close”。如果对端超时,应用RST中断连贯而不是敞开它。如果对端发送了谬误数据,同样回复RST,等等。如果服务器从不被动发动“active close”,那么连贯就不会进入TIME_WAIT,也就不会受到TIME_WAIT状态带来的问题影响。这种想法下,只管咱们能够很容易晓得谬误产生时该如何解决,但失常的连贯该如何敞开呢?现实的解决办法是在协定中协商由client端发动断开连接。当server认为该当断开连接时,从应用层发一个“连贯完结”的报文,告知client被动敞开连贯。如果在正当工夫内client没有敞开连贯,那么server端就终止连贯。 而在客户端,事件就更加简单。既然必然要有一端须要发动“active close”来终止TCP连贯,那么把TIME_WAIT状态管制在client端会有以下几个益处:首先,会受TIME_WAIT累积从而影响连贯的只会是一个客户端,其它客户端不会受影响。其次,客户端一直对同一个服务器疾速关上敞开TCP连贯是没有意义的,比解决TIME_WAIT问题更有意义的是维持更长时间的连贯。不要设计一个客户端每分钟都会向服务端建设新连贯的协定机制,该当应用一个长连贯设计,只在连贯断开时进行重连。如果两头的路由器回绝放弃连贯,你可能须要实现一个利用层面的心跳包,或者应用TCP keep alive,或者承受路由器一直重置连贯:益处是不会有TIME_WAIT状态的socket累积。如果你在连贯中做的事就是短暂的,那么思考应用连接池设计来保障连贯关上,并复用连贯。最初,如果你就是要让客户端向同一个服务器一直疾速地关上敞开连贯,那么你可能须要设计一个应用层的敞开逻辑,实现敞开逻辑后间接终止连贯(abortive close)。你的客户端发送过一个“I'm done”,而后服务器回一个“goodbye”,而后客户端终止连贯。 TIME_WAIT状态的存在是有情理的,而缩短2MSL工夫或者容许地址复用并不是很好的解决问题的方法。如果你能够设计你的协定来防止TIME_WAIT,那你通常就能完全避免这个问题。 如果你想要理解TIME_WAIT实现上更多的信息,以及它是如何工作的,你能够查看这篇和这篇文章。 ...

May 5, 2022 · 1 min · jiezi

关于tcp:常见的Socket网络异常场景分析

原创:打码日记,欢送分享,转载请保留出处。简介在目前微服务的背景下,网络异样越来越常见了,而有一些网络异样十分含糊,了解什么状况下会导致什么异样,还是有肯定难度的,为此我做了大量试验,来复现各种异样场景。 socket状态变迁图先疾速回顾下失常状况下TCP的交互过程与socket状态变迁,如下: 三次握手客户端调用connect函数,会发SYN包给服务端,客户端状态变为SYN_SENT,服务端收到后变为SYN_RECV,同时回复SYN+ACK包给客户端。客户端收到SYN+ACK包后,变成ESTABLISHED状态,同时回复ACK包给服务端,并且客户端的connect函数执行实现。服务端收到ACK包后,也变成ESTABLISHED状态,至此连贯建设实现。思考:如果第一个SYN包服务端没收到,会怎么样? 客户端会重发SYN包给服务端,服务端收到后会再次发SYN+ACK给客户端。 思考:如果最初一个ACK包没收到,会怎么样? 服务端会重发SYN+ACK包给客户端,客户端收到后会再次发ACK给服务端。 这里能够发现,TCP协定外面,重发都产生在没有收到ACK的场景,纯ACK确认包不会重发。 数据传输客户端调用write函数,发送申请数据,服务端调用read函数,接管申请数据。服务端申请解决完结,服务端调用write函数,返回响应数据,客户端调用read函数,接管响应数据。思考:如果之前三次握手时ACK失落了,但客户端曾经是ESTABLISHED状态了,调用write发数据了,会怎么样? write发的数据包,也是带有ACK标记的,不论与之前的ACK包哪个先到,服务端都会变成ESTABLISHED状态。 而如果ACK与数据包都到不了服务端,一段时间后,服务端SYN_RECV状态的Socket会主动敞开,且不回复任何包给客户端,能够发现这种场景下,客户端认为连贯胜利,而服务端基本就没有连贯。 四次挥手客户端调用close函数,会发送FIN包给服务端,状态变为FIN_WAIT_1,服务端收到后,回复ACK,且状态变为CLOSE_WAIT。客户端收到ACK后,状态变为FIN_WAIT_2状态。服务端调用close函数,也会发送FIN包给客户端,状态变为LAST_ACK,客户端收到后,回复ACK,且状态变为TIME_WAIT。服务端收到ACK后,Socket被操作系统回收,客户端的TIME_WAIT状态Socket在期待2MSL后,也被操作系统回收。思考:如果一个连贯始终没有被应用(如连接池),而超过服务端最大闲暇工夫,服务端被动敞开了连贯,会怎么样? 这时服务端会变成FIN_WAIT_2,这个状态也是有超时工夫的,如果对方始终不发FIN过去,操作系统就会回收掉这个Socket,而客户端会始终是CLOSE_WAIT状态。 所以如果CLOSE_WAIT状态很多,个别是程序漏写了敞开Socket的代码。 从下面的状态变迁图,也能够推断出,绝大多数状况下,SYN_SENT、SYN_RECV、FIN_WAIT_1、LAST_ACK状态应该很少,除非网络很卡,因为这些状态只有一收到了ACK就转变成其它状态了! ok,下面是TCP失常流程,上面以Java网络异样为例,讲讲各种异常情况! 常见网络异样场景连贯超时产生异样:java.net.SocketTimeoutException: connect timed out at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) at java.net.Socket.connect(Socket.java:589)这个异样起因是,客户端connect建设连贯时,服务端始终没收到SYN包,超过了设置的连贯超时工夫后,就会报此异样。 还可能是,服务端收到了SYN包,但SYN+ACK始终发不到客户端,也会报此异样。 连贯回绝产生异样:java.net.ConnectException: Connection refused (Connection refused) at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) at java.net.Socket.connect(Socket.java:589)这个异样起因是,当服务端没有程序监听某个端口时,客户端却又试图connect连贯这个端口就会呈现此异样,其本质是服务端回复了一个RST包。 注:RST包就是TCP协定中用来解决异常情况的,个别接管方收到RST包后,会间接回收Socket资源而不通过四次挥手过程。read读取超时产生异样:java.net.SocketTimeoutException: Read timed out at java.net.SocketInputStream.socketRead0(Native Method) at java.net.SocketInputStream.socketRead(SocketInputStream.java:116) at java.net.SocketInputStream.read(SocketInputStream.java:171) at java.net.SocketInputStream.read(SocketInputStream.java:141)当socket.read()读对端数据时,期待数据超时了,则会报Read timed out读取超时异样。 ...

March 13, 2022 · 2 min · jiezi

关于tcp:不为人知的网络编程十四拔掉网线再插上TCP连接还在吗一文即懂

本文由作者小林coding分享,来自公号“小林coding”,有订正和改变。 1、引言说到TCP协定,对于从事即时通讯/IM这方面利用的开发者们来说,再相熟不过了。随着对TCP了解的越来越深刻,很多曾今碰到过但没工夫深刻探索的TCP技术概念或疑难,当初是时候回头来恶补一下了。 本篇文章,咱们就从零碎层面深刻地探讨一个乏味的TCP技术问题:拔掉网线后,再插上,本来的这条TCP连贯还在吗?或者说它还“好”吗? 可能有的人会说:网线都被拔掉了,那阐明物理层(也叫实体层)被断开了(对于网络协议分层模型请见《疾速了解网络通信协定(上篇)》),那在物理层之上的传输层理当也会断开,所以本来的 TCP 连贯就不会存在的了。就如同咱们拨打有线电话的时候,如果某一方的电话线被拔了,那么本次通话就彻底断了。 答案真的是这样吗?可能并非你了解的这样哦,一起追随笔者来深入探讨一下。 学习交换: 挪动端IM开发入门文章:《新手入门一篇就够:从零开发挪动端IM》开源IM框架源码:https://github.com/JackJiang2...(本文同步公布于:http://www.52im.net/thread-38...) 2、系列文章本文是系列文章中的第14篇,本系列文章的纲要如下: 《鲜为人知的网络编程(一):浅析TCP协定中的疑难杂症(上篇)》《鲜为人知的网络编程(二):浅析TCP协定中的疑难杂症(下篇)》《鲜为人知的网络编程(三):敞开TCP连贯时为什么会TIME_WAIT、CLOSE_WAIT》《鲜为人知的网络编程(四):深入研究剖析TCP的异样敞开》《鲜为人知的网络编程(五):UDP的连接性和负载平衡》《鲜为人知的网络编程(六):深刻地了解UDP协定并用好它》《鲜为人知的网络编程(七):如何让不牢靠的UDP变的牢靠?》《鲜为人知的网络编程(八):从数据传输层深度解密HTTP》《鲜为人知的网络编程(九):实践联系实际,全方位深刻了解DNS》《鲜为人知的网络编程(十):深刻操作系统,从内核了解网络包的接管过程(Linux篇)》《鲜为人知的网络编程(十一):从底层动手,深度剖析TCP连贯耗时的机密》《鲜为人知的网络编程(十二):彻底搞懂TCP协定层的KeepAlive保活机制》《鲜为人知的网络编程(十三):深刻操作系统,彻底搞懂127.0.0.1本机网络通信》《鲜为人知的网络编程(十四):拔掉网线再插上,TCP连贯还在吗?一文即懂!》(* 本文) 3、比拟抽象的答案3.1 答案引言里咱们说到:有人认为,网线都被拔掉了,那阐明物理层被断开,那么物理层之上的传输层必定也会断开,所以原来的 TCP 连贯天然也就不存在了。(PS:计算机网络分层详解请见《史上最艰深计算机网络分层详解》) 下面这个逻辑是有问题的。 问题在于:谬误的认为拔掉网线这个动作会影响传输层,事实上并不会影响! 实际上:TCP 连贯在 Linux 内核中是一个名为 struct socket 的构造体,该构造体的内容蕴含 TCP 连贯的状态等信息。 所以:当拔掉网线的时候,操作系统并不会变更该构造体的任何内容,所以 TCP 连贯的状态也不会产生扭转。 3.2 试验验证一下我做了个小试验:我用 ssh 终端连贯了我的云服务器,而后我通过断开 wifi 的形式来模仿拔掉网线的场景,此时查看 TCP 连贯的状态没有发生变化,还是处于 ESTABLISHED 状态(如下图所示)。 通过下面试验后果能够验证我的论断:拔掉网线这个动作并不会影响 TCP 连贯的状态。 不过,这个答案还是有点抽象。实际上,咱们应该在更具体的场景中来对待这个问题,答案才更精确一些。 这个具体场景就是: 1)当拔掉网线后,有数据传输时;2)当拔掉网线后,没有数据传输时。 针对下面这两种具体的场景,我来更具体地来剖析一下。咱们持续往下浏览。 4、具体场景1:拔掉网线后,有数据传输时4.1 数据传输过程中,恰好又把网线插回去了如果是客户端被拔掉网线后,服务端向客户端发送的数据报文会得不到任何的响应,在期待肯定时长后,服务端就会触发TCP协定的超时重传机制(详见:《TCP/IP详解 - 第21章·TCP的超时与重传》),然而此时重传并不能失去响应的数据报文。 如果在服务端重传报文的过程中,客户端恰好把网线插回去了,因为拔掉网线并不会扭转客户端的 TCP 连贯状态,并且还是处于 ESTABLISHED 状态,所以这时客户端是能够失常接管服务端发来的数据报文的,而后客户端就会回 ACK 响应报文。 此时:客户端和服务端的 TCP 连贯将仍然存在且工作状态不会受到影响,给应用层的感觉就像什么事件都没有产生。。。 4.2 数据传输过程中,网线始终没有插回去下面这种状况下,如果在服务端TCP协定重传报文的过程中,客户端始终没有将网线插回去,那么服务端超时重传报文的次数达到肯定阈值后,内核就会断定出该 TCP 有问题。而后就会通过 Socket 接口通知应用程序该 TCP 连贯出问题了,于是服务端的 TCP 连贯就会断开。 ...

March 9, 2022 · 2 min · jiezi

关于tcp:一条HTTP请求的生命周期二-TCP-本文基于-RFC

《网络是怎么连贯的》的第二章介绍了操作系统中的协定栈和网卡是如何将应用程序的音讯发给服务器的: 解创立套接字连贯服务器收发数据从服务器断开连接并删除套接字IP与以太网的包收发操作用UDP收发数据的操作其中波及到很多的概念:TCP IP 以太网 UDP 本文基于rfc793 及其后续修订版。 TCP0.附录(根本在百度百科上搜的)主机到主机 host-to-host:对应OSI七层模型的传输层。分组替换 packet switching:通信单方以分组为单位、应用存储-转发机制实现数据交互的通信形式。也称包交换,将用户通信的数据划分成多个更小的等长数据段。例如:TCP的存储-转发,TCP有一个收发缓冲区,将数据组装成网络包发送。鲁棒性 robust:强壮和强健的意思,在异样和危险状况下零碎不奔溃、不死机的能力。拥塞 congestion:拥塞是指达到通信子网中分组数量过多来不及解决,以至引起这部分乃至整个网络性能降落的景象,重大时甚至会导致网络通信业务陷入进展。类比交通阻塞。面向连贯:connection-oriented,具备以下特色:建设一条虚电路(比方3次握手),排序(序号),确认(ACK),流量管制。端到端:end-to-end,端到端是网络连接。网络要通信,无论两头有多少机器,只有在中间(源和目标)建设连贯即端对端连贯。分层构造:下层调用上层,上层对下层无所不知。例如网络七层模型多网络:也称多重网络,应用多种通信媒体的网络群组。通信媒体:也称传输媒介,可分为有线(光纤,双绞线,同轴电缆)和无线硬线连贯:??查不到材料电路替换:次要利用于电话通信。1.简介高牢靠、主机到主机协定,用于分组替换计算机通信网络。本文介绍程序实现TCP,用户和程序调用TCP服务接口时,TCP协定提供哪些性能。 1.1 目标为解决军事通信网络的可靠性和可用性而生,同时实用于政府和民间网络通信。关注计算机通信零碎不牢靠时的鲁棒性和拥塞时的可用性。 TCP面向连贯、端到端的高牢靠协定。实用于分层构造协定且反对多网络应用程序。TCP假如上层协定是不牢靠的。原则上适用范围从硬线连贯到分组替换或电路替换网络 Protocol Layering +---------------------+ | higher-level | +---------------------+ | TCP | +---------------------+ | internet protocol | +---------------------+ |communication network| +---------------------+1.2 范畴用于多重网络环境下过程间牢靠通信服务。 1.3 对于文档形容了 TCP服务之间,以及TCP与高层次协定交互的标准。残余章节简洁了协定的接口和操作章节二:总结了TCP设计的哲学根底章节三:提供了TCP在各种事件产生时(新段的达到、用户调用、谬误等)所须要的动作的详细描述,以及TCP段格局的详细信息。 1.4 接口

January 25, 2022 · 1 min · jiezi

关于tcp:TCP流量控制

前言TCP为了保障牢靠传输,应用了确认机制:发送方每发送一个数据段,接管方都要确认应答(ACK),如果发送方在指定工夫内没有收到ACK,则须要重传数据。 TCP晚期应用的是send-wait-send的模式,发送方在发送数据之后,启动一个计时器,而后期待接管方的ACK,收到ACK后发送下一个数据段,如果计时器到期之后,还没有收到ACK,则重传数据。具体实现为Positive Acknowledgment With Retransmission(PAR)。 这种模式就像回合制聊天一样,你一句我一句,如果你说完一句,而我没能及时回复你,那你就得等着我,在回复你之后,你能力说下一句。这种一问一答的形式效率太低,既然每次一个段的形式效率低,那就改为能够一次发送多个段,也就是不用等待ACK就发送下一个包?一问一答: 一边发送一边等回复: 这种形式也有问题: 如果保障程序性,即发送方先发送数据包A,再发送数据包B,然而数据包B先达到,数据包A晚达到或者失落。如果接受方可能会接管不过去,就像咱们从一个水桶里将水全副灌到另一个水桶里,接管的桶可能比拟小而导致水溢出。那么TCP是如何解决的呢? 先看看TCP协定: 累计确认TCP 为了保障程序性,每个包都有一个序号SEQ。这建设连贯的时候,会约定起始SEQ的值,而后依照SEQ递增发送。为了保障不丢包,对于发送的段都要进行应答。然而应答不是一个一个来的,而是会应答某个SEQ+1(即接管方冀望对收到的下一个包的序号),示意SEQ及之前的数据都收到了,这种模式称为累计确认。例如下图中重传了SEQ=7之后,ACK的是8+1:再如下图,绝对于SEQ=5的数据,接管方比拟迟收到SEQ=4数据,然而在收到之后,ACK的是5+1:累计确认是一种批量确认的机制,以缩小确认包的数据。 滑动窗口先看一张滑动窗口动静效果图:为了能反对发送多个数据,无需期待确认应答,TCP引入了窗口概念,窗口实际上是操作系统开拓的一个缓存空间。TCP是双工的协定,会话的单方都能够同时接管、发送数据,TCP会话的单方都各自保护一个“发送窗口”和一个“接管窗口”。发送方在等到确认应答返回之前,必须在缓冲区中保留已发送的数据。如果按期收到确认应答,此时数据就能够从缓存区革除。如果窗口大小为3个TCP段,则发送方能够间断发送3个TCP段。对于接收端来讲,为了确保这个接管缓存不能溢出,接收端在回复ACK时,告知本身缓存的可用空间有多大。于是发送端就能够依据这个接收端的解决能力来发送数据,而不会导致接收端解决不过去。 发送端和接收端别离用缓存来记录所有发送的包和接管的包,缓存里是依照包的SEQ 一个个排列。为了阐明滑动窗口,咱们须要先看一下TCP缓冲区的一些数据结构: 发送端: LastByteAcked:指向了被接收端Ack过的地位。LastByteSent:示意收回去了,但还没有收到胜利确认的Ack。LastByteWritten:指向的是下层利用正在写的中央。接收端: LastByteRead:指向了TCP缓冲区中读到的地位.NextByteExpected:指向的中央是收到的间断包的最初一个地位。LastByteRcved:指向的是收到的包的最初一个地位,咱们能够看到两头有些数据还没有达到,所以有数据空白区。接收端在给发送端回ACK中会汇报本人的残余可用窗口 = MaxRcvBuffer(最大缓冲量) – LastByteRcvd – 1,而发送方会依据这个窗口来管制发送数据的大小,以保障接管方能够解决。 以下内容来自30张图解: TCP 重传、滑动窗口、流量管制、拥塞管制发愁对于发送方来说,发送窗口总体分为两局部,别离是曾经发送的局部(曾经发送了,然而没有收到 ACK)和可用窗口,接收端容许发送然而没有发送的那局部称为可用窗口。 SND.WND:示意发送窗口的大小(大小是由接管方指定的);SND.UNA:是一个相对指针,它指向的是已发送但未收到确认的第一个字节的序列号,也就是 #2 的第一个字节。SND.NXT:也是一个相对指针,它指向未发送但可发送范畴的第一个字节的序列号,也就是 #3 的第一个字节。指向 #4 的第一个字节是个绝对指针,它须要 SND.UNA 指针加上 SND.WND 大小的偏移量,就能够指向 #4 的第一个字节了。可用窗口大小的计算就能够是:可用窗口大小 = SND.WND -(SND.NXT - SND.UNA) 接管方的窗口,不须要期待 ACK,所以绝对发送方简略一些,依据解决的状况划分成三个局部: RCV.WND:示意接管窗口的大小,它会通告给发送方。RCV.NXT:是一个指针,它指向冀望从发送方发送来的下一个数据字节的序列号,也就是 #3 的第一个字节。指向 #4 的第一个字节是个绝对指针,它须要 RCV.NXT 指针加上 RCV.WND 大小的偏移量,就能够指向 #4 的第一个字节了。窗口滑动上面咱们来看一下发送方的滑动窗口示意图,依据解决的状况分成四个局部,其中深蓝色方框是发送窗口,紫色方框是可用窗口。 在下图,当发送方把数据全副都一下发送进来后,可用窗口的大小就为0了,表明可用窗口耗尽,在没收到 ACK 确认之前是无奈持续发送数据了。在下图,当收到之前发送的数据32~36字节的 ACK 确认应答后,如果发送窗口的大小没有变动,则滑动窗口往右边挪动5个字节,因为有5个字节的数据被应答确认,接下来52~56字节又变成了可用窗口,那么后续也就能够发送52~56这5个字节的数据了。 那么窗口的大小是多少呢?最大值:从下面的TCP协定里,能够看到TCP头里有一个字段叫Window,又叫Advertised-Window,是一个16bit位字段,它代表的是窗口的字节容量,也就是TCP的规范窗口最大为2^16-1=65535个字节,另外在TCP的选项(option)字段中还蕴含了一个TCP窗口扩充因子scaling window,可把原来16bit的窗口,扩充为32bit,然而如果对方没有此option,则阐明对方不反对。默认值:由接管方提供的窗口的大小通常能够由接管过程管制,这将影响 T C P的性能。4 . 2 B S D默认设置发送和承受缓冲区的大小为2 0 4 8个字节。在4 . 3 B S D中单方被减少为4 0 9 6个字节。正如咱们在本书中迄今为止所看到的例子一样, SunOS 4.1.3、B S D / 3 8 6和S V R 4依然应用4 0 9 6字节的默认大小。其余的零碎,如Solaris 2.2、4 . 4 B S D和AIX3.2则应用更大的默认缓存大小,如8192或16384等。(以上内容来自TCPIP详解)发送发窗口大小由两个因素决定: ...

December 29, 2021 · 2 min · jiezi

关于tcp:TCPSocketHTTP

TCPTCP协定是传输层协定 三次握手在TCP协定中,TCP协定通过三次握手建设一个牢靠的连贯 Step 1 (SYN):客户端想要与服务器建设连贯,所以发送一个带SYN(同步序列号)的段,它告诉服务器客户端可能开始通信以及它以什么序列号开始段Step 2(SYN + ACK):服务器响应客户端申请并设置 SYN-ACK 信号位。ACK示意它收到的段的响应,SYN示意它可能以什么序列号开始段Step 3 (ACK):客户端确认服务器响应,并且它们都建设了牢靠的连贯,通过该连贯开始理论的数据传输四次挥手 Step1:客户端发送FIN字段,并蕴含一个心愿接受者看到的本人以后的序列号K,同时蕴含一个ACK示意确认对方最近顺次发过来的数据Step2:服务端将K加1作为ACK序列号,示意收到上一个包。这时下层的应用程序会被告知另一端发动敞开操作Step3:服务端发送本人的FIN段,ACK=K+1,Seq=LStep4:客户段确认,ACK=L+1Socketsocket是传输层和应用层 HTTPHTTP为网络层协定,是基于TCP/IP通信协议来传递数据的。 特点简略疾速:客户端向服务器发动申请时,只需传送申请形式和门路。申请形式有GET、POST等等。灵便:HTTP容许传输任意类型的数据对象,以Content-Type标记传输类型无连贯:无连贯含意是限度每次连贯解决一个申请,服务器解决客户端申请,并收到客户端应答后,即断开连接。无状态:无状态即协定对事务处理没有记忆性能,短少状态意味着如果后续解决须要后面的信息,则它必须重传,这样可能导致每次连贯传送的数据量增大。如果服务器不须要先前信息时它应答的很快。

December 5, 2021 · 1 min · jiezi

关于tcp:TCP-Keepalive与gorpc的tcp连接

TCP Keepalivetcp连贯被形象为一个socket,socket上增加了SO_KEEPALIVE后,该socket便能够启用keepalive。 keepalive的连贯为长连贯,这样client向server交互时不必每次都新建连贯,用长连贯进行继续的数据读取和写入即可。 keepalive的连贯须要定期进行探测,当client不再沉闷时,server端及时的开释该连贯。 tcp keepalive的参数: tcp_keepalive_time: 单位s,默认7200 client与server多久没有数据交互,就认为connection idle,而后开始发动探测。tcp_keepalive_intvl: 单位s,默认75 一次探测结束后,期待多久进行下一次探测。tcp_keepalive_probes:单位次数,默认9 最大探测次数,某个连贯通过N次探测后依然不沉闷将被开释。默认状况下: 2个小时(7200s)(tcp_keepalive_time)没有数据交互,就认为connection idle;而后发动keep-alive音讯,探测client是否存活;每隔tcp_keepalive_intvl(75s)发动一次探测,探测tcp_keepalive_probes(9)次后,将彻底kill连贯;总结来说,1个tcp连贯,要等:7200+75*9=2hour11min后,才被kill掉; 个别生产环境都会配置下面的3个参数,目录/proc/sys/net/ipv4/下: //tcp_keepalive_time 参数/proc/sys/net/ipv4 # cat tcp_keepalive_time90//tcp_keeplive_intv 参数/proc/sys/net/ipv4# cat tcp_keepalive_intvl15//tcp_keepalive_probes参数/proc/sys/net/ipv4# cat tcp_keepalive_probes2当程序中socket未配置keep-alive参数时,就应用零碎上配置的参数。 Keepalive: TCP VS HTTPHttp的keepalive用于连贯复用,在同一个连贯上request-response。 Tcp的keepalive用于保活、心跳。 go-rpc的TCP Keepalivego-rpc是golang自带的rpc框架,server端的代码: func StartRpc() { tcpAddr, err := net.ResolveTCPAddr("tcp", addr) if err != nil { log.Fatalln("addr err:", err) } listener, err := net.ListenTCP("tcp", tcpAddr) if err != nil { log.Fatalln("listen err:", err) } server := rpc.NewServer() server.Register(new(Transfer)) for { conn, err := listener.AcceptTCP() if err != nil { log.Println("accept err:", err) continue } log.Println("accept tcp from:", conn.RemoteAddr()) go server.ServeCodec(jsonrpc.NewServerCodec(conn)) }}服务端接管1个connection,而后启动1个goroutine解决该连贯上的request: ...

October 31, 2021 · 2 min · jiezi

关于tcp:计算机网络-TCP-协议总结

TCP 相干常识TCP/IP 协定占据了互联网通信的一大半江山,特地像 TCP 这种保障端到端的牢靠传输更是相当重要,对于它的实现也很简单,明天介绍下对于 TCP 的相干重要常识。 咱们先来看下 TCP 的头格局: 咱们看到有一个源端口、目标端口,这 2 个元素再加上 IP 层的源地址和目标地址,就能够用来示意 TCP 的某个连贯了,相当于数据库里的惟一标识。所以当咱们发动一个 TCP 连贯时,会发现如果存在雷同的端口在运行时,操作系统是不容许的,只有这样能力保障惟一连贯的存在,防止数据接管凌乱。 在上图中,咱们会看到以下几个元素,它们是 TCP 协定对几个重要问题的保障: 序列号(seq):数据包的序号,通过序号来确认包的连续性,解决包的乱序问题。响应号(ack):针对下面字段的确认序号,比方服务器接管到客户端的申请,外面蕴含了 seq 序号,此时服务器响应回去时,会进行 ack = seq + 1 的字段设置,示意已接管到的累积数据。Window:滑动窗口应用,用来反馈接管方接下来能解决的包大小,避免单方对数据包的解决能力不对等,次要解决了流控问题。TCP Flag:TCP 包的类型,用来辅助 TCP 的阶段解决,比方 SYN 示意建设连贯,FIN 示意敞开连贯。TCP 状态流转协定之所以会存在,就在于单方须要互相配合合作,以确定哪个阶段该做哪些事件。在 TCP 协定总体划分为建设连贯、数据传输、连贯断开这三个过程。这些阶段将会波及对应状态的流转: (图片地址) TCP 的三次握手、四次挥手而在下面的状态流转中,最重要,也是常常会提起的对于连贯建设的三次握手以及连贯断开的四次挥手。 从下面的流程图中,咱们会发现对于 Client 端来讲,经验了一个申请-确认过程;对于 Server 端来讲,也经验了一个申请-确认过程。这就相当于单方都曾经相互确认过眼神了。所以,三次握手对于连贯的建设是刚刚好的。 如果咱们只进行 2 次握手就建设连贯,那么对于 Server 端来讲太容易建设起连贯了,根本是有客户端过去,那么 Server 就要建设起连贯了。这种状况就会导致连贯老本太低,Server 端很容超负载。 至于在敞开连贯时须要四次挥手,次要是因为 TCP 是全双工的,存在了两个方向的数据发送与接管,所以须要在两个方向都进行敞开流程。否则一方敞开了,另一方还在傻傻期待,只能期待异样超时完结了。 TIME_WAIT在四次挥手中,有一个状态是 TIME_WAIT,它是被动敞开者在最初会进行的动作,是一个定时设置,在 2*MSL(MSL 示意一个包在网络环境中的生存工夫,个别为 2 分钟, Linux 里为 30s)工夫过后就会真正的 CLOSED。 ...

October 26, 2021 · 2 min · jiezi

关于tcp:玩转TCP

前言最近在拉勾教育学习计算机网络相干常识,明天先来学习下TCP。 注释什么是TCPTCP(Transport Control Protocol)是一个传输层协定,提供 Host-To-Host 数据的牢靠传输,反对全双工,是一个连贯导向的协定。 TCP 的握手和挥手TCP 是一个连贯导向的协定,设计有建设连贯(握手)和断开连接(挥手)的过程。 TCP 协定有这样几个基本操作: 一个 Host 被动向另一个 Host 发动连贯,称为 SYN(Synchronization),申请同步;一个 Host 被动断开申请,称为 FIN(Finish),申请实现;一个 Host 给另一个 Host 发送数据,称为 PSH(Push),数据推送。以上 3 种状况,接管方收到数据后,都须要给发送方一个 ACK(Acknowledgement)响应。申请/响应的模型是可靠性的要求,如果一个申请没有响应,发送方可能会认为本人须要重发这个申请。 建设连贯的过程(三次握手)因为要放弃连贯和可靠性束缚,TCP 协定要保障每一条收回的数据必须给返回,返回数据叫作 ACK(也就是响应)。 依照这个思路,你能够看看建设连贯是不是须要 3 次握手: 客户端发消息给服务端(SYN)服务端筹备好进行连贯服务端针对客户端的 SYN 给一个 ACK你能够能会问,到这里不就能够了吗?2 次握手就足够了。但其实不是,因为服务端还没有确定客户端是否筹备好了。比方步骤 3 之后,服务端马上给客户端发送数据,这个时候客户端可能还没有筹备好接收数据。因而还须要减少一个过程。 接下来还会产生以下操作: 服务端发送一个 SYN 给客户端客户端准备就绪客户端给服务端发送一个 ACK你可能会问,下面不是 6 个步骤吗? 怎么是 3 次握手呢?上面咱们一起剖析一下其中原因。 步骤 1 是 1 次握手; 步骤 2 是服务端的筹备,不是数据传输,因而不算握手; 步骤 3 和步骤 4,因为是同时产生的,能够合并成一个 SYN-ACK 响应,作为一条数据传递给客户端,因而是第 2 次握手; 步骤 5 不算握手; ...

October 13, 2021 · 2 min · jiezi

关于tcp:被面试官问懵TCP-四次挥手收到乱序的-FIN-包会如何处理

摘要:收到个读者的问题,他在面试的时候,被搞懵了,因为面试官问了他这么一个网络问题。本文分享自华为云社区《TCP 四次挥手收到乱序的 FIN 包会如何解决?》,作者:小林coding 。 收到个读者的问题,他在面试的时候,被搞懵了,因为面试官问了他这么一个网络问题: 不过这道网络题可能是发问的读者表述有问题,因为如果 FIN 报文比数据包先到达客户端,此时 FIN 报文其实是一个乱序的报文,此时客户端的 TCP 连贯并不会从 FIN_WAIT_2 状态转换到 TIME_WAIT 状态。 因而,咱们要关注到点是看「在 FIN_WAIT_2 状态下,是如何解决收到的乱序到 FIN 报文,而后 TCP 连贯又是什么时候才进入到 TIME_WAIT 状态?」。 我这里先间接说论断: 在 FIN_WAIT_2 状态时,如果收到乱序的 FIN 报文,那么就被会退出到「乱序队列」,并不会进入到 TIME_WAIT 状态。 等再次收到后面被网络提早的数据包时,会判断乱序队列有没有数据,而后会检测乱序队列中是否有可用的数据,如果能在乱序队列中找到与以后报文的序列号放弃的程序的报文,就会看该报文是否有 FIN 标记,如果发现有 FIN 标记,这时才会进入 TIME_WAIT 状态。 我也画了一张图,大家能够联合着图来了解。 TCP 源码剖析接下来,我带大家看看源码,听到要源码剖析,可能有的同学就怂了。 其实要剖析咱们明天这个问题,只有懂 if else 就行了,我也会用中文来表述代码的逻辑,所以单纯看我的文字也是能够的。 这次咱们重点剖析的是,在 FIN_WAIT_2 状态下,收到 FIN 报文是如何解决的。 在 Linux 内核里,当 IP 层解决完音讯后,会通过回调 tcp_v4_rcv 函数将音讯转给 TCP 层,所以这个函数就是 TCP 层收到音讯的入口。 处于 FIN_WAIT_2 状态下的客户端,在收到服务端的报文后,最终会调用 tcp_v4_do_rcv 函数。 接下来,tcp_v4_do_rcv 办法会调用 tcp_rcv_state_process,在这里会依据 TCP 状态做对应的解决,这里咱们只关注 FIN_WAIT_2 状态。 ...

September 10, 2021 · 1 min · jiezi

关于tcp:这个-TCP-问题你得懂Cannot-assign-requested-address

原文链接: 这个 TCP 问题你得懂:Cannot assign requested address 微信群里一阵动乱,响声震天。 我心想,尽管是周五,并且到了上班点,但也不至于这么兴奋吧。 关上微信一看,心凉半截,全是报零碎 403 谬误的音讯。别说上班了,怕是老板会让我永远上班吧。 别慌,在长期的团队合作训练中,我明确了一个情理:稳住咱们能赢。 冷静下来之后,我仔细分析了一下问题的起因。 403 阐明权限有余,也就是说咱们的子系统到鉴权核心拉取权限失败了。间接登录到子系统服务器,手动执行拉取权限程序,确实是拉不到。 我的揣测没有问题,难道网络不通了?telnet 指标端口试试,而后 Linux 给我返回了这个错误信息: Cannot assign requested address起因产生这个谬误的起因是因为 Linux 调配的客户端连贯端口用尽,无奈建设 socket 连贯导致的。 咱们都晓得,建设一个连贯须要四个局部:指标 IP,指标端口,客户端 IP 和客户端端口。其中前三项是不变的,只有客户端端口一直变动。 那么在大量频繁建设连贯时,而端口又不是立刻开释,默认是 60s,就会呈现客户端端口不够用的状况。 这就是这个问题的实质。 接下来应用两个命令来验证一下: 查看连接数: # netstat -ae | wc -l# netstat -ae | grep TIME_WAIT | wc -l查看可用端口范畴: # sysctl -a | grep port_rangenet.ipv4.ip_local_port_range = 50000 65000后果就是连接数是远大于可用端口数的。 解决怎么解决呢?有两个计划: 调低 TIME_WAIT 工夫调高可用端口范畴调低 TIME_WAIT 工夫编辑内核文件 /etc/sysctl.conf,减少以下内容: // 示意开启 SYN Cookies。当呈现 SYN 期待队列溢出时,启用 cookies 来解决,// 可防备大量 SYN 攻打,默认为 0,示意敞开;net.ipv4.tcp_syncookies = 1 // 示意开启重用。容许将 TIME-WAIT sockets 从新用于新的 TCP 连贯,默认为 0,示意敞开;net.ipv4.tcp_tw_reuse = 1 // 示意开启 TCP 连贯中 TIME-WAIT sockets 的疾速回收,默认为 0,示意敞开。net.ipv4.tcp_tw_recycle = 1 // 批改系默认的 TIMEOUT 工夫,默认为 60s net.ipv4.tcp_fin_timeout = 30调高可用端口范畴编辑内核文件 /etc/sysctl.conf,减少以下内容: ...

September 7, 2021 · 1 min · jiezi

关于tcp:TCP之拥塞窗口

关注公众号:高性能架构摸索。后盾回复【材料】,能够收费支付学过网络相干课程的,都晓得TCP中,有两个窗口: 滑动窗口(在咱们的上一篇文章中有讲),接管方通过通告发送方本人的能够承受缓冲区大小(这个字段越大阐明网络吞吐量越高),从而管制发送方的发送速度。拥塞窗口,也就是本文要讲的。概念一个连贯的TCP双端只是网络最边缘的两台主机,他们不晓得整个网络是如何工作的,因而他们不晓得彼此之间的无效吞吐量。因而,他们必须找到一种办法来确定它。咱们称之为拥塞窗口 (CWND)。这是在咱们必须进行并期待确认之前能够发送的字节数。 拥塞窗口是决定任何时候能够收回的字节数的因素之一。拥塞窗口由发送方保护,是阻止发送方和接管方之间的链路因流量过多而过载的一种伎俩。这不应与发送方保护的滑动窗口相混同,滑动窗口的存在是为了避免接管方过载。拥塞窗口是通过预计链路上有多少拥塞来计算的。拥塞窗口对于设施来说是本地的,并且永远不会在连贯上共享,这与在每个段中发送的接收器窗口不同。在任何给定工夫,设施最多能够发送由接收器窗口和拥塞窗口之间的最小值指定的字节数,如上面的公式所示: transmittable bytes = min(cwnd, rwnd)这意味着如果拥塞窗口小于接管窗口,则设施能够在期待确认之前传输多达拥塞窗口中定义的字节数。相同,如果接管窗口小于拥塞窗口,则设施能够在期待确认之前最多传输接收器窗口中定义的字节数。 拥塞窗口依据网络拥塞动态变化。每次未确认段时,都假设是因为网络拥塞。拥塞窗口随工夫演变的形式被定义为一个算法,这取决于实现。咱们当初将介绍最常见的一种。该算法遵循以下规定: 拥塞窗口从一个段的大小开始(大概 1KB)定义了一个拥塞窗口阈值(ssthresh)如果收到确认,并且以后拥塞窗口大小小于 ssthresh,则拥塞窗口加倍如果收到确认,但拥塞窗口大于或等于 sshthresh,则拥塞窗口减少其初始值(例如 1KB)如果一个段没有被确认从而触发重传,拥塞窗口就会减半并且 ssthresh 被搁置在这个值拥塞窗口不能大于接收器窗口该规定中包含咱们常常听过的几种算法: 慢启动(slow-start)拥塞防止(congestion avoidance)疾速重传(fast retransmit)疾速复原(fast recovery)算法通过上面的图片,能够不便大家更加疾速的了解拥塞窗口的算法机制。 从上图中能够看出,每个设施都会跟踪本人的拥塞窗口(CWND,绿色)和对端的接收器窗口 (RWND)。 慢启动当主机开始发送数据时,如果立刻所大量数据字节注入到网络,那么就有可能引起网络拥塞,因为当初并不分明网络的负荷状况。因而,较好的办法是先探测一下,即由小到大逐步增大发送窗口,也就是说,由小到大逐步增大拥塞窗口数值。通常在刚刚开始发送报文段时,先把拥塞窗口 cwnd 设置为一个最大报文段MSS的数值。而在每收到一个对新的报文段的确认后,把拥塞窗口减少至少一个MSS的数值。用这样的办法逐渐增大发送方的拥塞窗口 cwnd ,能够使分组注入到网络的速率更加正当。 每通过一个传输轮次,拥塞窗口 cwnd 就加倍。一个传输轮次所经验的工夫其实就是往返工夫RTT。不过“传输轮次”更加强调:把拥塞窗口cwnd所容许发送的报文段都间断发送进来,并收到了对已发送的最初一个字节的确认。 另,慢开始的“慢”并不是指cwnd的增长速率慢,而是指在TCP开始发送报文段时先设置cwnd=1,使得发送方在开始时只发送一个报文段(目标是试探一下网络的拥塞状况),而后再逐步增大cwnd。 上面,咱们从示例图着手,来剖析慢启动的过程。 在协商连贯时,两个设施替换它们的接收器窗口(在这种状况下它们都有 32KB)双端都以 1KB 的拥塞窗口开始,但因为在该示例中客户端将是惟一发送数据的客户端,因而它将是惟一一个显着应用此值的客户端。在第 2 行,客户端收到一个 ACK并将其 CWND 加倍(当初是 2k)服务器在第 3 行收到一个ACK时也做同样的事件客户端发送两段 1k 的数据,它们稍后在第 6 行和第 7 行确认,其中客户端上的拥塞窗口加倍(4k,而后是 8k)而后,客户端再次发送 1k 数据并立刻失去确认,无效地再次将拥塞窗口加倍(当初第 9 行为 16k)。这在第 10-11 行反复,其中 CWND 达到 32k。此时,除非接收端窗口也增长,否则拥塞窗口不能再增长。慢启动的整个过程如下: 初始化 cwnd = 1通过1个RTT,即收到一个ACK,cwnd = 2^(1) = 2通过2个RTT, cwnd = 2^(2) = 4通过3个 RTT, cwnd = 2^(3) = 8拥塞防止让拥塞窗口cwnd迟缓地增大,即每通过一个往返工夫RTT就把发送方的拥塞窗口cwnd加1,而不是加倍。这样拥塞窗口cwnd按线性法则迟缓增长,比慢开始算法的拥塞窗口增长速率迟缓得多。 ...

August 31, 2021 · 1 min · jiezi

关于tcp:TCP之send-recv

关注公众号:高性能架构摸索。后盾回复【材料】,能够收费支付 接触过网络开发的人,大抵都晓得,下层利用应用send函数发送数据,应用recv来接收数据,而send和recv的实现原理又是怎么的呢? 在后面的几篇文章中,咱们有提过,TCP是个牢靠的、全双工协定。其流量管制或者拥塞管制依赖于滑动窗口和拥塞窗口的滑动来实现,而这两个窗口的滑动实现则是依赖于TCP中的两个buffer,这两个buffer则是TCP socket在内核中的发送缓冲区(send buffer)和接收缓冲区(recv buffer)。 在本文中,咱们首先会简略介绍下TCP中发送缓冲区和接收缓冲区的作用(对于前面了解send和recv十分重要),而后解说Linux零碎下,TCP发送和接收数据是如何实现的。 缓冲区缓冲区,能够了解为是一个长期缓存。 对于发送端来说,socket将数据拷贝到发送长期缓冲区,就立刻返回到应用层去做其余的事件,而剩下的将长期缓冲区的数据通过内核发送到对端,这就是tcp的事。 对于接收端来说,内核将网络中的数据拷贝到缓冲区,期待下层利用读取。 发送缓冲区下面有讲,过程在调用send()发送的数据的时候,最简略状况(也是个别状况), 将数据拷贝进入socket的内核发送缓冲区之中,而后send便会立刻返回。 换句话说,在应用层调用send()返回之时,数据不肯定会发送到对端去(和write写文件有点相似),send()仅仅是把应用层buffer的数据拷贝进socket的内核发送buffer中。 TCP socket有两种模式,即阻塞模式和非阻塞模式。 在阻塞模式下, send函数的过程是将应用程序申请发送的数据拷贝到发送缓存中发送并失去确认后再返回.但因为发送缓存的存在,体现为:如果发送缓存大小比申请发送的大小要大,那么send函数立刻返回,同时向网络中发送数据;否则,send向网络发送缓存中不能包容的那局部数据,并期待对端确认后再返回(接收端只有将数据收到接管缓存中,就会确认,并不一定要期待应用程序调用recv)在非阻塞模式下,send函数的过程仅仅是将数据拷贝到协定栈的缓存区而已,如果缓存区可用空间不够,则尽能力的拷贝,返回胜利拷贝的大小;如缓存区可用空间为0,则返回-1,同时设置errno为EAGAIN.在Linux内核中,有两种形式能够查看tcp缓冲区buffer大小。 1、通过查看/etc/sysctl.ronf下的net.ipv4.tcp_wmem值 2、 通过命令'cat /proc/sys/net/ipv4/tcp_wmem' cat /proc/sys/net/ipv4/tcp_wmem4096 16384 4194304从下面能够看出,在笔者所在的服务器上,tcp send缓冲区buffer有3个值,别离是4096 16384 4194304。 第一个值是socket的发送缓存区调配的起码字节数,第二个值是默认值(该值会被net.core.wmem_default笼罩),缓存区在零碎负载不重的状况下能够增长到这个值第三个值是发送缓存区空间的最大字节数(该值会被net.core.wmem_max笼罩)咱们能够通过程序,来批改以后tcp socket的发送缓冲区大小,须要留神的是,如下的代码批改,只会批改以后特定的socket。 int buffer_len = 10240;setsockopt(fd, SOL_SOCKET, SO_SNDBUF, (void*)&buffer_len, buffer_len);接收缓冲区接收缓冲区被TCP用来缓存网络上来的数据,始终保留到利用过程读走为止。 对于TCP,如果利用过程始终没有读取,接收缓冲区满了之后,产生的动作是:收端告诉发端,接管窗口敞开(win=0)。这个便是滑动窗口的实现。保障TCP套接口接收缓冲区不会溢出,从而保障了TCP是牢靠传输。因为对方不容许收回超过所通告窗口大小的数据。 这就是TCP的流量管制,如果对方忽视窗口大小而收回了超过窗口大小的数据,则接管方TCP将抛弃它。 与查看发送缓冲区大小的形式一样,接收缓冲区也是通过如上的两种形式。1、通过查看/etc/sysctl.ronf下的net.ipv4.tcp_rmem值 2、通过命令'cat /proc/sys/net/ipv4/tcp_rmem' cat /proc/sys/net/ipv4/tcp_rmem4096 87380 4194304TCP接收缓冲区buffer有3个值,别离是4096 87380 4194304。 第一个值是socket的接管缓存区的起码字节数,第二个值是默认值(该值会被net.core.rmem_default笼罩),缓存区在零碎负载不重的状况下能够增长到这个值第三个值是接管缓存区空间的最大字节数(该值会被net.core.rmem_max笼罩)同样的,能够通过如下代码,批改接收缓冲区的大小。 int buffer_len = 10240;setsockopt(fd, SOL_SOCKET, SO_RCVBUF, (void*)&buffer_len, buffer_len);实现原理为了便于咱们了解TCP的整个传输过程,咱们先理解下TCP的四层模型以及四册模型在数据传输中的流向。前面咱们将从四层模型的角度来剖析send和recv函数在每层中都做了什么。 send原理NAME send, sendto, sendmsg - send a message on a socketSYNOPSIS #include <sys/types.h> #include <sys/socket.h> ssize_t send(int sockfd, const void *buf, size_t len, int flags);DESCRIPTION The system calls send(), sendto(), and sendmsg() are used to transmit a message to another socket.当调用该函数时,send函数:1、先比拟待发送数据的长度len和套接字sockfd的可用发送缓冲区的长度 ...

August 31, 2021 · 2 min · jiezi

关于tcp:TCP-三次握手和四次挥手转载

原文地址:https://www.cnblogs.com/xiaol... 前言整顿了对于 TCP 三次握手和四次挥手的面试题型,跟大家一起探讨探讨。TCP 根本意识 TCP 连贯建设 TCP 连贯断开 Socket 编程 PS:本次文章不波及 TCP 流量管制、拥塞管制、可靠性传输等方面常识,这些留在下篇哈! 注释01 TCP 根本意识瞧瞧 TCP 头格局 咱们先来看看 TCP 头的格局,标注色彩的示意与本文关联比拟大的字段,其余字段不做具体论述。 TCP 头格局TCP 头格局序列号:在建设连贯时由计算机生成的随机数作为其初始值,通过 SYN 包传给接收端主机,每发送一次数据,就「累加」一次该「数据字节数」的大小。用来解决网络包乱序问题。 确认应答号:指下一次「冀望」收到的数据的序列号,发送端收到这个确认应答当前能够认为在这个序号以前的数据都曾经被失常接管。用来解决不丢包的问题。 管制位: ACK:该位为 1 时,「确认应答」的字段变为无效,TCP 规定除了最后建设连贯时的 SYN 包之外该位必须设置为 1 。RST:该位为 1 时,示意 TCP 连贯中出现异常必须强制断开连接。SYN:该位为 1 时,示意心愿建设连贯,并在其「序列号」的字段进行序列号初始值的设定。FIN:该位为 1 时,示意今后不会再有数据发送,心愿断开连接。当通信完结心愿断开连接时,通信单方的主机之间就能够相互交换 FIN 位为 1 的 TCP 段。为什么须要 TCP 协定? TCP 工作在哪一层? IP 层是「不牢靠」的,它不保障网络包的交付、不保障网络包的按序交付、也不保障网络包中的数据的完整性。 OSI 参考模型与 TCP/IP 的关系OSI 参考模型与 TCP/IP 的关系如果须要保障网络数据包的可靠性,那么就须要由下层(传输层)的 TCP 协定来负责。 因为 TCP 是一个工作在传输层的牢靠数据传输的服务,它能确保接收端接管的网络包是无损坏、无距离、非冗余和按序的。 ...

August 25, 2021 · 8 min · jiezi

关于tcp:深入理解HTTP-keep-alive和TCP-keep-alive关系

群里有一位gu(a)y提到过一个面试题,问HTTP keep alive和操作系统中TCP的keep alive有啥区别。 这个问题算是个八股文题,然而细问上来,又很难说出一个有体系的、确定的答案。这也是个不错的面试题,所以这里就联合代码谈下本人的了解。 HTTP keepalive在 HTTP 1.0 期间,每个 TCP 连贯只会被一个 HTTP Transaction(申请加响应)应用,申请时建设,申请实现开释连贯。当网页内容越来越简单,蕴含大量图片、CSS 等资源之后,这种模式效率就显得太低了。所以,在 HTTP 1.1 中,引入了 HTTP persistent connection 的概念,也称为 HTTP keep-alive,目标是复用TCP连贯,在一个TCP连贯上进行屡次的HTTP申请从而进步性能。 HTTP 1.0中默认是敞开的,须要在HTTP头退出"Connection: Keep-Alive",能力启用Keep-Alive;HTTP 1.1中默认启用Keep-Alive,退出"Connection: close ",才敞开。 咱们能够用Netty来实现一个HTTP服务器。Netty实现HTTP服务器的残缺代码此处不做列举,只看要害的channelRead办法。 @Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {if (msg instanceof HttpRequest) { HttpRequest request = (HttpRequest) msg; boolean keepAlive = HttpUtil.isKeepAlive(request); serverBootstrap.channel(NioServerSocketChannel.class) .group(boss, work) .handler(new LoggingHandler(LogLevel.INFO)) // handler在初始化时就会执行,能够设置打印日志级别 .childHandler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast("http-coder",new HttpServerCodec()); ch.pipeline().addLast("aggregator",new HttpObjectAggregator(1024*1024)); //在解决 POST音讯体时须要加上 ch.pipeline().addLast(new HttpServerHandler()); } }) .option(ChannelOption.SO_BACKLOG, 1024) .childOption(ChannelOption.SO_KEEPALIVE, true) .childOption(ChannelOption.TCP_NODELAY, true); //handle代码 httpResponse.headers().set(HttpHeaderNames.CONTENT_TYPE, "text/html;charset=UTF-8"); httpResponse.headers().setInt(HttpHeaderNames.CONTENT_LENGTH, httpResponse.content().readableBytes()); if (keepAlive) { httpResponse.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.KEEP_ALIVE); ctx.writeAndFlush(httpResponse); } else { ctx.writeAndFlush(httpResponse).addListener(ChannelFutureListener.CLOSE); } }}Netty封装了HTTP的实现,代码很简略,如果判断申请是keep-alive的,那么响应头也加上keep-alive标记,从而实现了keep alive性能。 ...

July 15, 2021 · 2 min · jiezi

关于tcp:TCP和UDP的区别

TCP的长处: 牢靠,稳固 TCP的牢靠体现在TCP在传递数据之前,会有三次握手来建设连贯,而且在数据传递时,有确认、窗口、重传、拥塞管制机制,在数据传完后,还会断开连接用来节约系统资源。 TCP的毛病: 慢,效率低,占用系统资源高,易被攻打 TCP在传递数据之前,要先建连贯,这会耗费工夫,而且在数据传递时,确认机制、重传机制、拥塞管制机制等都会耗费大量的工夫,而且要在每台设施上保护所有的传输连贯,事实上,每个连贯都会占用零碎的CPU、内存等硬件资源。 而且,因为TCP有确认机制、三次握手机制,这些也导致TCP容易被人利用,实现DOS、DDOS、CC等攻打。 UDP的长处: 快,比TCP稍平安 UDP没有TCP的握手、确认、窗口、重传、拥塞管制等机制,UDP是一个无状态的传输协定,所以它在传递数据时十分快。没有TCP的这些机制,UDP较TCP被攻击者利用的破绽就要少一些。但UDP也是无奈防止攻打的,比方:UDP Flood攻打…… UDP的毛病: 不牢靠,不稳固 因为UDP没有TCP那些牢靠的机制,在数据传递时,如果网络品质不好,就会很容易丢包。 基于下面的优缺点,那么: 什么时候应该应用TCP: 当对网络通讯品质有要求的时候,比方:整个数据要准确无误的传递给对方,这往往用于一些要求牢靠的利用,比方HTTP、HTTPS、FTP等传输文件的协定,POP、SMTP等邮件传输的协定。 在日常生活中,常见应用TCP协定的利用如下: 浏览器,用的HTTP FlashFXP,用的FTP Outlook,用的POP、SMTP Putty,用的Telnet、SSH QQ文件传输 ………… 什么时候应该应用UDP: 当对网络通讯品质要求不高的时候,要求网络通讯速度能尽量的快,这时就能够应用UDP。 比方,日常生活中,常见应用UDP协定的利用如下: QQ语音 QQ视频 TFTP …… 有些利用场景对可靠性要求不高会用到UPD,比方长视频,要求速率 小结TCP与UDP的区别: 1.基于连贯与无连贯;2.对系统资源的要求(TCP较多,UDP少);3.UDP程序结构较简略;4.流模式与数据报模式 ; 5.TCP保证数据正确性,UDP可能丢包,TCP保证数据程序,UDP不保障。 tcp协定和udp协定的差异 TCP UDP 是否连贯 面向连贯 面向非连贯 传输可靠性 牢靠 不牢靠 利用场合 大量数据 传输大量数据 速度 慢 快 TCP与UDP区别总结: 1、TCP面向连贯(如打电话要先拨号建设连贯);UDP是无连贯的,即发送数据之前不须要建设连贯 2、TCP提供牢靠的服务。也就是说,通过TCP连贯传送的数据,无差错,不失落,不反复,且按序达到;UDP尽最大致力交付,即不保障牢靠交付 3、TCP面向字节流,实际上是TCP把数据看成一连串无构造的字节流;UDP是面向报文的 UDP没有拥塞管制,因而网络呈现拥塞不会使源主机的发送速率升高(对实时利用很有用,如IP电话,实时视频会议等) 4、每一条TCP连贯只能是点到点的;UDP反对一对一,一对多,多对一和多对多的交互通信 5、TCP首部开销20字节;UDP的首部开销小,只有8个字节6、TCP的逻辑通信信道是全双工的牢靠信道,UDP则是不牢靠信道 TCP UDPTCP与UDP根本区别 1.基于连贯与无连贯 2.TCP要求系统资源较多,UDP较少; 3.UDP程序结构较简略 4.流模式(TCP)与数据报模式(UDP); 5.TCP保证数据正确性,UDP可能丢包 6.TCP保证数据程序,UDP不保障 UDP利用场景: 1.面向数据报形式 2.网络数据大多为短消息 3.领有大量Client 4.对数据安全性无特殊要求 5.网络累赘十分重,但对响应速度要求高 ...

July 14, 2021 · 1 min · jiezi

关于tcp:什么是TCP粘包怎么解决这个问题

在socket网络编程中,都是端到端通信,由客户端端口+服务端端口+客户端IP+服务端IP+传输协定组成的五元组能够明确的标识一条连贯。在TCP的socket编程中,发送端和接收端都有成对的socket。发送端为了将多个发往接收端的包,更加高效的的发给接收端,于是采纳了优化算法(Nagle算法),将屡次距离较小、数据量较小的数据,合并成一个数据量大的数据块,而后进行封包。那么这样一来,接收端就必须应用高效迷信的拆包机制来分辨这些数据。 1.Q:什么是TCP粘包问题?TCP粘包就是指发送方发送的若干包数据达到接管方时粘成了一包,从接收缓冲区来看,后一包数据的头紧接着前一包数据的尾,呈现粘包的起因是多方面的,可能是来自发送方,也可能是来自接管方。 2.Q:造成TCP粘包的起因(1)发送方起因 TCP默认应用Nagle算法(次要作用:缩小网络中报文段的数量),而Nagle算法次要做两件事: 只有上一个分组失去确认,才会发送下一个分组收集多个小分组,在一个确认到来时一起发送Nagle算法造成了发送方可能会呈现粘包问题 (2)接管方起因 TCP接管到数据包时,并不会马上交到应用层进行解决,或者说应用层并不会立刻解决。实际上,TCP将接管到的数据包保留在接管缓存里,而后应用程序被动从缓存读取收到的分组。这样一来,如果TCP接管数据包到缓存的速度大于应用程序从缓存中读取数据包的速度,多个包就会被缓存,应用程序就有可能读取到多个首尾相接粘到一起的包。 3.Q:什么时候须要解决粘包景象?如果发送方发送的多组数据原本就是同一块数据的不同局部,比如说一个文件被分成多个局部发送,这时当然不须要解决粘包景象如果多个分组毫不相干,甚至是并列关系,那么这个时候就肯定要解决粘包景象了4.Q:如何解决粘包景象?(1)发送方 对于发送方造成的粘包问题,能够通过敞开Nagle算法来解决,应用TCP_NODELAY选项来敞开算法。 (2)接管方 接管方没有方法来解决粘包景象,只能将问题交给应用层来解决。 (2)应用层 应用层的解决办法简略可行,不仅能解决接管方的粘包问题,还能够解决发送方的粘包问题。 解决办法:循环解决,应用程序从接管缓存中读取分组时,读完一条数据,就应该循环读取下一条数据,直到所有数据都被解决实现,然而如何判断每条数据的长度呢? 格式化数据:每条数据有固定的格局(开始符,结束符),这种办法简单易行,然而抉择开始符和结束符时肯定要确保每条数据的外部不蕴含开始符和结束符。发送长度:发送每条数据时,将数据的长度一并发送,例如规定数据的前4位是数据的长度,应用层在解决时能够依据长度来判断每个分组的开始和完结地位。5.Q:UDP会不会产生粘包问题呢?TCP为了保障牢靠传输并缩小额定的开销(每次发包都要验证),采纳了基于流的传输,基于流的传输不认为音讯是一条一条的,是无爱护音讯边界的(爱护音讯边界:指传输协定把数据当做一条独立的音讯在网上传输,接收端一次只能承受一条独立的音讯)。 UDP则是面向音讯传输的,是有爱护音讯边界的,接管方一次只承受一条独立的信息,所以不存在粘包问题。 举个例子:有三个数据包,大小别离为2k、4k、6k,如果采纳UDP发送的话,不论接受方的接管缓存有多大,咱们必须要进行至多三次以上的发送能力把数据包发送完,然而应用TCP协定发送的话,咱们只须要接受方的接管缓存有12k的大小,就能够一次把这3个数据包全副发送结束。————————————————版权申明:本文为CSDN博主「渔溪大王」的原创文章,遵循 CC 4.0 BY-SA 版权协定,转载请附上原文出处链接及本申明。原文链接:https://blog.csdn.net/weixin_...

July 1, 2021 · 1 min · jiezi

关于tcp:TCP连接和释放

[TOC] 前言TCP是一种端对端的协定;TCP是无状态协定;一、TCP的三次握手-连贯1.1 图解流程 SYN,同步标记位,用于建设连贯时,同步本人序列号给对方。ACK,确认标记位,当须要发送ack(确认序列号)时,必须置位1。seq,数据序列号,表名此次申请发送的第一个数据的序列号为多少,首次自定。ack,下次数据的序列号,通知对方下次应该发过来的第一个数据的序列号应该是多少。established,连贯已建设。TCP三次握手本质上就是保护单方 seq(数据序列号) 的过程。 留神: SYN报文段不携带数据,然而要耗费一个序号;ACK报文段能够携带数据,如果不携带,则下次序列号不变,所以最初一次握手后,下次连贯序列号还是从K+1开始;图解: A呼叫B,这是条同步连贯,此次数据由J开始;B收到;B呼叫A,收到同步连贯,下次请从J+1开始发送数据,并且同样须要同步,此次数据由K开始;A收到,建设连贯;A呼叫B,收到同步连贯,那下次请从K开始发送数据吧;1.2 为什么不能是四次握手?其实能够看到,握手的第二次能够拆成两局部实现,先发送ACK,在同步SYN,这样下来就是四次握手了。为什么不呢?因为成果一样,没必要呀~。同样不五次、六次、七次等等起因都是如此。 1.3 为什么不能是两次握手?这次要是为了避免 已生效的连贯申请报文段 忽然又传送到了对方,因此产生谬误。 已生效的连贯申请报文段:第一次握手发送因网络拥挤或其余起因而未达到对方手中。 如果是两次握手,会产生的谬误是什么? 两次握手的话,B的established(连贯建设)将产生在第一次握手后。 如果A第一次发送连贯申请(seq=J),因为网络拥挤而为达到B手中,之后发送第二次连贯申请后,胜利达到,单方后续连贯好连贯,并开始继续发送数据(A发送给B的seq曾经到了N)。此时第一次连贯申请达到B,B认为A须要从新建设连贯(因为TCP是无状态的,所以只能这么机械认为),而后B建设连贯,发送确认、同步申请给A之后,期待接管A数据序号为J+1的数据。A收到来自B的确认、同步申请,但A此时曾经和B连贯,所以疏忽此次确认申请,持续发送序列号为N+1的数据。B收到序列号为N+1的数据,并不是J+1的数据,不进行接管。A没有等到B的回复,始终在超时重传,屡次后便报出谬误,期待从新连贯。为什么三次握手,不会呈现” 已生效的连贯申请报文段 忽然又传送到了对方,因此产生谬误“的状况? 因为B建设连贯在第三次握手之后,已生效的连贯申请报文段 忽然又传送到了对方,并不会扭转B下次接管A的数据的序列号(两次握手失败的次要起因:B下次接管A的数据序列号从N+1变成了J+1)。所以在A疏忽之后持续发送N+1的序列号数据时,B能失常接管。 第二次或第三次握手拥挤之后,忽然又传回对方手中,会产生怎么样的后果? 因为第二次握手和第三次握手都须要有前景,即第一次握手(第二次握手的前景)和第一、二次握手(第三次握手的前景),因为没有前景,所以天然会被疏忽掉。 二、TCP的四次挥手-开释2.1 图解 FIN,连贯完结标记位,示意发送方申请断开连接。MSL,最长报文段寿命,约为2分钟,随着时代提高,之后持续变短。2MSL,2个MSL工夫,为一个期待计时器的时长。留神: FIN标记位为1时,即便申请不携带数据,也要耗费一个序号。图解: A想敞开连贯,并解决好敞开连贯的预先;A呼叫B,这是条敞开申请,此次序号为u;B收到A的敞开申请,同时向利用汇报,敞开连贯的事;B呼叫A,这是条确认申请,此次数据序号为v,下次发送数据从u+1开始(这表明B收到A的上一条(u)申请了);B解决敞开连贯的事,同时把须要发送的数据给发送完(此时发送的数据都要保留ack=u+1,因为要给后续A发送用),发送完之后,便进行敞开操作;B呼叫A,这是条敞开申请,此次序号为w,下次发送数据从u+1开始;A呼叫B,这是条确认申请,此次序号为u+1,下次发送数据从w+1开始;A期待2MSL后,敞开连贯;2.2 为什么最初A须要期待2MSL工夫呢?保障A最初发给B的报文段能达到B。如果不能到达B,在这2MSL时间段内,齐全够B超时重发FIN报文段,且A让收到。如果A收到后,将持续发送最初一次挥手,且重置期待计时器。期待计时器重置也有次数,如果重置屡次的话,A将间接敞开。避免”已生效的连贯申请报文段“呈现在挥手阶段。在这2MSL时间段内,足够让B接管到之前的因网络拥挤而未达到的报文段了,当然报文段有无效时长,超过这个无效时长,将会被抛弃。这样就不会因为下次建设连贯时接管到上次建设连贯时的报文段而产生谬误。2.3 如果A掉电退出了怎么办?TCP有一个保活计时器,当单方接管到对方报文段时,保活计时器将重置。如果保活计时器工夫完结,它将会被动敞开TCP连贯。 三、总结整个TCP连贯、相互发送数据(你向我发送数据,我回复你收到)、挥手阶段,都是一个 保护序号的过程。这个序号就是我同对方讲的这句话的惟一标识符。 seq、ack都尤为重要。seq 示意了某一方数据的唯一性;ack 不仅通知对方下次应该从哪个地位发送,还能验证对方发送的数据是否正确。 整个通信都是针对单方的,没有哪一方为数据的领导者。

June 20, 2021 · 1 min · jiezi

关于tcp:TCP如何保证可靠传输

TCP如何保障牢靠传输? 1.确认应答和序列号2.超时重传3.流量管制4.拥塞管制 1.确认应答和序列号 TCP传输时将每个字节的数据都进行了编号,这就是序列号。tcp按序号发送报文,接收端收到报文后,会给发送端一个ACK确认报文,用来示意曾经胜利接管到报文,报文中还带有ack,示意下一次发送端应该从哪里开始发送报文。 2.超时重传 如果发送端发送的数据没有收到ACK确认,可能是:(1)发送给接收端的报文失落了(2)接收端发送的ACK确认报文失落了。不论是哪种起因,超过肯定工夫后,没有收到ACK确认,TCP启动超时重传机制,发送端从新发数据,如果接收端曾经有了该数据,只是因为ACK确认失落导致超时重传,会将刚刚发送过去的数据包抛弃。超时重传保障报文即便失落能再传输,晓得传输胜利为止,从而实现牢靠传输。 3.流量管制 发送端如果数据发送过快,导致接收端的缓冲区很快就满了,如果继续上来,数据溢出缓冲区,就会呈现数据失落。这时须要在发送端和接收端有一个窗口,窗口的作用为:在发送缓冲区,只有在窗口外面的数据,能力被发送,在接收缓冲区,只有在窗口里的数据能力被接管,接收端收到数据之后,会回复ack,发送端会依据ack的值来判断接管能力,从而动静调整窗口大小,实现流量管制。 4.拥塞管制 如果网络呈现拥塞,TCP会依据不同状况,采纳不同的算法:慢开始,拥塞防止,快重传,快复原来对窗口大小cwnd和慢开始门限值ssthresh进行调整,从而升高网络拥塞的可能性。

June 20, 2021 · 1 min · jiezi

关于tcp:拜托面试不要再我TCP三次握手与四次挥手了

摘要在互联网大厂面试过程中对于计算机中网络常问的一个问题就是对于传输层外面的协定:TCP协定,TCP协定规定了网络通信中点对点的通信,基于PORT寻址到对应的主机上的某一个应用程序(一个网络数据包过去之后,因为各个应用程序是共用一块网卡接管网络数据包数据,所以为了确认此网络数据包到底是发给我本机的哪个应用程序的呢?QQ、微信、钉钉等,因此引出了TCP协定基于port的点对点通信,TCP协定定一个一套标准,理论电脑网络通信的过程中应用的是底层实现了tcp协定的编程标准的socket来进行点对点通信),TCP协定进行通信的关键步骤:点对点建设连贯(TCP三次握手)、散失拆分数据传输、点对点开释连贯(TCP四次挥手)。 面试题剖析1、画一下TCP三次握手的流程图?为啥是三次而不是二次或者四次呢?而后连环炮诘问,说一下TCP四次握手的过程? 背景咱们罕用的应用tcp协定编程次要是:socket编程,比方netty、java nio、socket等;基于ip地址加端口号进行点对点通信时候其实是十分根底的。会经验一个tcp的3次握手过程建设连贯、而后传输数据,最初通过四次挥手开释连贯。 内容三次握手次要是传递报头数据:ACK,SYN,ack,seq; 1_TCP三次握手/四次离别传递报头数据阐明TCP数据包由包头跟数据组成;包头次要由发送方端口跟接管方端口组成,以及每次我发送的数据包的起始字节数据序号seq,以及对每次发送者的确认号ack; TCP的3次握手是在进行数据传输发送前的筹备工作,所以只须要替换一些头部信息(说明性形容信息),所以咱们先弄清楚下信息替换的描述性信息: 序列号: TCP数据包的第一个字节数据编号(TCP把连贯中发送的所有数据字节都编上一个序号,占4个字节,32位,用来标记数据段的程序)。 确认号ack:期待收到对方下一个报文段的第一个数据字节的序号()。确认ACK:用来限定阐明确认号ack.仅当ACK=1时,确认号字段才无效。ACK=0时,确认号有效(占1位)。同步SYN: 建设连贯时候的同步序列,当SYN=1,ACK=0时示意:这是一个连贯申请报文段(若批准连贯,则在响应报文段中使得SYN=1,ACK=1。因而,SYN=1示意这是一个连贯申请,或连贯承受报文。SYN这个标记位只有在TCP建产连贯时才会被置1,握手实现后SYN标记位被置0)。终止FIN:用来开释一个连贯。FIN=1示意:此报文段的发送方的数据曾经发送结束,并要求开释运输连贯。 注:ACK、SYN和FIN这些大写的单词示意标记位,其值要么是1,要么是0;ack、seq小写的单词示意序号。 2_TCP三次握手图解.理清画出tcp三次握手的外围思路:替换数据+进入的状态。第一次握手:客户端被动发动连贯申请,发送:SYN=1,ACK=0,seq=x,此时客户端进入SYN-SENT(同步发送)状态。 第二次握手:服务端接管到客户端发动连贯申请,而后回复批准建设连贯:SYN=1,ACK=1,ack=x+1,seq=y,此时服务端进入:SYN-RCVD(同步接管状态)。第三次握手:客户端收到服务端对立建设连贯的申请,而后发送准备就绪:ACK=1,ack=y+1,seq=x+1(因为曾经建设了连贯,所以不再发送SYN,而ACK=1是确保ack无效的),此时客户端进入ESTA-BLISHED状态,服务端收到数据之后也会进入ESTA-BLISHED状态。而后进入数据传输。 3_TCP四次握手图解第一次挥手:客户端在ESTA-BLISHED已连贯的状态下发动开释连贯申请:FIN=1,seq=u,此时客户端进入FIN-WAIT1(终止期待状态1),此时客户端不再发送数据。 第二次挥手:服务端在承受到连贯开释申请后,发送确认音讯:ACK=1,ack=u+1,seq=v;此时服务端进入敞开期待状态,此时服务端会告诉应用程序做连贯敞开的筹备工作.客户端收到确认音讯之后进入FIN-WAIT2(终止期待2状态)。 第三次挥手:服务端做完连贯敞开筹备工作之后,告诉服务端发送连贯敞开申请给客户端:FIN=1,seq=w;此时服务端进入LAST-ACK状态。 第四次挥手:客户端承受到服务端的连贯开释音讯之后发送确认音讯:ACK=1,ack=w+1,seq=u+1,此时客户端进入工夫期待状态,在2MSL时间段内,敞开连贯进入连贯TIME_WAIT工夫期待状态。服务端收到音讯之后进入CLOSED。 4_常见面试题扩大1、传输层数据发送都须要建设连贯吗?说说TCP跟UDP协定的区别?为什么须要握手这个操作,能不能不握手?在网络上发送数据包事能够不必握手的,应用握手的原理仅仅是为了满足在不牢靠信道上牢靠地传输信息;对于主机电脑网卡而言,不同主机间发送数据包,先发的数据A并不一定比后发的数据B先到。只是TCP协定会做非凡解决而已。 如果读者比照一下UDP的通信流程和TCP的通信流程,能够发现:在UDP协定中,是没有握手这个操作的。 这里就引出了TCP与UDP的一个根本区别,TCP是牢靠通信协议,而UDP是不牢靠通信协议。TCP的可靠性含意:接管方收到的数据是残缺,有序,无差错的。UDP不可靠性含意:接管方接管到的数据可能存在局部失落,程序也不肯定能保障。UDP和TCP协定都是基于同样的互联网基础设施,且都基于IP协定实现,互联网基础设施中对于数据包的发送过程是会产生丢包景象的,为什么TCP就能够实现牢靠传输而UDP不行? TCP 协定为了实现牢靠传输,通信单方须要判断本人曾经发送的数据包是否都被接管方收到,如果没收到,就须要重发。为了实现这个需要,很天然地就会引出序号(sequence number) 和 确认号(acknowledgement number)的应用。 发送方在发送数据包(假如大小为10byte)时,同时送上一个序号(假如为100),那么接管方收到这个数据包当前,就能够回复一个确认号(110 = 100 + 10) 通知发送方 “我曾经收到了你的数据包, 你能够发送下一个数据包序号从 110 开始” 。 2、TCP连贯握手为啥是三次而不是二次或者四次呢?原理:在不牢靠信道上牢靠地传输信息.可靠消息传输是基于咱们的ack:确认号实现的,如果咱们采纳2次握手,client端发送建设连贯申请后,server端收到音讯之后,发送确认收到音讯之后就分配资源期待client端发送数据,会存在在不牢靠的网络通道下,client端发送了数据包A而后又发送了数据包B,因为网络起因,后发送的数据包B先达到,而后server端收到数据包之后给其分配资源,筹备接收数据,此时client跟server端就失常发送数据。然而因为前面达到的数据包A又达到建设连贯,此时server端就会再次分配资源。然而此时client端曾经能够失常发送数据,曾经进入了连贯建设状态所以不再理睬server端的资源分配,这样的话,在信道不牢靠的状况下,多个申请发送时候会创立大量连贯申请,服务端资源节约。因为3次握手曾经能够建设连贯了不须要4次。 延长:三次握手不是TCP自身的要求, 而是为了满足"在不牢靠信道上牢靠地传输信息"这一需要所导致的. 请留神这里的实质需要,信道不牢靠, 数据传输要牢靠. 三次达到了, 那前面你想接着握手也好, 发数据也好, 跟进行牢靠信息传输的需要就没关系了. 因而,如果信道是牢靠的, 即无论什么时候收回音讯, 对方肯定能收到, 或者你不关怀是否要保障对方收到你的音讯, 那就能像UDP那样间接发送音讯就能够了。 3、为什么TCP连贯断开是4次离别,而不是3次或者5次?TCP的4次挥手为了保障资源的精确开释,前两次离别是确保client端发送的开释申请被服务端接管到,后两次离别是为了server确保本人资源开释申请client端曾经收到。然而敞开连贯时,当Server端收到FIN报文时,很可能并不会立刻敞开SOCKET,所以只能先回复一个ACK报文,通知Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我能力发送FIN报文,因而不能一起发送。故须要四步握手。 为什么不是3次:因为服务端资源开释是有一个绝对的过程,如果3次离别就敞开关联的话,应用程序可能还没有收到连贯敞开申请。 4、为什么TIME_WAIT状态须要通过2MSL(最大报文段生存工夫)能力返回到CLOSE状态?尽管按情理,四个报文都发送结束,咱们能够间接进入CLOSE状态了,然而咱们必须假象网络是不牢靠的,有能够最初一个ACK失落。所以TIME_WAIT状态就是用来重发可能失落的ACK报文。在Client发送出最初的ACK回复,但该ACK可能失落。Server如果没有收到ACK,将一直反复发送FIN片段。所以Client不能立刻敞开,它必须确认Server接管到了该ACK。Client会在发送出ACK之后进入到TIME_WAIT状态。Client会设置一个计时器,期待2MSL的工夫。如果在该工夫内再次收到FIN,那么Client会重发ACK并再次期待2MSL。所谓的2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活工夫,2MSL就是一个发送和一个回复所需的最大工夫。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK曾经被胜利接管,则完结TCP连贯。 5、如果曾经建设了连贯,然而客户端忽然呈现故障了怎么办?TCP设有一个保活计时器,客户端如果呈现故障,服务器不能始终等上来白白浪费资源。服务器每收到一次客户端的申请后都会从新复位这个计时器,工夫通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,当前每隔75秒钟发送一次。若一连发送10个探测报文依然没反馈,服务器就认为客户端出了故障,接着就敞开连贯。 参考https://blog.csdn.net/lengxia...

May 22, 2021 · 1 min · jiezi

关于tcp:三次握手四次挥手

三次握手 && 四次挥手材料:材料 TCP连贯中的协定码SYN: synchronous,当SYN=1,ACK=0,表明是连贯申请报文,若批准连贯,则响应报文中应该使SYN=1,ACK=1ACK: acknowledgement,仅当ACK=1时,确认号字段才无效PSH: push 推送FIN: finish完结,当FIN=1,表明此报文的发送方的数据曾经发送结束,并且要求开释RST: reset重置,当RST=1,表明TCP连贯中呈现重大过错,必须开释连贯,而后再从新建设连贯URG: urgent紧急Sequence number: 程序号码Acknowledge number: 确认号码三次握手:客户端发送 SYN = 1, seq = x,客户端进入SYN_SENT状态服务端接管到客户端音讯,发送SYN= 1,ACK = 1, ack = x+1, seq = y,状态进入SYN_REVD客户端发送ACK = 1, ack=y+ 1, seq=x+1,客户端进入ESTABLISHED状态服务端接管到客户端的音讯,也进入ESTABLISHED状态四次挥手:客户端发送:FIN = 1,seq = x,客户端进入FIN-WAIT-1(终止期待1)状态服务端接管到客户端的申请,收回确认报文ACK = 1,ack = x+1, seq= y,服务端就进入了CLOSE-WAIT(敞开期待)状态客户端接管到服务端确定申请后,客户端就进入FIN-WAIT-2(终止期待2)状态服务端在发送完最初数据的时候,服务端向客户端发送开释报文,ACK = 1,FIN = 1,ack =x+1,seq= z,服务器就进入了LAST-ACK(最初确认)状态,期待客户端的确认客户端承受到服务端确认音讯的时候,发送确认报文ACK =1,seq= x+1,ack= z+1,客户端就进入了TIME-WAIT(工夫期待)状态,这时候TCP连贯还没有断开,必须通过2∗ MSL(最长报文段寿命)的工夫后,当客户端撤销相应的TCB后,才进入CLOSED状态服务器只有收到了客户端收回的确认,立刻进入CLOSED状态

April 21, 2021 · 1 min · jiezi

关于即时通讯:不为人知的网络编程十二彻底搞懂TCP协议层的KeepAlive保活机制

文中援用了参考资料中的局部内容,本文参考资料详见文末“参考资料”一节,感激材料分享者。 1、引言对于IM开发者而言,网络保活这件事再相熟不过了,比方这是我最近一篇无关网络保活话题文章《一文读懂即时通讯利用中的网络心跳包机制:作用、原理、实现思路等》,以及我分享的大量代码实战编码中也都必须要思考这个问题的实现,比方最近的这篇《跟着源码学IM(五):正确理解IM长连贯、心跳及重连机制,并入手实现》。 对于IM这种利用而言,应用层的网络保活的最间接方法就是心跳机制,比方支流的IM里有微信、QQ、钉钉、易信等等,可能代码实现细节有所差别,但实践上无一例外都是这样实现。(PS:没错,当初微信跟运营商间的“信令危机”就是跟这个无关) 所谓的网络心跳,通常是客户端每隔一小段时间向服务器发送一个数据包(即心跳包),告诉服务器本人依然在线(心跳包中同时可能传输一些必要的数据)。发送心跳包,从通信层面来说就是为了放弃长连贯,至于这个包的内容,是没有什么特地规定的,但在挪动端IM中为了省流量,个别都是很小的包(比方某些第3方的IM云为了阐明心跳不费流量,号称1字节的心跳包)。 但常常有人会问到,既然TCP协定自身有KeepAlive保活这个货色(见:《TCP/IP详解 卷1 - 第23章·TCP的保活定时器》),为什么还要自已在应用层去实现网络保活/心跳机制呢? 没错,通常面视即时通讯/IM方面的程序员时,这简直是必提问题! 要解答这个问题,我通常倡议看看《为什么说基于TCP的挪动端IM依然须要心跳保活?》这篇。但限于篇幅,该篇并没有深入探讨TCP协定自身的KeepAlive机制,所以这次借本文想把TCP协定的KeepAlive保活机制给具体的整理出来,以便大家能深刻其中一窥到底。 学习交换: 即时通讯/推送技术开发交换5群:215477170 [举荐]挪动端IM开发入门文章:《新手入门一篇就够:从零开发挪动端IM》开源IM框架源码:https://github.com/JackJiang2...(本文已同步公布于:http://www.52im.net/thread-35... 2、系列文章本文是系列文章中的第12篇,本系列文章的纲要如下: 《鲜为人知的网络编程(一):浅析TCP协定中的疑难杂症(上篇)》《鲜为人知的网络编程(二):浅析TCP协定中的疑难杂症(下篇)》《鲜为人知的网络编程(三):敞开TCP连贯时为什么会TIME_WAIT、CLOSE_WAIT》《鲜为人知的网络编程(四):深入研究剖析TCP的异样敞开》《鲜为人知的网络编程(五):UDP的连接性和负载平衡》《鲜为人知的网络编程(六):深刻地了解UDP协定并用好它》《鲜为人知的网络编程(七):如何让不牢靠的UDP变的牢靠?》《鲜为人知的网络编程(八):从数据传输层深度解密HTTP》《鲜为人知的网络编程(九):实践联系实际,全方位深刻了解DNS》《鲜为人知的网络编程(十):深刻操作系统,从内核了解网络包的接管过程(Linux篇)》《鲜为人知的网络编程(十一):从底层动手,深度剖析TCP连贯耗时的机密》《鲜为人知的网络编程(十二):彻底搞懂TCP协定层的KeepAlive保活机制》(* 本文)3、TCP KeepAlive的初衷采纳TCP连贯的C/S模式利用中,当连贯的单方在连贯闲暇状态时,如果任意一方意外解体、当机、网线断开或路由器故障,另一方无奈得悉TCP连贯曾经生效。 那么,连贯的另一方并不知道对端的状况,它会始终保护这个连贯。而作为“服务端”来说,长时间的积攒会导致十分多的半关上连贯,造成端系统资源的耗费和节约,且有可能导致在一个有效的数据链路层面发送业务数据,后果就是发送失败。 所以各端要做到疾速感知失败,缩小有效链接操作,这就有了TCP的KeepAlive保活探测机制。 PS:这样宽泛的说TCP的KeepAlive机制的必要性,貌似还不是很有说服力,下节将带着具体的例子深入分析。 4、从NAT角度更具体地了解TCP KeepAlive的必要性讲到TCP的KeepAlive的必要性,少数文章都是像上节这样比拟抽象的进行阐明,但对于爱刨根问底的开发者来说,这还远远不够。 本节将以路由器的NAT机制这个角度来具体分析TCP协定的造物主们设计KeepAlive机制的必要性。 4.1 从NAT原理讲起广义上,NAT分为SNAT(原地址转换)和DNAT(指标地址转换),对于DNAT,有趣味的同学能够自行查阅,这里只探讨SNAT。 咱们都晓得,路由器的最基本功能是对第三层(网络层)上的IP报文进行转发。实际上,路由器还有很要害的一个性能,这便是NAT。特地是对于ISP对普通用户链路上的路由器,NAT性能尤为重要。 为什么要应用NAT? 起因很简略:IPv4地址十分稀缺。上网需要宏大,这使得ISP不可能为每一个入网用户都提供一个独立的公网IP,因而通常状况下,ISP会把用户接入局域网,使得多个用户共享同一个公网IP,而每一个用户各分得一个局域网内网IP。而连贯公网和局域网的这台路由器,称之为网关(gateway),NAT的过程就产生在这台网关路由器上。 PS:《P2P技术详解(一):NAT详解——具体原理、P2P简介》这篇文章有助于更深刻的了解NAT原理。 4.2 三层地址转换局域网内的主机向公网收回的网络层IP报文,将经由网关被转发至公网,而在该转发过程中产生了地址转换。网关将该IP报文中的 源IP地址 从”该主机的内网IP”批改为”网关的公网IP”。 比方:局域网主机取得的内网IP为192.168.1.100,网关的公网IP为210.177.63.2,局域网主机向公网指标主机收回的IP报文中,源IP字段数据为192.168.1.100,在通过网关时,该字段数据将被批改为210.177.63.2。 为什么要这么做,置信大家曾经猜到了:公网上的指标主机在收到这个IP报文后,须要晓得这个IP报文的起源地址,并向该起源地址发送响应报文,但如果不通过NAT,指标主机拿到的起源地址是192.168.1.100,这显然是一个公网上不可拜访到的公有地址,指标主机无奈将响应报文发送到正确的起源主机上。开启了NAT之后,IP报文的起源地址被网关批改为210.177.63.2,这是一个公网地址,指标主机将向这个地址(即网关路由器的公网地址)发送响应报文。 然而请留神:如果这个IP报文的数据段不含传输层协定报文,而是一个pure的网络层packet,来自指标主机的响应报文是不能被网关精确转发到多台局域网主机中的其中一台的。 PS:ICMP报文除外,其报头中有Identifier字段用于标识不同的主机或过程,网关在解决Identifier时相似于上面提到的运输层端口。 4.3 传输层端口转换表在三层地址转换中,咱们能够保障局域网内主机向公网收回的IP报文能顺利达到目标主机,然而从目标主机返回的IP报文却不能精确送至指定局域网主机(咱们不能让网关把IP报文播送至全副局域网主机,因为这样必然会带来平安和性能问题)。 为了解决这个问题,网关路由器须要借助传输层端口,通常状况下是TCP或UDP端口,由此来生成一张端口转换表。 让咱们通过一个实例来阐明端口转换表如何运作: 假如局域网主机A192.168.1.100须要与公网上的指标主机B210.199.38.2:80进行一次TCP通信。其中A所在局域网的网关C的公网IP地址为210.177.63.2。 步骤如下: 1)局域网主机A192.168.1.100收回TCP连贯申请,A上的TCP端口为零碎调配的53600。该TCP握手包中,蕴含源地址和端口192.168.1.100:53600,目标地址和端口210.199.38.2:80。 2)网关C将该包的原地址和端口批改为210.177.63.2:63000,其中63000是网关调配的长期端口。 3)网关C在端口转换表中减少一条记录: 4)网关C将批改后的TCP包发送至目标主机B。 5)目标主机B收到后,发送响应TCP包。该响应TCP蕴含有以下信息:源地址和端口210.199.38.2:80,目标地址和端口210.177.63.2:63000。 6)网关C收到这个来自B的响应包后,随即在端口转换表中查找记录。该记录须合乎以下条件:目标主机IP==210.199.38.2,目标主机端口==80,网关端口==63000。 7)网关C搜寻到这条记录,记录显示内网主机IP为192.168.1.100,内网主机端口为53600。 8)网关C将该包的目标地址和端口批改为192.168.1.100:53600。 9)网关C随即将该批改后的TCP包转发至192.168.1.100:53600,即局域网主机A。此时运输层数据的一次替换已实现。 4.4 问题来了在网关C上,因为端口数量无限(0~65535),端口转换表的保护占用系统资源,因而不能无休止地向端口转换表中减少记录。对于过期的记录,网关须要将其删除。 如何判断哪些是过期记录? 网关认为:一段时间内无流动的连贯是过期的,应定时检测转换表中的非流动连贯,并将之抛弃。而这个抛弃的过程,网关不会以任何的形式通告该连贯的任何一端。 通过下图能够更直观的了解这个过程: ▲ 上图援用自《TCP保活(TCP keepalive)》 那么问题就来了:如果一个客户端应用程序因为业务须要,须要与服务端维持长连贯(例如基于TCP的IM聊天利用),而如果在特地长的工夫内这个连贯没有任何的数据交换,网关会认为这个连贯过期并将这个连贯从端口转换表中抛弃。该连贯被抛弃时,客户端和服务端对此是齐全无感知的。在连贯被抛弃后,客户端将收不到服务端的数据推送,客户端发送的数据包也不能到达服务端。 一个具体的例子来感受一下这个问题的严重性: 某财务利用,在客户端须要填写大量的表单数据,在客户端与服务器端建设TCP连贯后,客户端终端使用者将破费几分钟甚至几十分钟填写表单相干信息,终端使用者终于填好表单所需信息后,点击“提交”按钮。 后果,这个时候因为中间设备早曾经将这个TCP连贯从连贯表中删除了,其将间接抛弃这个报文或者给客户端发送RST报文,利用故障产生,这将导致客户端终端使用者所有的工作将须要从新来过,给使用者带来极大的不便和损失。 4.5 解决办法针对上述问题,TCP协定这一层的解决办法就是利用KeepAlive机制维持长连贯,让网关认为咱们的TCP连贯是流动的,从而防止网关“干掉”咱们的长连贯。 通过NAT这个具体的例子,置信你曾经能更具体地了解TCP协定中KeepAlive保活机制的必要性了。 5、TCP Keepalive工作原理5.1 技术原理当一个 TCP 连贯建设之后,启用 TCP Keepalive 的一端便会启动一个计时器,当这个计时器数值达到 0 之后(也就是通过tcp_keep-alive_time工夫后,这个参数之后会讲到),一个 TCP 探测包便会被收回。这个 TCP 探测包是一个纯 ACK 包(RFC1122#TCP Keep-Alives标准倡议:不应该蕴含任何数据,但也能够蕴含1个无意义的字节,比方0x0),其 Seq号 与上一个包是反复的,所以其实探测保活报文不在窗口管制范畴内。 ...

April 19, 2021 · 2 min · jiezi

关于计算机网络:笔记计算机网络-5-TCP

综述UDP 报文是不牢靠的,而 TCP 报文提供牢靠交付,有拥塞管制,是有状态的连贯。而这些个性都是一些简单的构造保障的,非常明显的一点就是,UDP 头部简略,而 TCP 头部简单。尽管 TCP 有所谓的可靠性保障,然而其网络环境不见得良好。作为 IP 层,如果网络条件差,那么发包就没有任何保障,作为下层的 TCP 也没有方法,只能一直重传,通过算法保障可靠性。所以,本文由以下几点组成: TCP 头部格局三次握手,其中蕴含了 TCP 报文序号是怎么生成的四次挥手流量管制和拥塞管制应用到的数据结构流量管制拥塞管制补充:程序问题和丢包问题 —— 超时重传、疾速重传TCP 的重点问题是:程序问题、丢包问题、连贯保护、流量管制、拥塞管制TCP 头部格局TCP 头部的组成部分如下图所示: 源端口号和目标端口号。有了这两个端口,才晓得 TCP 中的数据应该发送给哪个利用序号。给包编号,是为了解决乱序的问题,如此 TCP 能力保障所有的包都是按序达到的确认序号。对收回去的包的回复,用来确认对方是否曾经收到,如果没有收到那么就要从新发送,直到送达为止。即使接管方收不到数据包,发送方也晓得哪个包没有被收到,须要重传。这个构造就解决了丢包的问题 为了保障程序性,所以每一个包都有一个 ID。在建设连贯的时候,会约定起始的 ID 是什么,而后依照 ID 一个个发送。为了保障不丢包,对于发送的包都要进行应答,然而应答不是收一个应答一个,而是会应答某个之前的 ID,示意都收到了,这种模式称为累计确认或者累计应答。例如发送的确认号是 20,示意后面 19 个包都曾经收到了,须要第 20 个包首部长度字段。因为前面 TCP 选项字段的起因,TCP 首部的长度是可变的状态位。SYN 是发动一个连贯;ACK 是一个回复;RST 是从新连贯;FIN 是完结连贯;PSH 被置位时,批示接管方应立即将数据交给下层;URG 用来批示报文段里存在着被发送端的下层实体设置为 "紧急" 的数据,紧急数据的最初一个字节有前面紧急指针字段指出。因为 TCP 是面向连贯的,所以这些状态位就会扭转连贯的状态。在实践中,PSH、URG 和紧急数据指针并没有应用,只是为了完整性,所以才提到这些字段窗口大小。TCP 有流量管制的性能,通信的单方都申明一个窗口大小,表明各自的解决能力。除了流量管制,TCP 还会进行拥塞管制,管制本人发包的速度,来适应网络环境 连贯治理接下来是 TCP 的连贯治理,分为三次握手和四次挥手。而拥塞管制和流量管制的局部,在最初形容 三次握手两台主机之间建设 TCP 连贯,须要进行 "申请 -> 应答 -> 应答之应答" 的三个步骤。三次握手的过程中,除了建设连贯以外,TCP 头部中的序号也会在握手过程中确认下来。 有一个很显著的问题是,为什么 TCP 的握手次数是 3 次,而不是两次或者是 4 次?答:假如主机 A 和服务器 B 之间的通路是不牢靠的,所以当 A 要发动一个连贯时,会给 B 发送一个包,然而两头的通路是不牢靠的,所以可能这个包丢了,也可能超时了,也可能 B 的确收到了,然而不想和 A 连贯。所以 A 和 B 之间只进行一次交换是不够的 ...

March 31, 2021 · 4 min · jiezi

关于tcp:硬核图解tcp为什么会粘包背后的原因让人暖心

事件从一个健身教练说起吧。 李东,自称亚健康终结者,尝试应用互联网+的模式拓展本人的业务。在某款新开发的聊天软件琛琛上公布广告。 键盘说来就来。疯狂发送"李东",回车发送!,"亚健康终结者",再回车发送! 还记得四层网络协议长什么样子吗? 四层网络模型每层各司其职,音讯在进入每一层时都会多加一个报头,每多一个报头能够了解为数据报多戴一顶帽子。这个报头下面记录着音讯从哪来,到哪去,以及音讯多长等信息。比方,mac头部记录的是硬件的惟一地址,IP头记录的是从哪来和到哪去,传输层头记录到是达到目标主机后具体去哪个过程。 在从音讯发到网络的时候给音讯带上报头,音讯和纷繁复杂的网络中通过这些信息在路由器间流转,最初达到目标机器上,接受者再通过这些报头,一步一步还原出发送者最原始要发送的音讯。 为什么要将数据切片软件琛琛是属于应用层上的。 而"李东","亚健康终结者"这两条音讯在进入传输层时应用的是传输层上的 TCP 协定。音讯在进入传输层(TCP)时会被切片为一个个数据包。这个数据包的长度是MSS。 能够把网络比喻为一个水管,是有肯定的粗细的,这个粗细由网络接口层(数据链路层)提供给网络层,个别认为是的MTU(1500),间接传入整个音讯,会超过水管的最大接受范畴,那么,就须要进行切片,成为一个个数据包,这样音讯能力失常通过“水管”。 MTU 和 MSS 有什么区别 MTU: Maximum Transmit Unit,最大传输单元。 由网络接口层(数据链路层)提供给网络层最大一次传输数据的大小;个别 MTU=1500 Byte。 假如IP层有 <= 1500 byte 须要发送,只须要一个 IP 包就能够实现发送工作;假如 IP 层有> 1500 byte 数据须要发送,须要分片能力实现发送,分片后的 IP Header ID 雷同。MSS:Maximum Segment Size 。 TCP 提交给 IP 层最大分段大小,不蕴含 TCP Header 和 TCP Option,只蕴含 TCP Payload ,MSS 是 TCP 用来限度应用层最大的发送字节数。 假如 MTU= 1500 byte,那么 MSS = 1500- 20(IP Header) -20 (TCP Header) = 1460 byte,如果应用层有 2000 byte 发送,那么须要两个切片才能够实现发送,第一个 TCP 切片 = 1460,第二个 TCP 切片 = 540。什么是粘包那么当李东在手机上键入"李东""亚健康终结者"的时候,在 TCP 中把音讯分成 MSS 大小后,音讯顺着网线顺利收回。 ...

March 23, 2021 · 3 min · jiezi

关于tcp:快速重传快速恢复选择重传

笔者对网络中的传输层尤为酷爱,之前有一篇文章曾经将传输层中大部分的知识点介绍了一遍,可能可读性较差。这篇次要就一些较为难了解的,课本中未具体阐明的概念进行论述。倡议读者还是先将上一篇浏览一下哦~ https://segmentfault.com/a/1190000022272869。次要了解一下其中的GBN和SR。 想必你曾经晓得TCP是GBN和SR的结合体,别离遗传了他们的个性。比方,遗传了GBN的累积确认、繁多计时器;遗传了SR的双窗口模型、抉择重传个性、数据缓存。为了能更好的了解,我先将这几个概念解释一下。 累积确认假如接管方收到了1-4的数据,在收到第4个数据包时,向发送方发送ACK 4(表明4以前的数据已收到,我想要数据5)。此时数据5失落,同时,发送方还向接管方传了6、7、8的数据。此时当接管方收到数据6、7、8时,它只会向发送方传ACK 4,以此来告知发送方数据5失落,请给我传数据5。这样有什么益处呢? 这样即便在夺么凌乱的网络中,只有发送方收到了某个ACK,如ACK 100,那么能够100%推断100以前的数据必定都收到了,因为若有一个没收到,那么接管方发送的必定是ACK xx(xx必定比100小)。TCP的一个精美设计:当接管方收到某个数据时,如数据6。接管方不急着回复ACK 6,而是会期待500ms,此时若收到了数据7,那么便间接发送ACK 7,缩小ACK的发送能够缩小网络梗塞的可能。因为发送方看到ACK 7之后,他就明确了数据6和7必定都被收到了。繁多计时器只有发送方最右边的数据包有一个计时器。在GBN中,若超时了,那么发送方会把窗口内的所有数据全都再发一遍(效率低、明明接管方都收到了却被拒收)。在GBN中,一来是因为接管方对于乱序的数据包间接抛弃,所以导致发送方在超时后无论如何都得重传。二来是因为发送方无奈得悉哪些数据被接管了,因为一旦乱序,接管方只会传最早失落的那个数据包的ACK。 此处与SR的多个计时器辨别,SR解决了"抉择重传"的设计,用的办法是每一个报文本人设定一个独自的计时器,接管方每次返回会返回对应的报文的ACK。这样一来发送方晓得了哪些报文是被收到了,哪些是没被收到的。从而能够精准发送,这也就是SR的抉择重传。而TCP也有抉择重传,设计的形式与SR不同,然而最初的目标是一样的,也就是只会重传那些没有被收到的数据报,具体如何实现能够往下看。TCP的抉择重传TCP遗传了GBN的累积确认,那发送方如何能力晓得哪些数据是被正确收到了呢? 此文解说非常具体:TCP Selective Acknowledgments (SACK) https://packetlife.net/blog/2010/jun/17/tcp-selective-acknowledgments-sack/ 察看上面这幅图,其中左侧是接管方,右侧是发送方,与咱们平时的方向恰好相反,大家留神一下。Seg2在图中处于失落状态,那么接管方在收到后续的乱序数据时,显然会发送ACK1,示意1之前的数据曾经收到了,我想要数据2。从图中能够看到,除了ACK1,还有一个信息是Sack3,这个的含意就是通知发送端,尽管Seg2失落了,然而我曾经收到了Seg3,所以你之后超时重传的话,只须要把Seg2重传一下就好了。从而实现了TCP的抉择重传。 在TCP的拥塞管制中,“慢启动”和“拥塞防止”两个模式很好了解,也容易记住。然而还有一个“疾速复原(Fast Recovery)”绝对模糊不清,接下来我将具体解说疾速复原的机制。 此处有具体的疾速复原的步骤: Javis in action: Fast Recovery Algorithm https://www.isi.edu/nsnam/DIRECTED_RESEARCH/DR_WANIDA/DR/JavisInActionFastRecoveryFrame.html 核心内容如下: After receiving 3 duplicate ACKs in a row: set ssthresh to one-half of the current congestion window.retransmit the missing segment.set cwnd = ssthresh + 3.Each time another duplicate ACK arrives, set cwnd = cwnd + 1. Then, send a new data segment if allowed by the value of cwnd.Once receive a new ACK (an ACK which acknowledges all intermediate segments sent between the lost packet and the receipt of the first duplicate ACK), exit fast recovery. This causes setting cwnd to ssthresh (the ssthresh in step 1). Then, continue with linear increasing due to congestion avoidance algorithm.由下面的内容可知,当接管方收到乱序的数据时,会将这个数据缓存下来,然而依然会发送失落的包裹的ACK。显然,若乱序的包裹接踵而至,那么发送不便会收到多个失落包裹的ACK。当收到三个(此处的三个能够参见前面的图比拟直观)反复的ACK时,触发疾速复原算法。 ...

March 17, 2021 · 1 min · jiezi

关于tcp:计算机网络之TCP协议

什么TCPhttps://www.processon.com/diagraming/5e154137e4b0bcfb73390288 互联网由一整套协定形成。TCP 只是其中的一层,有着本人的分工。TCP 是以太网协定和 IP 协定的下层协定,也是应用层协定的上层协定。 IP层是「不牢靠」的,它不保障网络包的交付、不保障网络包的按序交付、也不保障网络包中的数据的完整性。 如果须要保障网络数据包的可靠性,那么就须要由下层(传输层)的 TCP 协定来负责。 因为 TCP 是一个工作在传输层的牢靠数据传输的服务,它能确保接收端接管的网络包是无损坏、无距离、非冗余和按序的。 TCP 是面向连贯的、牢靠的、基于字节流的传输层通信协议。 面向连贯:肯定是「一对一」能力连贯,不能像 UDP 协定 能够一个主机同时向多个主机发送音讯,也就是一对多是无奈做到的; 牢靠的:无论的网络链路中呈现了怎么的链路变动,TCP 都能够保障一个报文肯定可能达到接收端; 字节流:音讯是「没有边界」的,所以无论咱们音讯有多大都能够进行传输。并且音讯是「有序的」,当「前一个」音讯没有收到的时候,即便它先收到了前面的字节曾经收到,那么也不能扔给应用层去解决,同时对「反复」的报文会主动抛弃。 TCP数据包的组成 序列号:在建设连贯时由计算机生成的随机数作为其初始值,通过 SYN 包传给接收端主机,每发送一次数据,就「累加」一次该「数据字节数」的大小。用来解决网络包乱序问题。 确认应答号:指下一次「冀望」收到的数据的序列号,发送端收到这个确认应答当前能够认为在这个序号以前的数据都曾经被失常接管。用来解决不丢包的问题。 管制位: ACK:该位为 1 时,「确认应答」的字段变为无效,TCP 规定除了最后建设连贯时的 SYN 包之外该位必须设置为 1 。 RST:该位为 1 时,示意 TCP 连贯中出现异常必须强制断开连接。 SYC:该位为 1 时,示意心愿建设连,并在其「序列号」的字段进行序列号初始值的设定。 FIN:该位为 1 时,示意今后不会再有数据发送,心愿断开连接。当通信完结心愿断开连接时,通信单方的主机之间就能够相互交换 FIN 地位为 1 的 TCP 段。 TCP 四元组能够惟一的确定一个连贯,四元组包含如下: 源地址,源端口,目标地址,目标端口 Wireshark抓包工具Wireshark 就是最罕用的网络抓包和剖析工具,更是剖析网络性能必不可少的利器。它除了能够抓包外,还提供了可视化剖析网络包的图形页面。 装置 关上下载好的软件包, 将Wireshark.app 拖动到Applications 中并双击Install ChmodBPF.pkg, 只有装置了这个, 能力捕捉数据包 应用 ...

March 4, 2021 · 2 min · jiezi

关于tcp:基础-TCP小结

抓包示例root@python:~# tcpdump -n -S tcp port 5009 # -S 参数的目标是取得ack的绝对值,不加该参数,第三次握手的ack为相对值1tcpdump: verbose output suppressed, use -v or -vv for full protocol decodelistening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes17:35:43.707223 IP 122.235.85.89.49302 > 172.16.10.164.5009: Flags [S], seq 267775201, win 8192, options [mss 1452,nop,wscale 2,nop,nop,sackOK], length 0 **客户端发动申请,第一次握手**17:35:43.707299 IP 172.16.10.164.5009 > 122.235.85.89.49302: Flags [S.], seq 3046340720, ack 267775202, win 29200, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 017:35:43.729057 IP 122.235.85.89.49302 > 172.16.10.164.5009: Flags [.], ack 3046340721, win 16698, length 0 **三次握手完结**17:35:43.778243 IP 122.235.85.89.49302 > 172.16.10.164.5009: Flags [P.], seq 267775202:267775428, ack 3046340721, win 16698, length 226 **开始传送数据**17:35:43.778299 IP 172.16.10.164.5009 > 122.235.85.89.49302: Flags [.], ack 267775428, win 237, length 017:35:43.780225 IP 172.16.10.164.5009 > 122.235.85.89.49302: Flags [.], seq 3046340721:3046343625, ack 267775428, win 237, length 290417:35:43.780254 IP 172.16.10.164.5009 > 122.235.85.89.49302: Flags [P.], seq 3046343625:3046343827, ack 267775428, win 237, length 20217:35:43.802585 IP 122.235.85.89.49302 > 172.16.10.164.5009: Flags [.], ack 3046343827, win 16698, length 017:35:43.803603 IP 122.235.85.89.49302 > 172.16.10.164.5009: Flags [P.], seq 267775428:267775619, ack 3046343827, win 16698, length 19117:35:43.803988 IP 172.16.10.164.5009 > 122.235.85.89.49302: Flags [P.], seq 3046343827:3046343878, ack 267775619, win 245, length 5117:35:43.825824 IP 122.235.85.89.49302 > 172.16.10.164.5009: Flags [P.], seq 267775619:267775895, ack 3046343878, win 16685, length 27617:35:43.865696 IP 172.16.10.164.5009 > 122.235.85.89.49302: Flags [.], ack 267775895, win 254, length 017:35:44.314454 IP 172.16.10.164.5009 > 122.235.85.89.49302: Flags [.], seq 3046343878:3046346782, ack 267775895, win 254, length 290417:35:44.314472 IP 172.16.10.164.5009 > 122.235.85.89.49302: Flags [.], seq 3046346782:3046349686, ack 267775895, win 254, length 290417:35:44.314477 IP 172.16.10.164.5009 > 122.235.85.89.49302: Flags [.], seq 3046349686:3046352590, ack 267775895, win 254, length 290417:35:44.314482 IP 172.16.10.164.5009 > 122.235.85.89.49302: Flags [P.], seq 3046352590:3046352839, ack 267775895, win 254, length 24917:35:44.336458 IP 122.235.85.89.49302 > 172.16.10.164.5009: Flags [.], ack 3046352839, win 16698, length 017:35:44.402718 IP 122.235.85.89.49302 > 172.16.10.164.5009: Flags [P.], seq 267775895:267775926, ack 3046352839, win 16698, length 3117:35:44.402758 IP 172.16.10.164.5009 > 122.235.85.89.49302: Flags [.], ack 267775926, win 254, length 017:35:44.402869 IP 172.16.10.164.5009 > 122.235.85.89.49302: Flags [F.], seq 3046352839, ack 267775926, win 254, length 0 **四次挥手开始**17:35:44.404033 IP 122.235.85.89.49302 > 172.16.10.164.5009: Flags [F.], seq 267775926, ack 3046352839, win 16698, length 017:35:44.404047 IP 172.16.10.164.5009 > 122.235.85.89.49302: Flags [.], ack 267775927, win 254, length 017:35:44.424589 IP 122.235.85.89.49302 > 172.16.10.164.5009: Flags [.], ack 3046352840, win 16698, length 0 **四次挥手完结**Flags包标记:S=SYN 发动连贯标记。 P=PUSH 传送数据标记。 F=FIN 敞开连贯标记。 ACK 示意确认包。 RST=RESET 异样敞开连贯。 . 示意没有任何标记。 ...

January 29, 2021 · 3 min · jiezi

关于tcp:tcp分段分包

MTU: Maxitum Transmission Unit 最大传输单元,链路层提供给网络层最大传输数据大小,以太网中是1500字节,internet中是576字节MSS: Maxitum Segment Size 最大TCP分段大小,MSS = MTU - IP Header - TCP Header

January 26, 2021 · 1 min · jiezi

关于tcp:15-张图了解一下-TCPIP-必知也必会的-10-个问题

一、TCP/IP模型 TCP/IP协定模型(Transmission Control Protocol/Internet Protocol),蕴含了一系列形成互联网根底的网络协议,是Internet的外围协定。 基于TCP/IP的参考模型将协定分成四个档次,它们别离是链路层、网络层、传输层和应用层。下图示意TCP/IP模型与OSI模型各层的对照关系。TCP/IP协定族依照档次由上到下,层层包装。最下面的是应用层,这外面有http,ftp 等等咱们相熟的协定。而第二层则是传输层,驰名的TCP和UDP协定就在这个档次。第三层是网络层,IP协定就在这里,它负责对数据加上IP地址和其余的数据以确定传输的指标。第四层是数据链路层,这个档次为待传送的数据退出一个以太网协定头,并进行CRC编码,为最初的数据传输做筹备。上图分明地示意了TCP/IP协定中每个层的作用,而TCP/IP协定通信的过程其实就对应着数据入栈与出栈的过程。入栈的过程,数据发送方每层一直地封装首部与尾部,增加一些传输的信息,确保能传输到目的地。出栈的过程,数据接管方每层一直地拆除首部与尾部,失去最终传输的数据。上图以HTTP协定为例,具体阐明。 二、数据链路层 物理层负责0、1比特流与物理设施电压高下、光的闪灭之间的调换。数据链路层负责将0、1序列划分为数据帧从一个节点传输到邻近的另一个节点,这些节点是通过MAC来惟一标识的(MAC,物理地址,一个主机会有一个MAC地址)。 封装成帧: 把网络层数据报加头和尾,封装成帧,帧头中包含源MAC地址和目标MAC地址。通明传输:零比特填充、转义字符。牢靠传输: 在出错率很低的链路上很少用,然而无线链路WLAN会保障牢靠传输。过错检测(CRC):接收者检测谬误,如果发现过错,抛弃该帧。三、网络层 1、IP协定 IP协定是TCP/IP协定的外围,所有的TCP,UDP,IMCP,IGMP的数据都以IP数据格式传输。要留神的是,IP不是牢靠的协定,这是说,IP协定没有提供一种数据未传播当前的解决机制,这被认为是下层协定:TCP或UDP要做的事件。 1.1 IP地址在数据链路层中咱们个别通过MAC地址来辨认不同的节点,而在IP层咱们也要有一个相似的地址标识,这就是IP地址。 32位IP地址分为网络位和地址位,这样做能够缩小路由器中路由表记录的数目,有了网络地址,就能够限定领有雷同网络地址的终端都在同一个范畴内,那么路由表只须要保护一条这个网络地址的方向,就能够找到相应的这些终端了。 A类IP地址: 0.0.0.0~127.0.0.0B类IP地址:128.0.0.1~191.255.0.0C类IP地址:192.168.0.0~239.255.255.0 1.2 IP协定头这里只介绍:八位的TTL字段。这个字段规定该数据包在穿过多少个路由之后才会被摈弃。某个IP数据包每穿过一个路由器,该数据包的TTL数值就会缩小1,当该数据包的TTL成为零,它就会被主动摈弃。 这个字段的最大值也就是255,也就是说一个协定包也就在路由器外面穿行255次就会被抛弃了,依据零碎的不同,这个数字也不一样,个别是32或者是64。 2、ARP及RARP协定 ARP 是依据IP地址获取MAC地址的一种协定。 ARP(地址解析)协定是一种解析协定,原本主机是齐全不晓得这个IP对应的是哪个主机的哪个接口,当主机要发送一个IP包的时候,会首先查一下本人的ARP高速缓存(就是一个IP-MAC地址对应表缓存)。 如果查问的IP-MAC值对不存在,那么主机就向网络发送一个ARP协定播送包,这个播送包外面就有待查问的IP地址,而间接收到这份播送的包的所有主机都会查问本人的IP地址,如果收到播送包的某一个主机发现自己符合条件,那么就筹备好一个蕴含本人的MAC地址的ARP包传送给发送ARP播送的主机。 而播送主机拿到ARP包后会更新本人的ARP缓存(就是寄存IP-MAC对应表的中央)。发送播送的主机就会用新的ARP缓存数据筹备好数据链路层的的数据包发送工作。 RARP协定的工作与此相反,不做赘述。 3、ICMP协定 IP协定并不是一个牢靠的协定,它不保证数据被送达,那么,天然的,保证数据送达的工作应该由其余的模块来实现。其中一个重要的模块就是ICMP(网络管制报文)协定。ICMP不是高层协定,而是IP层的协定。 当传送IP数据包产生谬误。比方主机不可达,路由不可达等等,ICMP协定将会把错误信息封包,而后传送回给主机。给主机一个处理错误的机会,这 也就是为什么说建设在IP层以上的协定是可能做到平安的起因。 四、ping ping能够说是ICMP的最驰名的利用,是TCP/IP协定的一部分。利用“ping”命令能够查看网络是否连通,能够很好地帮忙咱们剖析和断定网络故障。 例如:当咱们某一个网站上不去的时候。通常会ping一下这个网站。ping会回显出一些有用的信息。个别的信息如下:ping这个单词源自声纳定位,而这个程序的作用也的确如此,它利用ICMP协定包来侦测另一个主机是否可达。原理是用类型码为0的ICMP发申请,受到申请的主机则用类型码为8的ICMP回应。 五、Traceroute Traceroute是用来侦测主机到目标主机之间所经路由状况的重要工具,也是最便当的工具。 Traceroute的原理是十分十分的有意思,它收到到目标主机的IP后,首先给目标主机发送一个TTL=1的UDP数据包,而通过的第一个路由器收到这个数据包当前,就主动把TTL减1,而TTL变为0当前,路由器就把这个包给摈弃了,并同时产生 一个主机不可达的ICMP数据报给主机。主机收到这个数据报当前再发一个TTL=2的UDP数据报给目标主机,而后刺激第二个路由器给主机发ICMP数据 报。如此往返直到达到目标主机。这样,traceroute就拿到了所有的路由器IP。六、TCP/UDP TCP/UDP都是是传输层协定,然而两者具备不同的个性,同时也具备不同的利用场景,上面以图表的模式比照剖析。面向报文 面向报文的传输方式是应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。因而,应用程序必须抉择适合大小的报文。若报文太长,则IP层须要分片,升高效率。若太短,会是IP太小。 面向字节流 面向字节流的话,尽管应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序看成是一连串的无构造的字节流。TCP有一个缓冲,当应用程序传送的数据块太长,TCP就能够把它划分短一些再传送。对于拥塞管制,流量管制,是TCP的重点,前面解说。 TCP和UDP协定的一些利用什么时候应该应用TCP? 当对网络通讯品质有要求的时候,比方:整个数据要准确无误的传递给对方,这往往用于一些要求牢靠的利用,比方HTTP、HTTPS、FTP等传输文件的协定,POP、SMTP等邮件传输的协定。 什么时候应该应用UDP? 当对网络通讯品质要求不高的时候,要求网络通讯速度能尽量的快,这时就能够应用UDP。 七、DNS DNS(Domain Name System,域名零碎),因特网上作为域名和IP地址互相映射的一个分布式数据库,可能使用户更不便的拜访互联网,而不必去记住可能被机器间接读取的IP数串。通过主机名,最终失去该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。DNS协定运行在UDP协定之上,应用端口号53。 八、TCP连贯的建设与终止 1、三次握手 TCP是面向连贯的,无论哪一方向另一方发送数据之前,都必须先在单方之间建设一条连贯。在TCP/IP协定中,TCP协定提供牢靠的连贯服务,连贯是通过三次握手进行初始化的。三次握手的目标是同步连贯单方的序列号和确认号并替换 TCP窗口大小信息。第一次握手:建设连贯。客户端发送连贯申请报文段,将SYN地位为1,Sequence Number为x;而后,客户端进入SYN_SEND状态,期待服务器的确认; 第二次握手:服务器收到SYN报文段。服务器收到客户端的SYN报文段,须要对这个SYN报文段进行确认,设置Acknowledgment Number为x+1(Sequence Number+1);同时,本人本人还要发送SYN申请信息,将SYN地位为1,Sequence Number为y;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态; 第三次握手:客户端收到服务器的SYN+ACK报文段。而后将Acknowledgment Number设置为y+1,向服务器发送ACK报文段,这个报文段发送结束当前,客户端和服务器端都进入ESTABLISHED状态,实现TCP三次握手。 为什么要三次握手? 为了避免已生效的连贯申请报文段忽然又传送到了服务端,因此产生谬误。 ...

December 11, 2020 · 1 min · jiezi

关于tcp:tcp重传机制流量控制拥塞控制

tcp重传机制形式超时重传 概念 发送数据时设定一个定时器,若在指定工夫内没有收到应答报文,就会重发数据产生超时重传的机会 数据包失落确认应答失落超时工夫RTO抉择 略大于RTT重传超时策略:超时工夫距离加倍疾速重传 概念 发送方能够一次发送多个数据包,若两头的某个数据包失落了,接管方会始终回复这个失落的数据包应答报文,接管方若收到三次这个数据包的应答报文,就晓得该报文还没有被接管方收到,能够重传这个数据包问题 因为接管方对后续的数据包也返回了失落的那个应答报文,所以发送方不晓得后续的数据包是否失落,也就不晓得应该重传失落的数据包还是把后续的数据包都重传SACK 概念 选择性重传,解决疾速重传不晓得重传哪些报文的毛病实现形式 在tcp头部“选项”字段里加一个SACK,将缓存的地图发送给发送方,这样发送方就晓得哪些数据接管方收到了,哪些数据接管方没有收到,以便重传接管方没有收到的数据参数 要开启SACK,须要发送方和接管方都反对:net.ipv4.tcp_sack,linux2.4当前默认关上D-SACK 概念 对SACK的扩大,通过SACK通知发送方哪些数据被反复接管了实现形式 若有发送方有反复发送数据包,会通过SACK通知发送方这这个数据包已被发送过益处 发送方可能晓得是收回去的包丢了还是接管方发送的ACK丢了 SACK若告知这个包已被发送过,那么阐明是接管方发送的ACK丢了发送方能够晓得收回去的数据包是否被网络提早了 发送方在提早之后会重发数据包,之前的数据包若一段时间后达到了接管方,接管方返回的应答报文中能看到该数据包曾经被接管了,是个反复的报文,阐明被网络提早了,而重发的数据包已被收到序列号与确认应答(ACK)保障了tcp的牢靠传输滑动窗口引入起因每发送一个数据都须要进行确认应答,收到了再发送下一个,效率比拟低。在窗口大小限度范畴内,能够无需期待上一个数据包应答,就能够持续发送下一个数据包错误处理累计应答 发送数据包失落 若发送方发送了一批数据包,两头的某个数据包失落,那么接管方回复应答时ACK会回复失落的那个数据包,这样接管方就晓得失落的数据包是哪一个,因而能够从新发送;应答报文失落 若接管方返回的这一组数据包中,某一个应答报文失落了,只有最初一个应答报文发送胜利了,接管方就晓得这个数据包的其实是收到了的窗口大小tcp头里的字段window 接管方通过这个字段通知接管方本人还有多少缓冲区能够接收数据,发送方就能够依据接管方的解决来发送数据,免得导致接管方解决不过去,因而窗口的大小是由接管方决定的接管方和发送方的窗口 接管方和发送方的窗口大小根本相等,因为发送方的窗口大小取决于接管方,当接管方解决能力快,窗口变大,通过tcp报文中的window字段通知接管方,若传输过程中呈现了提早,所以这时两个窗口大小不统一拥塞管制概念流量管制是防止发送方填满接管方的缓存,但若因为其余主机之间的通信造成网络拥挤,会有超时和丢包产生,这样会导致重传 ,网络累赘会更大,进入恶性循环,所以tcp不能疏忽网络上产生的事,当网络产生拥挤时,它会升高数据的发送量。拥塞管制的目标就是防止发送方的数据填满整个网络拥塞窗口cwnd发送窗口swnd和接管窗口rwnd是约等于的关系,有了拥塞窗口的概念后,发送窗口swnd=min(cwnd, rwnd) 网络中没有呈现拥塞,cwnd会增大,反之会减小判断网络拥塞的办法 产生超时重传相干算法 慢启动 tcp刚建设连贯实现,会有个慢启动的过程,一点一点进步发送数据包的数量每接管到一个ack,cwnd大小就会加1,初始化时,cwnd大小为1,即cwnd大小按指数级增长ssthreshold,slow start thresold,慢启动门限 当cwnd < ssthreshold时,会采纳慢启动算法当cwnd >= ssthreshold时,会应用拥塞防止算法拥塞防止 每收到一个ack,cwnd减少1/cwnd。即囤积了cwnd这么多个包后,一次性发送过来。之后都会这样发送,cwnd按线性增长当始终这么增长,会缓缓进入拥塞情况,于是开始呈现丢包景象,这时须要对失落的数据进行重传,当触发了重传机制也就进入了拥塞产生算法拥塞产生 超时重传 ssthreshold设为cwnd/2cwnd设为1即一旦产生超时重传就从新进入慢启动疾速重传 当接管方发现丢了一个两头包时,会发送三次失落包的ack,发送方收到后就会疾速重传失落的包tcp认为这时候拥塞并不重大,只丢了一小部分包,于是 cwnd = cwnd/2ssthreshold变为cwnd而后进入疾速复原算法疾速复原 cwnd = ssthresold+3重传失落的数据包如果再收到反复的ack,那么cwnd+1收到新的ack后,cwnd变为ssthreshold,而后进入拥塞防止算法流量管制概念流量管制是基于滑动窗口实现的,tcp通过让接管方指明心愿从发送方接管的数据大小(窗口大小)来进行流量管制问题形容 接管方收到了太多数据,临时不能接收数据了,于是返回了window大小为0发送方发现window大小为0,于是临时不再发送数据包了接管方解决完数据,能够持续解决了,于是在之前已解决完的数据包的应答报文中更新窗口大小,然而该应答报文失落了,导致接管方没能收到,于是就始终不发送新的数据包了,呈现了死锁解决办法 tcp为每个连贯设定一个继续计时器,只有发动连贯的一方从对方收到零窗口告诉,就启动计时器;如果继续计时器超时,就会发送窗口探测报文,对方会给出本人当初接管窗口的大小窗口探测次数个别为3次,每次大概30-60秒,如果三次后窗口还是0,有的tcp实现会发动RST报文来中断连贯糊涂窗口综合症发送方 发送方尽管晓得窗口很大,然而每次都只发送很少的数据接管方 接管方太忙,每次都只能从window中取出很少的数据,而后告诉发送方,这样发送方每次也只发送很少的数据问题 每次都只传输小包,效率低解决办法 让接管方不告诉小窗口给发送方 当窗口大小小于min(mss,(缓存空间/2))时,就会向发送方告诉窗口为0,阻止发送方后续发送数据过去 注mss,Maximum Segment Size,最大报文长度,MSS是TCP报文段中的数据字段的最大长度,不包含TCP首部的长度让发送方不发送小包 Nagel算法 发送条件 等到窗口大小>=mss或数据大小>=mss收到之前发送数据的ack应答满足发送条件的两点才会发送设置敞开 Nagel算法默认开启,若想要敞开,须要在socket设置TCP_NODELAY来敞开。没有全局参数,须要每个利用依据本人的特点来敞开

December 6, 2020 · 1 min · jiezi

关于tcp:网络tcpip详解

长文是对TCP IP的分析归类总结,就本人的教训再次回顾IP协定而写的演绎性笔记,助力初学者把握。文有不妥之处,请查看原文并留言告知,谢谢! 如果对网络工程根底不牢,倡议通读《细说OSI七层协定模型及OSI参考模型中的数据封装过程?》 上面就是TCP/IP(Transmission Control Protoco/Internet Protocol )协定头部的格局,是了解其它内容的根底,就关键字段做一些阐明 Source Port和Destination Port:别离占用16位,示意源端口号和目标端口号;用于区别主机中的不同过程,而IP地址是用来辨别不同的主机的,源端口号和目标端口号配合上IP首部中的源IP地址和目标IP地址就能惟一的确定一个TCP连贯;Sequence Number:TCP连贯中传送的字节流中的每个字节都按程序编号,用来标识从TCP发送端向TCP收收端发送的数据字节流,它示意在这个报文段中的的第一个数据字节在数据流中的序号;次要用来解决网络报乱序的问题;Acknowledgment Number:冀望收到对方下一个报文的第一个数据字节的序号个序号,因而,确认序号该当是上次已胜利收到数据字节序号加1。不过,只有当标记位中的ACK标记(上面介绍)为1时该确认序列号的字段才无效。次要用来解决不丢包的问题;Offset:它指出TCP报文的数据间隔TCP报文段的起始处有多远,给出首部中32 bit字的数目,须要这个值是因为任选字段的长度是可变的。这个字段占4bit(最多能示意15个32bit的的字,即4*15=60个字节的首部长度),因而TCP最多有60字节的首部。然而,没有任选字段,失常的长度是20字节;TCP Flags:TCP首部中有6个标记比特,它们中的多个可同时被设置为1,次要是用于操控TCP的状态机的,顺次为URG,ACK,PSH,RST,FIN。每个标记位的意思如下:SYN (Synchronize Sequence Numbers)-同步序列编号-同步标签The segment is a request to synchronize sequence numbers and establish a connection. The sequence number field contains the sender's initial sequence number. 该标记仅在三次握手建设TCP连贯时无效。它提醒TCP连贯的服务端查看序列编号,该序列编号为TCP连贯初始端(个别是客户端)的初始序列编号。在这里,能够把TCP序列编号看作是一个范畴从0到4,294,967,295的32位计数器。通过TCP连贯替换的数据中每一个字节都通过序列编号。在TCP报头中的序列编号栏包含了TCP分段中第一个字节的序列编号。 在连贯建设时用来同步序号。当SYN=1而ACK=0时,表明这是一个连贯申请报文。对方若批准建设连贯,则应在响应报文中使SYN=1和ACK=1. 因而, SYN置1就示意这是一个连贯申请或连贯承受报文。 ACK (Acknowledgement Number)-确认编号-确认标记The segment carries an acknowledgement and the value of the acknowledgement number field is valid and contains the next sequence number that is expected from the receiver. ...

November 12, 2020 · 4 min · jiezi

关于tcp:TCP和UDP详解

本篇文章次要是从运输层协定概述、UDP、TCP、牢靠传输的工作原理、TCP首部格局、TCP牢靠传输的实现、TCP流量管制、TCP的拥塞管制、TCP的连贯治理这几个方面进行解析。不对之处还望指出,喜爱的能够点赞关注一下,谢谢。 一、运输层协定概述 1.过程之间的通信 从通信和信息处理的角度看,运输层向它下面的应用层提供通信服务,它属于面向通信局部的最高层,同时也是用户性能中的最低层。当两台主机应用网络的外围局部的性能进行点对点通信的时候,只有位于边缘局部的主机的协定栈才有运输层,而网络外围的路由器在转发的时候只有用到下三层的性能。 利用过程之间的通信: 两个主机进行通信实际上就是两个主机中的利用过程相互通信。利用过程之间的通信又称为端到端的通信。 输层的一个很重要的性能就是复用和分用。应用层不同过程的报文通过不同的端口向下交到运输层,再往下就共用网络层提供的服务。“运输层提供利用过程间的逻辑通信”。“逻辑通信”的意思是:运输层之间的通信如同是沿程度方向传送数据。但事实上这两个运输层之间并没有一条程度方向的物理连贯。 运输层的次要性能: 运输层为利用过程之间提供端到端的逻辑通信(但网络层是为主机之间提供逻辑通信)。运输层还要对收到的报文进行过错检测。运输层须要有两种不同的运输协定,即面向连贯的 TCP 和无连贯的 UDP。两种不同的运输协定: 运输层向高层用户屏蔽了上面网络外围的细节(如网络拓扑、所采纳的路由抉择协定等),它使利用过程看见的就是如同在两个运- 输层实体之间有一条端到端的逻辑通信信道。当运输层采纳面向连贯的 TCP 协定时,只管上面的网络是不牢靠的(只提供尽最大致力服务),但这种逻辑通信信道就相当于一条全双工的牢靠信道。当运输层采纳无连贯的 UDP 协定时,这种逻辑通信信道是一条不牢靠信道。2.运输层的两个次要协定 TCP/IP 的运输层有两个不同的协定: (1) 用户数据报协定 UDP(User Datagram Protocol)(2) 传输控制协议 TCP(Transmission Control Protocol)TCP与UDP: 两个对等运输实体在通信时传送的数据单位叫作运输协定数据单元 TPDU (Transport Protocol Data Unit)。TCP 传送的数据单位协定是 TCP 报文段(segment)UDP 传送的数据单位协定是 UDP 报文或用户数据报。 UDP 在传送数据之前不须要先建设连贯。对方的运输层在收到 UDP 报文后,不须要给出任何确认。尽管 UDP 不提供牢靠交付,但在某些状况下 UDP 是一种最无效的工作形式。TCP 则提供面向连贯的服务。TCP 不提供播送或多播服务。因为 TCP 要提供牢靠的、面向连贯的运输服务,因而不可避免地减少了许多的开销。这不仅使协定数据单元的首部增大很多,还要占用许多的处理机资源。3.运输层的端口 运行在计算机中的过程是用过程标识符来标记的。运行在应用层的各种利用过程却不该当让计算机操作系统指派它的过程标识符。这是因为在因特网上应用的计算机的操作系统品种很多,而不同的操作系统又应用不同格局的过程标识符。为了使运行不同操作系统的计算机的利用过程可能相互通信,就必须用对立的办法对 TCP/IP 体系的利用过程进行标记。端口号(protocol port number),简称为端口(port): 解决这个问题的办法就是在运输层应用协定端口号(protocol port number),或通常简称为端口(port)。尽管通信的起点是利用过程,但咱们能够把端口设想是通信的起点,因为咱们只有把要传送的报文交到目标主机的某一个适合的目标端口,剩下的工作(即最初交付目标过程)就由 TCP 来实现。软件端口与硬件端口: 在协定栈层间的形象的协定端口是软件端口。路由器或交换机上的端口是硬件端口。硬件端口是不同硬件设施进行交互的接口,而软件端口是应用层的各种协定过程与运输实体进行层间交互的一种地址。TCP 的端口 : 端口用一个 16 位端口号进行标记。端口号只具备本地意义,即端口号只是为了标记本计算机应用层中的各过程。在因特网中不同计算机的雷同端口号是没有分割的。三类端口号: ...

November 6, 2020 · 4 min · jiezi

关于tcp:计算机TCPIP面试10连问你能顶住几道

本文整顿了一些TCP/IP协定簇中须要必知必会的十大问题,既是面试高频问题,又是程序员必备根底素养。 TCP/IP十个问题 TCP/IP十个问题 一、TCP/IP模型TCP/IP协定模型(Transmission Control Protocol/Internet Protocol),蕴含了一系列形成互联网根底的网络协议,是Internet的外围协定。 基于TCP/IP的参考模型将协定分成四个档次,它们别离是链路层、网络层、传输层和应用层。下图示意TCP/IP模型与OSI模型各层的对照关系。 TCP/IP协定族依照档次由上到下,层层包装。最下面的是应用层,这外面有http,ftp,等等咱们相熟的协定。而第二层则是传输层,驰名的TCP和UDP协定就在这个档次。第三层是网络层,IP协定就在这里,它负责对数据加上IP地址和其余的数据以确定传输的指标。第四层是数据链路层,这个档次为待传送的数据退出一个以太网协定头,并进行CRC编码,为最初的数据传输做筹备。 上图分明地示意了TCP/IP协定中每个层的作用,而TCP/IP协定通信的过程其实就对应着数据入栈与出栈的过程。入栈的过程,数据发送方每层一直地封装首部与尾部,增加一些传输的信息,确保能传输到目的地。出栈的过程,数据接管方每层一直地拆除首部与尾部,失去最终传输的数据。 上图以HTTP协定为例,具体阐明。 二、数据链路层物理层负责0、1比特流与物理设施电压高下、光的闪灭之间的调换。数据链路层负责将0、1序列划分为数据帧从一个节点传输到邻近的另一个节点,这些节点是通过MAC来惟一标识的(MAC,物理地址,一个主机会有一个MAC地址)。 封装成帧: 把网络层数据报加头和尾,封装成帧,帧头中包含源MAC地址和目标MAC地址。通明传输:零比特填充、转义字符。牢靠传输: 在出错率很低的链路上很少用,然而无线链路WLAN会保障牢靠传输。过错检测(CRC):接收者检测谬误,如果发现过错,抛弃该帧。三、网络层1.IP协定IP协定是TCP/IP协定的外围,所有的TCP,UDP,IMCP,IGMP的数据都以IP数据格式传输。要留神的是,IP不是牢靠的协定,这是说,IP协定没有提供一种数据未传播当前的解决机制,这被认为是下层协定:TCP或UDP要做的事件。 1.1 IP地址在数据链路层中咱们个别通过MAC地址来辨认不同的节点,而在IP层咱们也要有一个相似的地址标识,这就是IP地址。 32位IP地址分为网络位和地址位,这样做能够缩小路由器中路由表记录的数目,有了网络地址,就能够限定领有雷同网络地址的终端都在同一个范畴内,那么路由表只须要保护一条这个网络地址的方向,就能够找到相应的这些终端了。 A类IP地址: 0.0.0.0~127.0.0.0  B类IP地址:128.0.0.1~191.255.0.0  C类IP地址:192.168.0.0~239.255.255.01.2 IP协定头 这里只介绍:八位的TTL字段。这个字段规定该数据包在穿过多少个路由之后才会被摈弃。某个IP数据包每穿过一个路由器,该数据包的TTL数值就会缩小1,当该数据包的TTL成为零,它就会被主动摈弃。 这个字段的最大值也就是255,也就是说一个协定包也就在路由器外面穿行255次就会被抛弃了,依据零碎的不同,这个数字也不一样,个别是32或者是64。 2.ARP及RARP协定ARP 是依据IP地址获取MAC地址的一种协定。 ARP(地址解析)协定是一种解析协定,原本主机是齐全不晓得这个IP对应的是哪个主机的哪个接口,当主机要发送一个IP包的时候,会首先查一下本人的ARP高速缓存(就是一个IP-MAC地址对应表缓存)。 如果查问的IP-MAC值对不存在,那么主机就向网络发送一个ARP协定播送包,这个播送包外面就有待查问的IP地址,而间接收到这份播送的包的所有主机都会查问本人的IP地址,如果收到播送包的某一个主机发现自己符合条件,那么就筹备好一个蕴含本人的MAC地址的ARP包传送给发送ARP播送的主机。 而播送主机拿到ARP包后会更新本人的ARP缓存(就是寄存IP-MAC对应表的中央)。发送播送的主机就会用新的ARP缓存数据筹备好数据链路层的的数据包发送工作。 RARP协定的工作与此相反,不做赘述。 3. ICMP协定IP协定并不是一个牢靠的协定,它不保证数据被送达,那么,天然的,保证数据送达的工作应该由其余的模块来实现。其中一个重要的模块就是ICMP(网络管制报文)协定。ICMP不是高层协定,而是IP层的协定。 当传送IP数据包产生谬误。比方主机不可达,路由不可达等等,ICMP协定将会把错误信息封包,而后传送回给主机。给主机一个处理错误的机会,这也就是为什么说建设在IP层以上的协定是可能做到平安的起因。 四、pingping能够说是ICMP的最驰名的利用,是TCP/IP协定的一部分。利用“ping”命令能够查看网络是否连通,能够很好地帮忙咱们剖析和断定网络故障。 例如:当咱们某一个网站上不去的时候。通常会ping一下这个网站。ping会回显出一些有用的信息。个别的信息如下: ping这个单词源自声纳定位,而这个程序的作用也的确如此,它利用ICMP协定包来侦测另一个主机是否可达。原理是用类型码为0的ICMP发请求,受到申请的主机则用类型码为8的ICMP回应。 ping程序来计算间隔时间,并计算有多少个包被送达。用户就能够判断网络大抵的状况。咱们能够看到, ping给进去了传送的工夫和TTL的数据。 五、TracerouteTraceroute是用来侦测主机到目标主机之间所经路由状况的重要工具,也是最便当的工具。 Traceroute的原理是十分十分的有意思,它收到到目标主机的IP后,首先给目标主机发送一个TTL=1的UDP数据包,而通过的第一个路由器收到这个数据包当前,就主动把TTL减1,而TTL变为0当前,路由器就把这个包给摈弃了,并同时产生一个主机不可达的ICMP数据报给主机。主机收到这个数据报当前再发一个TTL=2的UDP数据报给目标主机,而后刺激第二个路由器给主机发ICMP数据报。如此往返直到达到目标主机。这样,traceroute就拿到了所有的路由器IP。 六、TCP/UDPTCP/UDP都是是传输层协定,然而两者具备不同的个性,同时也具备不同的利用场景,上面以图表的模式比照剖析。 面向报文面向报文的传输方式是应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。因而,应用程序必须抉择适合大小的报文。若报文太长,则IP层须要分片,升高效率。若太短,会是IP太小。 面向字节流面向字节流的话,尽管应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序看成是一连串的无构造的字节流。TCP有一个缓冲,当应用程序传送的数据块太长,TCP就能够把它划分短一些再传送。 对于拥塞管制,流量管制,是TCP的重点,前面解说。 TCP和UDP协定的一些利用 什么时候应该应用TCP?当对网络通讯品质有要求的时候,比方:整个数据要准确无误的传递给对方,这往往用于一些要求牢靠的利用,比方HTTP、HTTPS、FTP等传输文件的协定,POP、SMTP等邮件传输的协定。 什么时候应该应用UDP?当对网络通讯品质要求不高的时候,要求网络通讯速度能尽量的快,这时就能够应用UDP。 七、DNSDNS(Domain NameSystem,域名零碎),因特网上作为域名和IP地址互相映射的一个分布式数据库,可能使用户更不便的拜访互联网,而不必去记住可能被机器间接读取的IP数串。通过主机名,最终失去该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。DNS协定运行在UDP协定之上,应用端口号53。 八、TCP连贯的建设与终止1.三次握手TCP是面向连贯的,无论哪一方向另一方发送数据之前,都必须先在单方之间建设一条连贯。在TCP/IP协定中,TCP协定提供牢靠的连贯服务,连贯是通过三次握手进行初始化的。三次握手的目标是同步连贯单方的序列号和确认号并替换TCP窗口大小信息。 第一次握手: 建设连贯。客户端发送连贯申请报文段,将SYN地位为1,SequenceNumber为x;而后,客户端进入SYN_SEND状态,期待服务器的确认; 第二次握手: 服务器收到SYN报文段。服务器收到客户端的SYN报文段,须要对这个SYN报文段进行确认,设置Acknowledgment Number为x+1(Sequence Number+1);同时,本人本人还要发送SYN申请信息,将SYN地位为1,SequenceNumber为y;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态; 第三次握手: 客户端收到服务器的SYN+ACK报文段。而后将AcknowledgmentNumber设置为y+1,向服务器发送ACK报文段,这个报文段发送结束当前,客户端和服务器端都进入ESTABLISHED状态,实现TCP三次握手。 为什么要三次握手?为了避免已生效的连贯申请报文段忽然又传送到了服务端,因此产生谬误。 具体例子:“已生效的连贯申请报文段”的产生在这样一种状况下:client收回的第一个连贯申请报文段并没有失落,而是在某个网络结点长时间的滞留了,以至延误到连贯开释当前的某个工夫才达到server。原本这是一个早已生效的报文段。但server收到此生效的连贯申请报文段后,就误认为是client再次收回的一个新的连贯申请。于是就向client收回确认报文段,批准建设连贯。假如不采纳“三次握手”,那么只有server收回确认,新的连贯就建设了。因为当初client并没有收回建设连贯的申请,因而不会理会server的确认,也不会向server发送数据。但server却认为新的运输连贯曾经建设,并始终期待client发来数据。这样,server的很多资源就白白浪费掉了。采纳“三次握手”的方法能够避免上述景象产生。例如方才那种状况,client不会向server的确认收回确认。server因为收不到确认,就晓得client并没有要求建设连贯。” 2.四次挥手当客户端和服务器通过三次握手建设了TCP连贯当前,当数据传送结束,必定是要断开TCP连贯的啊。那对于TCP的断开连接,这里就有了神秘的“四次离别”。 第一次离别: 主机1(能够使客户端,也能够是服务器端),设置SequenceNumber,向主机2发送一个FIN报文段;此时,主机1进入FIN_WAIT_1状态;这示意主机1没有数据要发送给主机2了; ...

November 5, 2020 · 1 min · jiezi

关于tcp:TCP踩坑TCP连接仅能发送前几条数据的问题

写在后面:因为这次问题以出其不意的形式自行隐没了,这篇文章可能仅仅为你提供一份排查思路。 问题最近在我的项目中遇到了一个问题:TCP建设连贯后,只能传输固定无限N条(常量)报文。 发送服务的代码曾经久经应用,可以信赖。然而建设连贯,发送N条数据后,发现收不到对方的响应。 排查在重启发送服务的过程中发现,每次服务整体重启,或是TCP连贯超时断开重连,新发送的前N条TCP报文都有响应。之后,调整了发送报文的频率,发现高频率下发送报文的数量N不变,看起来像是短时间内把报文发送的额度“用尽”了。反过来说,在TCP连贯建设后,先期待一段时间内不发送数据,之后也能发送N条有响应的报文。最初应用tcpdump工具抓包,观测到:在发送报文前的TCP三次握手失常,前N条报文失常,第N+1条报文会以毫秒级疾速多次重发,且首次重发工夫极短,大概在首次发送报文的几十毫秒内就会开始重发。此外,在非内网环境下,对方平台失常响应。初步论断①每次从新建设TCP连贯,可发送数据量重置。②工夫窗口不是影响发送数据量的次要因素,数据量才是。③并非对方不发送响应,而是我方的数据发送不过来,很可能与网络环境无关。 持续排查接下来为了管制网络环境这一变量,抉择将服务部署在新服务器上测试。但因为服务器群部署在内网上,申请权限耽误了几天。 测试后果出其不意:不仅新服务器上的服务能够失常应用,原服务器上的服务也恢复正常了。而且,长期写的TCP报文发送器也体现得一切正常。 懵了呀。 问题出在哪儿?事实上,对于这种像是小精灵一样隐没的问题,当初也没方法确定问题到底出在哪儿。只能靠目前的信息,做出揣测: 依据后面屡次控制变量的后果,很有可能是防火墙协定权限带来的问题。 公司内网的防火墙须要权限申请能力通过,而在申请时,须要抉择TCP、UDP、HTTP协定中的一项。假如开明人员搞错了协定内容,那么依据DPI (Deep Packet Inspection) 深度包检测技术,防火墙可能对非HTTP协定的流量进行拦挡。 这解释了为什么第N+1条报文会以毫秒级疾速多次重发——因为它在本地防火墙就被拦挡,这个失败速度是十分快的。 另外,为什么有N条报文能够发送?一个可能的解释是:HTTP连贯须要TCP进行三次握手,而防火墙为三次握手设计了一些容忍度,这些容忍度体现为能够发送进来的N条报文。 那为什么隔了几天当前两台服务器都恢复正常了?这个问题大略是没法失去一个确切答案了,只能做一个揣测:防火墙管理人员在看到第二张权限申请单后,意识到第一张开错了协定,偷偷改过了……预先总结在排查中,控制变量法是无力的工具,能够从最有可能的中央开始控制变量,进步排查效率。适合的重启能够抓到问题的“刷新点”,帮忙定位问题。如果失败工夫较短,思考本地限度因素大胆狐疑,小心求证。

November 4, 2020 · 1 min · jiezi

关于tcp:TCP-keepalive-概述译

什么是 TCP keepaliveTCP keepalive 概念很简略:当建设一个TCP连贯时,会设置了一系列与该连贯相干的定时器。其中有些定时器跟解决 keepalive 相干,在 keepalive 定时器倒计时变为零时,会给连贯的另一方发送一个 keepalive 探针包(probe packet),包内没有数据且设置了 ACK 标识。 如果收到一个 keepalive 探针包的响应,阐明连贯是失常和无效的。TCP 能够解决只有协定头,但理论数据长度为零的数据包。这种机制是有用的,如果其余主机断开了连贯,你能够及时留神到连贯的断开。 如果 keepalive 探针没有响应,那么能够认为连贯不是无效的,进而能够采取正确的操作。 TCP keepalive 的利用场景KeepAlive 是非侵入性的,大多数状况下开启 keepalive 不会有其余危险。须要留神的是,这样做会带来额定的网络开销,例如会影响到路由器和防火墙。 检测理论断掉的连贯维持客户端与 NAT 间的沉闷网络包检测理论断掉的连贯构想 A、B 两端建有 TCP 连贯:最开始是三次握手,A 发送 SYN 报文段给 B,B 响应 SYN/ACK 给 A,最初 A 发送 ACK 给 B。当初两端处于 established 状态,都在期待对方发送数据。如果此时 B 电源被拔掉,在没有发送任何数据的告诉 A 的状况下,B 曾经断开了连贯。A 曾经做好了筹备接收数据,但不晓得 B 曾经宕机。之后 B 复原供电并且零碎重启,A 认为跟 B 的连贯还是失常的。此时 A 试图给 B 发送数据,B 会回复 RST 包,这样 A 才敞开这个连贯。 ...

October 29, 2020 · 1 min · jiezi

关于tcp:简述TCP三次握手和四次挥手过程

TCP握手协定 在TCP/IP协定中,TCP协定提供牢靠的连贯服务,采纳三次握手建设一个连贯.第一次握手:建设连贯时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,期待服务器确认; SYN:同步序列编号(Synchronize Sequence Numbers)第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时本人也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态; 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送结束,客户端和服务器进入ESTABLISHED状态,实现三次握手. 实现三次握手,客户端与服务器开始传送数据.A与B建设TCP连贯时:首先A向B发SYN(同步申请),而后B回复SYN+ACK(同步申请应答),最初A回复ACK确认,这样TCP的一次连贯(三次握手)的过程就建设了! 一、TCP报文格式 TCP/IP协定的详细信息参看《TCP/IP协定详解》三卷本。上面是TCP报文格式图: 图1 TCP报文格式 上图中有几个字段须要重点介绍下: (1)序号:Seq序号,占32位,用来标识从TCP源端向目标端发送的字节流,发起方发送数据时对此进行标记。 (2)确认序号:Ack序号,占32位,只有ACK标记位为1时,确认序号字段才无效,Ack=Seq+1。 (3)标记位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含意如下: (A)URG:紧急指针(urgent pointer)无效。 (B)ACK:确认序号无效。 (C)PSH:接管方应该尽快将这个报文交给应用层。 (D)RST:重置连贯。 (E)SYN:发动一个新连贯。 (F)FIN:开释一个连贯。 须要留神的是: (A)不要将确认序号Ack与标记位中的ACK搞混了。 (B)确认方Ack=发起方Req+1,两端配对。 二、三次握手 所谓三次握手(Three-Way Handshake)即建设TCP连贯,就是指建设一个TCP连贯时,须要客户端和服务端总共发送3个包以确认连贯的建设。 在socket编程中, 这一过程由客户端执行connect来触发,整个流程如下图所示: 图2 TCP三次握手 (1)第一次握手:Client将标记位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,期待Server确认。 (2)第二次握手:Server收到数据包后由标记位SYN=1晓得Client申请建设连贯,Server将标记位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连贯申请,Server进入SYN_RCVD状态。 (3)第三次握手:Client收到确认后,查看ack是否为J+1,ACK是否为1,如果正确则将标记位ACK置为1,ack=K+1,并将该数据包发送给Server,Server查看ack是否为K+1,ACK是否为1,如果正确则连贯建设胜利,Client和Server进入ESTABLISHED状态,实现三次握手,随后Client与Server之间能够开始传输数据了。 SYN攻打: 在三次握手过程中,Server发送SYN-ACK之后,收到Client的ACK之前的TCP连贯称为半连贯(half-open connect),此时Server处于SYN_RCVD状态,当收到ACK后,Server转入ESTABLISHED状态。SYN攻打就是Client在短时间内伪造大量不存在的IP地址,并向Server一直地发送SYN包,Server回复确认包,并期待Client的确认,因为源地址是不存在的,因而,Server须要一直重发直至超时,这些伪造的SYN包将产工夫占用未连贯队列,导致失常的SYN申请因为队列满而被抛弃,从而引起网络梗塞甚至零碎瘫痪。SYN攻打时一种典型的DDOS攻打,检测SYN攻打的形式非常简单,即当Server上有大量半连贯状态且源IP地址是随机的,则能够判定受到SYN攻打了,应用如下命令能够让之现行: #netstat -nap | grep SYN_RECV三、四次挥手 三次握手耳熟能详,四次挥手预计就 , 所谓四次挥手(Four-Way Wavehand )即终止TCP连贯,就是指断开一个TCP连贯时,须要客户端和服务端总共发送4个包以确认连贯的断开。 在socket编程中, 这一过程 由客户端或服务端任一方执行close来触发,整个流程如下图所示: 图3 TCP四次挥手 因为TCP连贯时全双工的,因而,每个方向都必须要独自进行敞开,这一准则是当一方实现数据发送工作后,发送一个FIN来终止这一方向的连贯,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,然而在这个TCP连贯上依然可能发送数据,直到这一方向也发送了FIN。首先进行敞开的一方将执行被动敞开,而另一方则执行被动敞开,上图形容的即是如此。        (1)第一次挥手:Client发送一个FIN,用来敞开Client到Server的数据传送,Client进入FIN_WAIT_1状态 。 (2)第二次挥手:Server收到FIN后 ,发送一个ACK给Client,确认序号为收到序号+1(与SYN雷同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态 。        (3)第三次挥手:Server发送一个FIN,用来敞开Server到Client的数据传送,Server进入LAST_ACK状态。 (4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1 , Server进入CLOSED状态, 实现四次挥手。 下面是一方被动敞开,另一方被动敞开的状况,理论中还会呈现同时发动被动敞开的状况,具体流程如下图: 图4 同时挥手 流程和状态在上图中曾经很明了了,在此不再赘述,能够参考后面的四次挥手解析步骤。四、附注        对于三次握手与四次挥手通常都会有典型的面试题,在此提出供有需要的XDJM们参考:        (1)三次握手是什么或者流程?四次握手呢?答案后面剖析就是。        (2)为什么建设连贯是三次握手,而敞开连贯却是四次挥手呢?        这是因为服务端在LISTEN状态下,收到建设连贯申请的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而敞开连贯时,当收到对方的FIN报文时,仅仅示意对方不再发送数据了然而还能接收数据,己方也未必全副数据都发送给对方了,所以己方能够立刻close,也能够发送一些数据给对方后,再发送FIN报文给对方来表示同意当初敞开连贯,因而,己方ACK和FIN个别都会离开发送。 ...

September 28, 2020 · 1 min · jiezi

关于tcp:tcpcopy工具的使用

工具调试:线上服务器,启动tcpcopy: ./tcpcopy -x 8090-192.168.57.126:8090 -s 192.168.57.128 -c 10.5.214.x 测试服务器,增加路由: route add -net 10.5.214.0 netmask 255.255.255.0 gw 192.168.57.128 辅助服务器,启动监听: ./intercept -i eth0 -F 'tcp and src port 8090' –d 留神:具体命令及阐明请参考《tcpcopy装置教程》文档 1 应用tcpdump实时复制流量通过该形式,能够实时的获取线上的流量并在测试环境施行压测。 实时获取流量命令: ./tcpcopy -x 8090-192.168.57.126:8090 -s 192.168.57.128 -c 10.5.214.x –n 5 其中: 8090为线上服务本机监控的8090端口 192.168.57.126:8090 为测试环境的地址及端口 -s 192.168.57.128指辅助服务器 (_intercept__用于丢包_) -c 10.5.214.x 为将客户端的申请起源ip批改为指定的某些ip,不便日志收集、治理和查找 -n 5 指流量放大倍数 2 应用tcpdump生成文件进行离线申请重做2.1 抓包生成离线文件通过该形式,能够将线上服务器的申请抓取保留成一个文件,而后将该文件放在测试服务器上进行申请回访,实现离线压测 线上服务器抓取申请保留至文件命令: tcpdump -i eth0 tcp and port 80 -s 0 -w online.pcap ...

September 17, 2020 · 2 min · jiezi

关于tcp:计算机网络基础二十一传输层TCP连接的四次挥手

文章内容概览 TCP的四次挥手上一篇文章中分享了TCP的三次握手,本文是相同的过程,是对TCP连贯的开释 TCP四次挥手过程还是假如这里有一个发送方结算机和一个接管方计算机,纵向为时间轴。连贯失常的时候,单方是能够始终进行数据传输的。假如数据传输实现了,此时就会进行TCP连贯的开释。假如发送方被动的进行了连贯的开释 第一次挥手发送方发送第一次挥手的报文,报文内容: FIN=1:该标记示意须要开释连贯 seq=u:同步本人的序列号给接管方 此时发送方就进入了连贯完结的第一个期待状态(FIN-WAIT-1) 第二次挥手接管方在收到发送方的断开连接申请之后,它也会发送一个报文去确认,确认对方给我发送的序列号我曾经收到了,确认报文内容是: ACK=1:示意这个报文曾经确认 seq=v:同步本身的序列号 ack=u+1:确认号是u+1,示意接管方冀望接管到接发送方的序列号是u+1的数据 发送方接管到确认报文之后,就进入了连贯完结的第二个期待状态(FIN-WAIT-2)。而接管方在发送了第一个确认报文之后就进入了敞开期待状态(CLOSE-WAIT) 这个时候其实接管方还是能够进行数据的发送的,因为开释连贯的申请是发送方发动的,示意说发送方的数据发送实现了,然而接管方可能还没有发送实现 第三次挥手接管方发送完第一个确认报文之后,又会发送一个新的报文,这个报文会携带FIN=1的标记,示意它也能够进行连贯开释了,并且里边会携带一个ack,示意反复的对发送方发送的序列号进行确认,该报文中的残缺内容: FIN=1:该标记示意须要开释连贯,是一个开释连贯的申请 ACK=1:示意确认报文曾经收到 seq=w:给发送方同步本人的序列号 ack=u+1:确认号是u+1,示意接管方冀望接管到接发送方的序列号是u+1的数据 第四次挥手发送方接管到接管方的确认报文之后,又会发送一个确认报文,确认接管方发送的报文我曾经收到了,此时能够开释掉连贯了 在接管方发送断开连接的申请到发送方的确认报文被接管方收到这之间,接管方处于最初确认状态(LAST-ACK)。是为了确认发送方曾经接管到了连贯开释的报文,此时发送方进入了期待计时器状态(TIME-WAIT)。发送方会在这个工夫期待状态中期待一段时间,确保这段时间没有呈现任何的问题,此时才进入敞开状态(CLOSE) 以上便是四次挥手的过程 期待计时器期待计时器,它会期待2MSL(MSL(MAX Segment Lifetime)最长报文段寿命),通常MSL是设置成2min的 咱们晓得每一个TCP连贯都会占用一个端口,在一个连贯状态中,如果想启用另外一个网络过程去复用这个端口的话是不行的,因为这个端口曾经被占用了。在期待计时器这个状态中,连贯是不会开释的,也就是不会开释以后占用的端口。只有在期待计时器状态完结之后才会开释这个端口 其实平时如果在进行TCP编程的时候,会发现,如果你被动的开释了这个连贯,而后马上复用这个端口,其实是不行的。次要是因为被动开释的这一方进入了期待计时器状态,在这个状态中,是不会开释占用的端口的,须要等计时器完结 为什么须要期待计时器?为什么是2MSL?只有发送方发送了第四次挥手的报文之后,就进入可期待状态,在进入期待的时候,最初一个报文是没有进行确认的。这个期待计时器次要是为了确保发送方的ACK能够达到接管方 2MSL是报文能够在网络中存活的最长的工夫,如果在2MSL的工夫里,第四次挥手的报文没有被接管方接管到的话,接管方就会认为,我发送的第二次报文(也就是第三次挥手的报文)没有被发送方接管到,因而接管方会把第三次挥手的报文再发送一次,也就是反复一次第三次挥手。因而发送方会从新的结构一个报文,再次进行第四次挥手,这就是期待计时器的作用,它次要是为了确保第四次挥手的报文能够正确的达到对方,如果没达到,接管方就会从新发送一次第三次挥手的报文 期待计时器其实还有一个作用就是:确保以后连贯的所有报文都曾经过期了(因为最初一个确认断开的报文都曾经过期了,其它的报文必定也曾经过期了)

August 26, 2020 · 1 min · jiezi

关于tcp:tcp三次握手和四次挥手

tcptcp是牢靠通信,tcp通信须要经验 创立连贯(三次握手) + 发送数据 + 断开连接(四次挥手) tcp报文  序号(sequence number),又叫Seq序号,也会全小写seq 确认号(acknowledgement number,又叫Ack序号,也会全小写ack 两者关系:确认方Ack=发起方Seq+1,两端配对 标记位(Flags):用于标记报文目标 SYN(synchronous建设联机) ACK(acknowledgement 确认) PSH(push传送) FIN(finish完结) RST(reset重置) URG(urgent紧急) 三次握手: 第一次握手:客户端向服务器发送连贯申请包,标记位SYN\=1 示意申请连贯,同时把seq = X;第二次握手:服务器收到客户端发过来报文,由 SYN \= 1 晓得客户端要求建设联机。向客户端发送一个蕴含TCP报文,蕴含申请信息SYN = 1 示意服务端也申请连贯,同时把seq = y,也蕴含确认信息ACK = 1示意服务端确认连贯申请,同时把ack = x+1 以备客户端校验 第三次握手:客户端收到服务器发来的包后查看确认序号(ACK)是否正确,以客户端发seq+1为校验规范,即第一次发送的序号加1(X+1);若正确,客户端器发送确认序号ACK = Y+1; 服务器收到确认序号值 ACK\= y+1 即 服务器seq+1 则转换状态为listen,连贯建设胜利,能够传送数据了。 四次挥手: 第一次挥手:客户端给服务器发送TCP包,用来敞开客户端到服务器的数据传送。将标记位FIN\=1 示意申请断开连接,同时把seq = u第二次挥手:服务器收到FIN后,先测验ack \=u+1,发回一个ACK = 1(标记位ACK=1)示意确认断开连接申请,同时把seq = v ,服务器开始断开工作第三次挥手:服务器断开工作实现,发送一个FIN \= 1申请断开连接,ACK=1 (标记位ACK=1)示意确认断开连接申请, 同时把seq =w第四次挥手:客户端收到服务器发送的FIN\=1之后,发回ACK=1(标记位ACK=1)确认敞开申请,同时把ack= w+1 服务器在测验ack\= 服务器seq+1之后敞开连贯,客户端在期待2msl工夫后敞开连贯 ...

August 24, 2020 · 1 min · jiezi

关于tcp:网络基础详解计算机网络不仅类型有三种还有模型分七层

计算机网络计算机网络,是指将处于不同地理位置的具备独立性能的多台计算机,通过通信线路连接起来,在操作系统的网络接口、网络管理软件以及网络通信协定的治理、协调下,实现资源共享和信息传递的计算机系统。 一个计算机网络组成包含传输介质和通信设施,是以传输信息、共享资源为根底目标,应用通信线路将多个计算机连接起来的计算机系统的汇合;从而能够实现泛滥性能独立的计算机之间能够轻松实现地信息的交换与传递,共享硬件、软件的数据资源。 计算机网络依照天文范畴,或者说依照辐射的范畴来划分,能够分为局域网、城域网、广域网; 局域网:(Local Area Network,简称LAN),LAN网络的辐射范畴在10公里以内;这种网络是遍及最广的,平时生存中所说的“网络”指的就是局域网,小到以一个家庭,大到以一个企业,一个商场、一个写字楼、一个学校等为单位;局域网尽管范畴小、但因其用户数少、配置容易,所以把连贯速率很高,在网络高速倒退的明天,网络速率更高,而且还在持续上升。 IEEE的802规范委员会定义了局域网:以太网(Ethernet)、令牌环网(Token Ring)、光纤分布式接口网络(FDDI)、异步传输模式网(ATM)和无线局域网(WLAN)。咱们平时所应用的WIFI便是无线局域网(WLAN)的一种。 城域网:(Metropolitan Area Network , 简称MAN),MAN网络覆盖的范畴在10——100公里, 这种间隔个别就是一个城市,所以称为城域网。定义城域网的是IEEE802.6规范。 与LAN相比,MAN扩大了更长的间隔,连贯的计算机数量也更多,在天文范畴上能够说是 LAN网络的延长。在一个大型城市,一个MAN网络通常连贯着多个LAN网,如连贯政府机构的LAN、医院的LAN、学校的LAN、电信的LAN、公司企业的LAN等等。 城域网多采纳ATM技术做骨干网。ATM是一个用于数据、语音、视频以及多媒体应用程序的高速网络传输办法。但因为ATM的老本太高,所以个别在邮政、银行、医院等政府城域网应用。 留神:这里的ATM一项计算机网络中的技术,可不是取款机。 广域网:(Wide Area Network,简称WAN) 也称远程网,笼罩的范畴要比MAN更广,可达到从几百公里到几千公里。它个别是连贯不同城市,不同国家之间的LAN或者MAN网络。 互联网、因特网、万维网互联网、因特网、万维网,三者关系:互联网蕴含因特网,因特网蕴含万维网。 互联网(internet):但凡能彼此之间通信的设施组成的网络就叫互联网,互联网又能够有广域网、城域网、局域网之分。 因特网(Internet):因特网是互联网的一种,是由千万台设施组成的网络,因而该网络具备肯定的规模;因特网应用TCP/IP协定让不同设施之间的通信,但应用TCP/IP协定通信的网络却并不一定是互联网。 TCP/IP协定由很多协定组成,不同的协定又被放在不同的层;位于应用层的协定就有很多,比方FTP、SMTP、HTTP等,因特网依据这些协定就能提供不同的服务:文件传输服务(FTP)、电子邮件服务(email)、www(万维网)服务等。 万维网(World Wide Web):只有应用层应用了HTTP协定,就称为万维网。 网络分层为了缩小网络设计的复杂性,网络采纳分层设计办法,依照数据的传输过程把网络的整体性能划分为一个个的性能层,每层负责一项具体的工作,而后再把数据传往下一层解决,以此来将负责的网络互联和通信过程简单化。 不同机器上的同一性能层之间采纳雷同的协定实现通信,而同一机器上的相邻性能层之间通过接口进行信息传递和数据交互。 计算机网络是指由通信线路相互连贯的许多自主工作的计算机形成的集合体,各个部件之间以何种规定进行通信,就是网络模型要解决的问题所在。 网络模型个别是指OSI七层参考模型和TCP/IP四层参考模型,前两个模型在网络中利用最为宽泛;而五层模型是业界对OSI和TCP/IP的综合而产生的非官方协定模型,与四层协定次要区别是把网络接口分为了数据链路层和物理层。 开放系统互连参考模型 (Open System Interconnect 简称OSI)是国际标准化组织(ISO)和国内电报电话征询委员会(CCITT)联结制订的开放系统互连参考模型,为开放式互连信息系统提供了一种性能构造的框架。它从低到高别离是:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。 TCP/IP四层参考模型,包含了应用层、运输层(主机到主机)、网际层(网络互联)和网络接口层;TCP/IP是一组用于实现网络互联的通信协议;Internet网络体系结构便是以TCP/IP协定为外围。 网络参考模型各层详情如下: 1. 应用层:application layer 应用层位于OSI参考模型的高层,通过FTP、Telnet、DNS、SMTP、HTTP、SSH等网络协议为用户提供所须要的各种服务。 2. 表示层 :peresentation layer 负责各种资源文件格式(文字、图像、声音、视频等)与网络数据格式(如文件流)间的互相转换。 3. 会话层 :session layer 负责管理通信连贯,包含连贯的建设、断开、连贯放弃多久等 4. 传输层:transport layer 为多个应用层实体提供端到端的通信性能,保障了数据包的程序传送及数据的完整性。该层还定义了两个次要的协定:传输控制协议(TCP)和用户数据报协定(UDP)。 TCP协定提供的是一种牢靠的、通过“三次握手”来连贯的数据传输服务,数据传输可靠性高;UDP协定提供的则是不保障牢靠的(并不是不牢靠)、无连贯的数据传输服务,数据传输性能高;5. 网络层 不同于传输层的端到端的通信,网络层次要解决主机到主机的通信。它所蕴含的协定波及数据包在整个网络上的逻辑传输。通过从新赋予主机一个IP地址来实现对主机的寻址,同时负责数据包在多种网络中的路由。该层有三个次要协定:网际协议(IP)、互联网组治理协定(IGMP)和互联网管制报文协定(ICMP)。 其中,IP协定是网络层最重要的协定,它提供了一个安全可靠、无连贯的数据传递服务。 6. 数据链路层 ...

August 2, 2020 · 1 min · jiezi

关于tcp:网络基础详解计算机网络不仅类型有三种还有模型分七层

计算机网络计算机网络,是指将处于不同地理位置的具备独立性能的多台计算机,通过通信线路连接起来,在操作系统的网络接口、网络管理软件以及网络通信协定的治理、协调下,实现资源共享和信息传递的计算机系统。 一个计算机网络组成包含传输介质和通信设施,是以传输信息、共享资源为根底目标,应用通信线路将多个计算机连接起来的计算机系统的汇合;从而能够实现泛滥性能独立的计算机之间能够轻松实现地信息的交换与传递,共享硬件、软件的数据资源。 计算机网络依照天文范畴,或者说依照辐射的范畴来划分,能够分为局域网、城域网、广域网; 局域网:(Local Area Network,简称LAN),LAN网络的辐射范畴在10公里以内;这种网络是遍及最广的,平时生存中所说的“网络”指的就是局域网,小到以一个家庭,大到以一个企业,一个商场、一个写字楼、一个学校等为单位;局域网尽管范畴小、但因其用户数少、配置容易,所以把连贯速率很高,在网络高速倒退的明天,网络速率更高,而且还在持续上升。 IEEE的802规范委员会定义了局域网:以太网(Ethernet)、令牌环网(Token Ring)、光纤分布式接口网络(FDDI)、异步传输模式网(ATM)和无线局域网(WLAN)。咱们平时所应用的WIFI便是无线局域网(WLAN)的一种。 城域网:(Metropolitan Area Network , 简称MAN),MAN网络覆盖的范畴在10——100公里, 这种间隔个别就是一个城市,所以称为城域网。定义城域网的是IEEE802.6规范。 与LAN相比,MAN扩大了更长的间隔,连贯的计算机数量也更多,在天文范畴上能够说是 LAN网络的延长。在一个大型城市,一个MAN网络通常连贯着多个LAN网,如连贯政府机构的LAN、医院的LAN、学校的LAN、电信的LAN、公司企业的LAN等等。 城域网多采纳ATM技术做骨干网。ATM是一个用于数据、语音、视频以及多媒体应用程序的高速网络传输办法。但因为ATM的老本太高,所以个别在邮政、银行、医院等政府城域网应用。 留神:这里的ATM一项计算机网络中的技术,可不是取款机。 广域网:(Wide Area Network,简称WAN) 也称远程网,笼罩的范畴要比MAN更广,可达到从几百公里到几千公里。它个别是连贯不同城市,不同国家之间的LAN或者MAN网络。 互联网、因特网、万维网互联网、因特网、万维网,三者关系:互联网蕴含因特网,因特网蕴含万维网。 互联网(internet):但凡能彼此之间通信的设施组成的网络就叫互联网,互联网又能够有广域网、城域网、局域网之分。 因特网(Internet):因特网是互联网的一种,是由千万台设施组成的网络,因而该网络具备肯定的规模;因特网应用TCP/IP协定让不同设施之间的通信,但应用TCP/IP协定通信的网络却并不一定是互联网。 TCP/IP协定由很多协定组成,不同的协定又被放在不同的层;位于应用层的协定就有很多,比方FTP、SMTP、HTTP等,因特网依据这些协定就能提供不同的服务:文件传输服务(FTP)、电子邮件服务(email)、www(万维网)服务等。 万维网(World Wide Web):只有应用层应用了HTTP协定,就称为万维网。 网络分层为了缩小网络设计的复杂性,网络采纳分层设计办法,依照数据的传输过程把网络的整体性能划分为一个个的性能层,每层负责一项具体的工作,而后再把数据传往下一层解决,以此来将负责的网络互联和通信过程简单化。 不同机器上的同一性能层之间采纳雷同的协定实现通信,而同一机器上的相邻性能层之间通过接口进行信息传递和数据交互。 计算机网络是指由通信线路相互连贯的许多自主工作的计算机形成的集合体,各个部件之间以何种规定进行通信,就是网络模型要解决的问题所在。 网络模型个别是指OSI七层参考模型和TCP/IP四层参考模型,前两个模型在网络中利用最为宽泛;而五层模型是业界对OSI和TCP/IP的综合而产生的非官方协定模型,与四层协定次要区别是把网络接口分为了数据链路层和物理层。 开放系统互连参考模型 (Open System Interconnect 简称OSI)是国际标准化组织(ISO)和国内电报电话征询委员会(CCITT)联结制订的开放系统互连参考模型,为开放式互连信息系统提供了一种性能构造的框架。它从低到高别离是:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。 TCP/IP四层参考模型,包含了应用层、运输层(主机到主机)、网际层(网络互联)和网络接口层;TCP/IP是一组用于实现网络互联的通信协议;Internet网络体系结构便是以TCP/IP协定为外围。 网络参考模型各层详情如下: 1. 应用层:application layer 应用层位于OSI参考模型的高层,通过FTP、Telnet、DNS、SMTP、HTTP、SSH等网络协议为用户提供所须要的各种服务。 2. 表示层 :peresentation layer 负责各种资源文件格式(文字、图像、声音、视频等)与网络数据格式(如文件流)间的互相转换。 3. 会话层 :session layer 负责管理通信连贯,包含连贯的建设、断开、连贯放弃多久等 4. 传输层:transport layer 为多个应用层实体提供端到端的通信性能,保障了数据包的程序传送及数据的完整性。该层还定义了两个次要的协定:传输控制协议(TCP)和用户数据报协定(UDP)。 TCP协定提供的是一种牢靠的、通过“三次握手”来连贯的数据传输服务,数据传输可靠性高;UDP协定提供的则是不保障牢靠的(并不是不牢靠)、无连贯的数据传输服务,数据传输性能高;5. 网络层 不同于传输层的端到端的通信,网络层次要解决主机到主机的通信。它所蕴含的协定波及数据包在整个网络上的逻辑传输。通过从新赋予主机一个IP地址来实现对主机的寻址,同时负责数据包在多种网络中的路由。该层有三个次要协定:网际协议(IP)、互联网组治理协定(IGMP)和互联网管制报文协定(ICMP)。 其中,IP协定是网络层最重要的协定,它提供了一个安全可靠、无连贯的数据传递服务。 6. 数据链路层 ...

August 2, 2020 · 1 min · jiezi

关于tcp:撸了个多线程断点续传下载器我从中学习到了这些知识

文章曾经收录在 Github.com/niumoo/JavaNotes ,更有 Java 程序员所须要把握的外围常识,欢送Star和指教。 欢送关注我的公众号,文章每周更新。感激看客老爷点进来了,周末闲来无事,想起共事强哥的那句话:“你有没有玩过断点续传?” 过后转念一想,断点续传下载用的的确不少,具体细节嘛,真的没有去思考过啊。这不,思考过后有了这篇文章。感激强哥,让我有了一篇能够水的文章,上面会用纯 Java 无依赖实现一个简略的多线程断点续传下载器。 这篇水文章到底有什么内容呢?先简略列举一下,顺便思考几个问题。 断点续传的原理。重启续传文件时,怎么保障文件的一致性?同一个文件多线程下载如何实现?网速带宽固定,为什么多线程下载能够提速?多线程断点续传会用到哪些常识呢?下面曾经抛出了几个问题,不放思考一下。上面会针对下面的四个问题一一进行解释,当初大多数的服务都能够在线提供,下载应用的场景越来越少,不过这不障碍咱们对原理的探究。 断点续传的原理想要理解断点续传是如何实现的,那么必定是要理解一下 HTTP 协定了。HTTP 协定是互联网上利用最宽泛网络传输协定之一,它基于 TCP/IP 通信协议来传递数据。所以断点续传的神秘也就暗藏在这 HTTP 协定中了。 咱们都晓得 HTTP 申请会有一个 Request header 和 Response header ,就在这申请头和响应头里,有一个和 Range 相干的参数。上面通过百度网盘的 pc 客户端下载链接进行测试。 应用 cURL 查看 response header. 如果你想晓得更多对于 cURL 的用法,能够看我之前的一篇文章 :进来领略下cURL的独门绝技。 $ curl -I http://wppkg.baidupcs.com/issue/netdisk/yunguanjia/BaiduYunGuanjia_7.0.1.1.exeHTTP/1.1 200 OKServer: JSP3/2.0.14Date: Sat, 25 Jul 2020 13:41:55 GMTContent-Type: application/x-msdownloadContent-Length: 65804256Connection: keep-aliveETag: dcd0bfef7d90dbb3de50a26b875143fcLast-Modified: Tue, 07 Jul 2020 13:19:46 GMTExpires: Sat, 25 Jul 2020 14:05:19 GMTAge: 257796Accept-Ranges: bytesCache-Control: max-age=259200Content-Disposition: attachment;filename="BaiduYunGuanjia_7.0.1.1.exe"x-bs-client-ip: MTgwLjc2LjIyLjU0x-bs-file-size: 65804256x-bs-request-id: MTAuMTM0LjM0LjU2Ojg2NDM6NDM4MTUzMTE4NTU3ODc5MTIxNzoyMDIwLTA3LTA3IDIyOjAxOjE1x-bs-meta-crc32: 3545941535Content-MD5: dcd0bfef7d90dbb3de50a26b875143fcsuperfile: 2Ohc-Response-Time: 1 0 0 0 0 0Access-Control-Allow-Origin: *Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS, HEADOhc-Cache-HIT: bj2pbs54 [2], bjbgpcache54 [4]能够看到百度 pc 客户端的 response header 信息有很多,咱们只须要重点关注几个。 ...

July 29, 2020 · 2 min · jiezi

关于tcp:TCPsocket异常情况

在Unix下进行网络编程时,因为网络并非齐全牢靠,会遇到各种协定主流程外产生的各种谬误。而强壮的程序必须思考到这些谬误并正确处理,因而这里总结网络编程中可能产生的常见谬误。 TCP异样流程总体应答超时 在握手,挥手以及消息传递的状态下,若以后发送的报文期待一个应答报文。在规定工夫应答报文没有达到,发送方会重发两次报文(报文重发距离可设置)。若重发三次后仍旧没有收到应答,则向利用返回ETIMEOUT 目标不可达 若报文在传送的过程中,因为找不到路由门路,报文无奈达到等引发了ICMP谬误,发送方会依照上述的形式重发次报文。若重发完结后仍旧没有收到应答,则向利用返回EHOSTUNREACH或者ENETUNREACH 禁止分片 在IPV4中,报文超过了MTU长度会导致分片,而其存在DF(Don't Fragment)标识,示意禁止分片。同时IPV6禁止路由器分片,因而在传送的过程中隐含DF位。在传送过程中设置了DF位而超过了MTU,则会向利用返回EMSGSIZE 阻塞时中断 在零碎执行慢零碎调用(可能被永远阻塞的零碎调用)时阻塞,此时捕捉到某个信号并进行了解决(系统对某些信号有默认解决形式),在没有设置主动重启的状况下,会向利用返回EINTR。 个别应答EINTR的形式是简略的从新调用,但在connect返回EINTR时不能这么做,因为connect波及三次握手的过程,须要应用getsockopt获取连贯状态。 读写时RST 在调用read等阻塞时接管到对端RST信号时,会返回ECONNREST。同时对发送方断开的套接字写时也会返回ECONNRESET 写RST套接字 当过程向收到RST的套接字执行写操作的时候,内核向该过程发送一个SIGPIPE信号,该信号的默认行为是终止过程,因而过程必须捕捉它免得不愿意的被终止 不管过程是捕获了该信号并从信号处理函数中返回,还是简略疏忽该信号,写操作都讲返回EPIPE谬误 握手局部首次握手服务端RST 在客户端第一次握手时,若服务端返回RST报文,立刻向利用返回ECONNREFUSED 握手完结客户端RST 在较为忙碌的服务器中,可能呈现上图客户端刚经验三次握手后随机发送RST报文的状况,posix指出这种状况errno设置为ECONNABORTED,只须要再次调用accept即可。 而在Berkeley的实现中,返回EPROTO谬误,代表协定谬误,是一种致命谬误,由内核把该连贯从已实现连贯套接字队列中开释,若再次调用accept,则不会解决到本次申请,可能导致阻塞。 数据传送局部服务端主机解体 因为客户端无奈收到服务端的任何回应,会重发解决,最终向利用返回的状况可能为应答超时或目标不可达。 若想尽快的检测出主机解体,不被动发送数据也可做到,即套接字选项的SO_KEEPALIVE(相似心跳机制) 挥手局部 服务端过程终止或关机 服务端因为过程解体或者手动kill后,过程终止敞开所有关上的描述符。这导致了其向客户端发送了一个FIN,客户端则响应了一个ack,TCP挥手的前半部分实现,服务端不在发送数据。 然而此时客户端并不知道服务器端曾经终止了。当客户端向服务器写数据的时候,因为服务器过程终止,所以响应了RST。 这种状况下能够由select或者poll检测到服务端的终止。 如果对端TCP发送数据,套接字可读,并且read返回一个大于0的值(读入字节数)如果对端TCP发送了FIN(对端过程终止),套接字可读,并且read返回0(EOF)如果对端TCP发送RST(对端解体并重启),套接字可读,并且read返回-1,errno中含有确切错误码服务端终止后重启 因为重启后曾经失落了套接字连贯信息,服务端对客户端的报文响应RST。若此时客户端读,则会返回ECONNRESET 套接字api异常情况socketerrno含意可能状况致命解决EACCES权限有余 √ EAFNOSUPPORT地址族不反对参数谬误√ EINVAL参数谬误未知协定或协定族不可用√ EMFILE关上的文件过多过程级关上的fd达下限 ulimit -n 调整或期待资源开释ENFILE关上的文件过多零碎级关上的fd达下限 期待资源开释ENOBUFS/ENOMEM内存不足Buffer或文件表无奈创立 期待资源开释binderrno含意可能状况致命解决EACCES权限有余申请保留端口且非root运行√ EADDRINUSE地址已被应用绑定已应用地址或申请长期端口时已占满 长期端口已满时重试EBADFfd不可用fd已敞开或参数非法√ EINVAL参数谬误套接字反复绑定或参数谬误√ ENOTSOCK非套接字fd参数谬误√ listenerrno含意可能状况致命解决EADDRINUSE地址已被应用监听已监听端口或未bind至确定端口而申请长期端口时已占满 长期端口已满时重试EBADFfd不可用fd已敞开或参数非法√ ENOTSOCK非套接字fd参数谬误√ EOPNOTSUPP操作不反对只反对SOCK_STREAM类套接字(TCP)√ accepterrno含意可能状况致命解决EWOULDBLOCK/EAGAIN资源临时不可用(非阻塞)队列中无实现握手的连贯 重试或解决其余事务EBADFfd不可用fd已敞开或参数非法√ ECONNABORTED连贯已中断见握手完结客户端RST 重试或解决其余事务EFAULT地址谬误addr参数没有指向用户可写空间√ EINTR调用中断调用被信号中断 重试或解决其余事务EINVAL参数谬误套接字未在监听态或addrlen/flags谬误√ EMFILE关上的文件过多过程级关上的fd达下限 ulimit -n 调整或期待资源开释ENFILE关上的文件过多零碎级关上的fd达下限 期待资源开释ENOMEM/ENOBUFS内存不足套接字buffer内存不足而非零碎内存不足 期待资源开释connecterrno含意可能状况致命解决EACCES/EPERM权限有余/操作未容许未设置播送标记但连贯播送地址或防火墙禁止连贯√ EADDRINUSE本地地址已被应用 重试,期待资源开释EADDRNOTAVAIL地址不可用未bind至确定端口而申请长期端口时已占满 重试,期待资源开释EAFNOSUPPORT地址族谬误 √ EAGAIN资源临时不可用无可用本地端口或路由缓存中无记录(?) 重试,期待资源开释EALREADY连贯正在解决(非阻塞)上一个连贯还未完结解决,可能是对返回EINPROGRESS从新调用√ EBADFfd不可用fd已敞开或参数非法√ ECONNREFUSED连贯回绝给定远端未监听,或见首次握手服务端RST 重试EFAULT地址谬误地址指针超出用户空间√ EINPROGRESS操作正在进行(非阻塞)connect无奈立刻实现 应用getsockopt判断连贯是出错还是已实现EINTR调用中断调用被信号中断 应用getsockopt判断连贯是出错还是已实现EISCONN套接字已连贯 应用getsockopt判断连贯是出错还是已实现ENETUNREACH网络不可达见目标不可达 重试ENOTSOCK非套接字fd参数谬误√ EPROTOTYPE套接字协定谬误 √ ETIMEDOUT连贯超时远端无应答,可能因为零碎忙碌 重试另附: 对connect下几种无奈判断连贯是否胜利建设的解决计划的探讨http://www.madore.org/~david/... ...

July 24, 2020 · 2 min · jiezi

TCP-UDP的区别以及TCP三次握手四次挥手

UDP1. 命名User Datagram Protocol 用户数据报协议 2. 有无连接随时发送数据,无需连接 3. 通信方式单播、多播、广播 单播:一台主机给一台主机发送数据 多播:一台主机给多台主机中的一部分发送数据 广播:一台住距给多台主机所有发送数据 4. 对应用报文的处理发送时直接添加首部。接收时直接除去首部。纯面向报文 5. 是否提供可靠的传输服务 因无连接,提供的是不可靠服务。即,UDP 发送方不会在意误码、丢包,接收方不做任何处理,只管接受 优点: 保证实时性。 网络直播、视频会议6. 首部开销 UDP 头部包含了以下几个数据 源端口端口号(可选字段)(2字节)目标端口 (2字节)整个数据报文的长度 (2字节)整个数据报文的检验和(IPv4 可选 字段),该字段用于发现头部信息和数据中的错误 (2字节)TCP1. 命名Transmission Control Protocol 传输控制协议 2. 有无连接三次握手建立连接 -> 数据传输 -> 四次挥手释放连接 3. 通信方式单播 4. 对应用层报文的处理流程发送方将数据块分割并存储在缓存,根据策略提取一定量字节,添加首部发送。接收方提取TCP报文中的数据并存储在缓存,将缓存中一部分字节流交给应用进程。纯面向字节流。 注意 TCP 并不知道字节流的含义,因此接收方需要具备理解字节流的能力发送方发送的数据块和和接收方接收的数据块,数量可能不等。如发送方将4个数据块,打包成2个发出TCP 可以同时双向传输5. 是否提供可靠的传输服务接收方收到并确认无误后,会给发送方返回一个确认报文。如果发送方没有收到确认报文,会进行超时重发,直到(事实上有上限次数)收到接收端的确认报文。 TCP 会严格控制传输的正确性,一旦有某一个数据对端没有收到,就会停止下来直到对端收到这个数据。 6. 首部开销 对于 TCP 头部来说,以下几个字段是很重要的 32位序号 Sequence number,这个序号保证了 TCP 传输的报文都是有序的,对端可以通过序号顺序的拼接报文确认序号 Acknowledgement Number,这个序号表示数据接收端期望接收的下一个字节的编号是多少,同时也表示上一个序号的数据已经收到窗口大小Window Size,表示还能接收多少字节的数据,用于流量控制标识符 URG=1:该字段为一表示本数据报的数据部分包含紧急信息,是一个高优先级数据报文,此时紧急指针有效。紧急数据一定位于当前数据包数据部分的最前面,紧急指针标明了紧急数据的尾部。ACK=1:确认标志位, 该字段为一表示确认序号字段有效。此外,TCP 还规定在连接建立后传送的所有报文段都必须把 ACK 置为一。PSH=1:该字段为一表示接收端应该立即将数据 push 给应用层,而不是等到缓冲区满后再提交。RST=1:该字段为一表示当前 TCP 连接出现严重问题,可能需要重新建立 TCP 连接,也可以用于拒绝非法的报文段和拒绝连接请求。SYN=1:请求或应答标志位,当SYN=1,ACK=0时,表示当前报文段是一个连接请求报文。当SYN=1,ACK=1时,表示当前报文段是一个同意建立连接的应答报文。FIN=1:结束标志位,该字段为一表示此报文段是一个释放连接的请求报文。7. 三次握手第一次:客户端 -> 服务端 ...

July 3, 2020 · 1 min · jiezi

前端面试每日-31-第438天

今天的知识点 (2020.06.27) —— 第438天 (我也要出题)[html] 如何判断用户正在操作页面?当页面一个小时没有操作时跳转到指定页面如何做?[css] 如何形成BFC?[js] ajax请求地址只支持http/https吗?能做到让它支持rtmp://等其它自定义协议吗 ?[软技能] 如何确保TCP包的有序传输?《论语》,曾子曰:“吾日三省吾身”(我每天多次反省自己)。前端面试每日3+1题,以面试题来驱动学习,每天进步一点!让努力成为一种习惯,让奋斗成为一种享受!相信 坚持 的力量!!!欢迎在 Issues 和朋友们一同讨论学习! 项目地址:前端面试每日3+1【推荐】欢迎跟 jsliang 一起折腾前端,系统整理前端知识,目前正在折腾 LeetCode,打算打通算法与数据结构的任督二脉。GitHub 地址 微信公众号欢迎大家前来讨论,如果觉得对你的学习有一定的帮助,欢迎点个Star, 同时欢迎微信扫码关注 前端剑解 公众号,并加入 “前端学习每日3+1” 微信群相互交流(点击公众号的菜单:进群交流)。 学习不打烊,充电加油只为遇到更好的自己,365天无节假日,每天早上5点纯手工发布面试题(死磕自己,愉悦大家)。希望大家在这浮夸的前端圈里,保持冷静,坚持每天花20分钟来学习与思考。在这千变万化,类库层出不穷的前端,建议大家不要等到找工作时,才狂刷题,提倡每日学习!(不忘初心,html、css、javascript才是基石!)欢迎大家到Issues交流,鼓励PR,感谢Star,大家有啥好的建议可以加我微信一起交流讨论!希望大家每日去学习与思考,这才达到来这里的目的!!!(不要为了谁而来,要为自己而来!)交流讨论欢迎大家前来讨论,如果觉得对你的学习有一定的帮助,欢迎点个[Star]

June 27, 2020 · 1 min · jiezi

干货分享服务端-TCP-连接的-TIMEWAIT-问题分析与解决

作者:NingG ningg.top/computer-basic-theory-tcp-time-wait/写在开头,大概 4 年前,听到运维同学提到 TIME_WAIT 状态的 TCP 连接过多的问题,但是当时没有去细琢磨;最近又听人说起,是一个新手进行压测过程中,遇到的问题,因此,花点时间,细深究一下。 问题描述 模拟高并发的场景,会出现批量的 TIME_WAIT 的 TCP 连接: 短时间后,所有的 TIME_WAIT 全都消失,被回收,端口包括服务,均正常。即,在高并发的场景下,TIME_WAIT 连接存在,属于正常现象。 线上场景中,持续的高并发场景: 一部分 TIME_WAIT 连接被回收,但新的 TIME_WAIT 连接产生;一些极端情况下,会出现大量的 TIME_WAIT 连接。Think:上述大量的 TIME_WAIT 状态 TCP 连接,有什么业务上的影响吗? Nginx 作为反向代理时,大量的短链接,可能导致 Nginx 上的 TCP 连接处于 time_wait 状态: 1.每一个 time_wait 状态,都会占用一个「本地端口」,上限为 65535(16 bit,2 Byte);2.当大量的连接处于 time_wait 时,新建立 TCP 连接会出错,address already in use : connect 异常统计 TCP 连接的状态: // 统计:各种连接的数量$ netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'ESTABLISHED 1154TIME_WAIT 1645Tips:TCP 本地端口数量,上限为 65535(6.5w),这是因为 TCP 头部使用 16 bit,存储「端口号」,因此约束上限为 65535。 ...

June 8, 2020 · 2 min · jiezi

互联网先驱-Leonard-Kleinrock-谈我们所经历的伟大实验以及为什么互联网可能不会被打破

「在工程学中,有一个术语叫做磁滞现象」伦纳德·克莱因洛克(Leonard Kleinrock)说,他用世界变化的状态做了一个比喻。「我们已经把世界的运行方式向一个方向拉伸了。就算我们现在松开手,它也不会再回到原来的状态。过去的事情是有记忆的。」 50 年前,克莱因洛克参与创造了互联网。在近期的一次视频采访中,他反思了在疫情期间世界越来越多地变成生活在互联网内部的实验,为什么互联网可能不会在压力下崩溃,以及年轻学者如何培养下一代的互联性。 为了更好的传递克莱因洛克的观点,本文节选了部分采访中的观点与问题进行编译。 采访原文:https://www.zdnet.com/article... Q1:您如何看待每个人都生活在网络中的事实呢? LK:能在这样的危机时刻做这样的事情,是非常令人欣慰的。在这之前,它也是日常生活的一部分。但在这里,它是一个真正必要的组成部分。而且我认为它实际上站得很好。 它没有崩溃,它没有变得那么不堪重负。有趣的是我认为疫情前网络的负载通常是在夜间的家庭视频休闲时刻,现在,它散布在一天之中。它利用了我们每天在家闲置时所拥有的巨大带宽。 我认识到的事情-我敢肯定其他人也有世界正在进行一个他们自己无法进行的实验,他们永远也无法在自己的身上进行。你知道,一切都关闭了,人们在家里工作。所以,从积极的一面来说,我们有机会观察这种变化,进行测量,以一种我们以前从未有过的方式进行实验。我想全世界的博士生都在利用这个实验,他们并不是为了创造这个实验, 观察正在发生的事情,所以这很好。 但反过来说,我相信大家也知道,我们永远不会再回到原来的地方了。 已经有太多的尝试了,事实证明有好有坏。我相信大家已经认识到,在线教育在某些情况下,现在已经清楚地证明了它的作用,而在这之前,人们假设它永远不会成功。它在大学、在小学,都在起作用。 这也在更深层次上挑战了校园式的大学教育的价值,经济问题与价值问题,大学教育有多大程度上是社会互动,而不是把东西装在脑子里。而答案并不明确,但现在的问题就在那里。而且我想家长和学生们都会问这个问题。因此,我认为这将是一个海量的变化,在经济学方面,和高等教育的结构,事实上,教师们正在学习如何在网上做他们以前从未做过的事情。 毫无疑问,在家中仍会混合一些工作。现在,一些以前必须要做的工作变得不必要了。企业在说:「天哪,我还是不需要此功能。我们可以通过AI或其他自动化方式来获得它。」娱乐,你知道吗,我真的想去电影院吗?好吧……与Netflix还是其他什么?我们永远不会回到原来的状态。 在工程学里,有一个术语叫滞后。我们现在就处在这样的情况下,我们已经把系统往一个方向拉长了。如果我们现在放松了,它就不会再回到原来的位置。它会对过去的事情有记忆。这当然适用于医学,适用于社会交往等等。所以,我觉得这一点很刺激。它是在探索我们不可能有的东西,而且我们正在发现这些东西的优势。在经济上,这是一个非常严重的问题,这里发生了什么,我们怎么回来。供应链正在被打破。他们怎么去重组,现在还不清楚。 现在外面有机会,基于我们的物理接触少了,更多的是偏远的地方,有新的产品和服务。有一些服务会出现我们以前没有见过的服务,涉及到我们在社交、物理和购物方面的互动方式。我自己也想到了其中的一些,一些可能的产品。但是,现在有一个世界的机会,可以配合我们现在和将来的世界的需求。 Q2:你是否愿意提供几个你所想到的那些产品机会? LK:如果你看一下货币、美元等发生的事情,我们现在是在一个非授权货币的世界里。我们正在走向一个区块链、虚拟货币的世界。此外,我们还处在一个其他虚拟货币的世界里,比如说游戏世界里的虚拟货币。我预计会有一种虚拟货币因为我们现在所处的世界的虚拟性而受到追捧。而它将会对法定货币产生什么影响还不清楚。 我研究区块链已经有一段时间了。会不会出现一种方式,让它成为一种被美化的易货系统?而主导它的货币会是什么呢?你可以想象一下,一个心理治疗师可以通过网络提供服务,并以计算机上的培训作为回报。现在那里没有货币了,它是一种服务和服务。但也许需要有一种中间货币的形式,也许是需要有某种中介货币。易货系统的巨大缺点是,成对的需求必须要找到对方才能进行交易;有了货币(以金/银为基础的金/银,法定或虚拟的),这个缺点就消失了,这也是让 「货币 」获得如此突出的动力之一。有了互联网,有了有效的方法来寻找匹配,那么这个障碍就不那么难了。这意味着,现在我们有机会探索虚拟货币和区块链分布式分类账技术的其他功能的作用。 Q3:但在你看来,它不是比特币,也不是以太币? LK:不清楚。它当然是一个很好的候选。我非常支持各种形式的区块链。但是我认为服务将成为其中的一部分,而不仅仅是虚拟货币或硬通货。我不知道。这是一个很早的想法,但是那里有些东西,我觉得这里确实会发生一种动静。 Q4: 回顾互联网发展的早期,您是否曾想过,有一天您会描述这种即兴实验,其中某些事情发生了巨大变化,突然所有剩余带宽都在被利用?我的意思是,这在1965年听起来很疯狂,或者可以用某种方式来形容,对吧? LK:简单的答案是,不,我不认为这样的实验会被 「运行」。但是,有一种潜在的认识和驱动力,帮助我们走到了现在的位置。 对我来说,计算机网络的创建是一个新的、具有挑战性的、未被研究的问题,其解决方案将产生影响,而我对这个问题也有了办法。作为克劳德-香农的学生,我意识到,如果你构建大型系统,在图中有大量的参与者或大量的节点,那么就会出现一些在小型网络中不会出现的特性。 我的论文提案的标题是,大型通信网络中的信息流,重点是大。现在,如果你要建立一个大型系统,在网络的情况下,你不能把所有的控制权分配给一个节点,因为很多原因你必须把它分配出去。而如果你把控制权分配好了,那么它就不会受到攻击,你知道,你可以把网络中的一部分砍掉,剩下的部分继续流动,因为控制权是无处不在的。如果你这样做了,你就会自动获得健壮性,作为可扩展性需求的额外奖励。这并不是一个驱动标准,它应该是健壮的,并能承受攻击或故障。那是自动的,是免费的。 现在,如果您拥有一个可扩展的网络,一个大型网络,那么您将拥有许多容量。并且,根据流量的流向,或多或少地需要流量,但会产生大量额外的容量。因此,推断到今天,我们构建了这个网络,该网络具有在您需要的地方以及您可能需要的地方的容量。另一部分是,在大流行之前,我们在夜间大量使用了家庭网络。但是容量已经整天存在,您可以根据需要将其部署为以动态方式使用。好吧,我们现在需要它,并且我们整天都在使用它。因此,从某种意义上说,大型网络的可伸缩性使我们能够构建具有此属性的网络,但是我们没有想到今天需要的东西。 Q5: 那么,当您利用该剩余容量,然后将利用率转移到不同的新的未知时间点时,会发生什么?在这种情况下,技术上有什么有趣的事情发生吗? LK:是的,会有有趣的事情发生。是否有我们可以识别的现象?不一定。有些奇怪的事情会发生。一个网络有可能开始发送流量,然后如果你增加了流量,但首选路径已经被使用,所以你走的是一条不太理想的路径,然后你就会框住别人,你用的是别人的最优路径,他们走的是一条不太理想的路径,你就会陷入一个远非最优的情况。所以,你需要这种适应性,你需要能够不断地感知、改变和测试。而我们现在大多数的路由网络都有这样的能力。你必须小心,不要让它太优化或太僵化。你必须让它在任何时候都能适应。否则,你很可能会遇到你没有预料到的情况,它就会崩溃。 Q6:你是在告诉我这件事要打破吗? LK: 是的,这是可能的。因为在早期的测试中,UCLA是网络测量中心,我们的工作就是试图破坏网络,找到故障,从而修复这些故障。 而且我们可以不断地打破它。我们会发现协议,硬件,软件故障,并且它们已得到修复。在早期,我们一直在找到它们。但是这些失败直到发生才变得明显。问题在于,控制网络的方式使用了一个称为流控制的术语,您在其中对系统施加了约束。我举一个例子。流控制约束是任何会影响网络输入与输出之间的流量的事物。您可能想说,数据进入网络的顺序与应将其输出的顺序相同。 问题的关键是,任何时候,你把一个叫流量控制的约束放在网络上,你就等于给自己打开了失败的大门。如果网络不能满足你的约束,那么它很可能会导致失败。如果它在满足约束方面很慢,那么你可能会受到性能打击。 现在可悲的是互联网的设计方式,到处都是流量控制、约束。你知道,有人添加了一个新的应用或服务或网络功能,他们就会在其中加入一个控制器。而这是以分布式的方式来完成的,这种方式是负面的,你添加的是流量控制,而我添加的也是流量控制,我们不一定知道对方。而且这可能是相互冲突或有问题的,而我们也无法掌握它。所以,在回答你的问题,网络会不会崩溃,我相信有一些情况,如果网络曾经发现自己在这些情况下,会激活一个灾难性的流控交互,可能会让网络崩溃。 Q7:您能举个例子吗? LK:如果我有的话,我会修复它的! Q8:所以,下一个明显的问题是,在未知的情况下,互联网在这种当前史无前例的情况下会崩溃吗? LK:有一个可能性。这是一个很小的概率,但是您不能保证它为零。如果您遇到激活这些约束的情况,则网络上存在一些约束可能会导致灾难。那是不可能的部分。我的意思是,我们运行网络已有 50 年了。我们发现了一些问题,并在找到问题后将其修复。 Q9: 我想更好的解决方法是,在这种情况下,互联网将是个很好的机会。 LK:是的。 Q 10:多年来,您一直在谈论一些有关用户交互的有趣想法,这些想法被称为“隐形互联网”,也称为“智能空间”。我可能不合理地将其与无触摸界面相关联。现在看来,像智能空间这样的东西,有洁癖的人会很疯狂。 LK: 好吧,这是一个很好的观点。我喜欢。我称其为“隐形互联网”的原因如下。 追溯到69年代,甚至在网络还没有启动之前,在我们进行第一次转换之前,我在当时的新闻稿中说,我们将看到它在全国各地都可以使用,无论是在家中还是办公室,就像电一样,因为电是看不见的。 这是一个很美的界面。在墙上打两个洞。它的接口很简单,你插上插头就能用上电。它就像你能想象的那样看不见,用起来也很方便。在那个年代,我认为,网络就应该是这样的,就应该是那样的隐形。现在,现在的互联网不是隐形的。你在这个手机上有一个复杂的界面。所有的键盘都不一样,应用也不一样,各种功能也不一样。应该是当我走进一个房间,房间里的人应该知道我在那里。他们应该知道是我,应该知道是我。而且我应该能够用我的母语和房间里的人说话,并在弹出的显示屏上用我的母语得到回应,也许是全息图,也许是用一些手势和触觉,等等,以一种自然的方式。它应该像这样的隐形,无处不在。现在还没有,但我们正在朝着这个方向发展。 而物联网对我们有很大的帮助,因为我们开始在我们的墙壁上、办公桌上、指甲里、身体上、办公室里、汽车里部署嵌入式技术,这些都有执行器、传感器、显示器、麦克风、扬声器、摄像头、逻辑、内存所有这些功能,所以我应该能够自然地与之互动。我是说,Siri 就是一个小小的例子。而且它已经开始实现了,但我相信它将会让普通人的交互比现在更容易实现。并让人们有了发言权,一方面有了一定的保护,一方面有了隐私,另一方面也有了扩音器的限制,你可以根据所讲的内容,来限制你的音量。 互联网的伟大之处在于,它使每个人(无论贫穷,肮脏或渺小)都拥有一台笔记本电脑和互联网,可以匿名,无偿,毫不费力地将语音立即传播给数百万人。 好吧,这也是黑暗面的完美配方。您将一个恶意人员放置在那里,他们会滥用它。我相信,如果我们提供适当的说话能力,并且不会被虚假新闻淹没,那么有很多方法可以防止出现这种情况,因此,我们需要一些检测器。我认为,A(隐身)和B(像分布式账本一样,一切都可以在其中进行研究和评估)将帮助我们建立一个我们希望在互联网诞生之初提供的世界,互联网是免费的,道德,共享,开放,可信赖和无形。 Q11 : 那么,在这样的活动中,智能空间会有什么变化,是获得新的动力,还是因为只是基本的互联互通而退居次席? LK:这是一个有趣的问题。我认为它会继续部署下去,因为我们会在较少的环境中花费时间。如果我们花在办公室里的时间比较少,办公室里有很多高速打印机和好的机器,那么我们会希望中央公园也能有这种功能。早在 70 年代初,我会展示一张我从 Datamation 杂志上拿到的照片,一个女人坐在椅子上,在中央公园的中央,坐在一个便携式的终端上,进行通信,没有电线,没有电源,也没有有线通信,全部都是无线的,那时候的 70 年代,都是无线的。于是,物联网和无处不在的接入就出现了。 上世纪 70 年代,Kleinrock 曾经给学生们看了一张来自《Datamation》杂志的照片,照片中一个人在中央公园里进行无线计算,那是在 WiFi 和笔记本电脑还没有出现的时候,他就已经开始了。他认为,随着办公室也许永远不会再回到过去的样子,他认为世界可能会比以往任何时候都更多地走向这种游牧式计算的未来。 ...

June 5, 2020 · 1 min · jiezi