一、tcp和udp

区别:(1)tcp是面向连接的协议,udp是面向无连接的协议

           (2)tcp协议传输是可靠的,而udp协议--不可靠--尽力而为(只知道一直发,不管对方是否接收)

           (3)tcp可以实现流量控制,udp不行

           (4)tcp可以实现分段传输,udp不行

           (5)tcp的传输速率较慢,占用资源较大;udp传输速率较快,占用资源小

应用场景:

        tcp协议:适用于传输速率要求相对较低,但是可靠性要求较高的场景(获取网页资源)

        udp协议:适用于传输速率要求相对较高,但是可靠性要求较低的场景(视频通话,打游戏)

面向连接:

在正式传输数据之前,使用预备的协议(tcp)建立点到点的连接

TCP(传输控制协议)

        (1)保证数据可靠、有序、不重复、不丢包以及控制发送的速度
                 为了做到以上,tcp一共有四个保证过程:

                        (1)客户端通过三次握手建立与服务端的连接

                        (2)断开连接就通过四次握手

                        (3)定义各种机制,保证传输的可靠(序列号、确认、重传、排序)

                        (4)控制发送的速率(流量控制和拥塞控制)

          (2)数据:指从应用层传输下来的数据

                   序号:传输的数据的编号

                   确认序号:首部长度--头部长度--可变长头部(20-60字节)

                   URG:紧急指针标志位,如果该标志位,置1,则激活紧急指针字段

                   PSH:(tcp可以将一个完整的数据分成多个段,为了保证数据的完整性,连续性,所以对端会有一个缓存空间先去接收,把所有的数据段接收完整后,推给进程,如果某个数据段的PSH标志位置1,则不再进入缓存空间,直接推给进程)

                   ACK:确认标记,该标志位置1,表示激活确认序列号(一般都是确认收到包序列号+

1,表示我已经收到了之前的所有包,期望你下次从这里发,也就是下一个)

                   SYN:请求建立连接,在三次握手时,建立连接的时候,该标志位置1(通俗一点点相当于,我们在发起聊天的时候,会问的在吗一样)

                   FIN:断开连接的标志,数据发完,就可以端口自己的会话了,此时的FIN标志位置1(同理相当于给别人说先不聊了)

                   SEQ:我这包数据第一个字节编号

                   校验和:校验数据的完整性

UDP(用户数据协议):

TCP三次握手(建立连接):(双方都确认我能发,你能收)

        同步:初始序列号(在建立连接时会随机一个序列号,后续慢慢递增,保证传输的有序性)

        

在客户端和服务器建立连接前都是处于CLOSED状态的,当客户端想访问服务器某个服务或者请求数据的时候,客户端便会向服务端发送一个包含有SYN=1(相当于在吗,我想),以及随机一个序列号x:seq=x,发送后就进入SYN-SENT状态(发送状态)。这时服务端就会进入listen状态,直达接收到客户端发送的包,然后回复确认包含有自身的一个随机序列号(SYN=1这里的SYN也是同理,双方都需要确认对方在吗,是否能接收的自身发送的包;ACK=1便是确认接收到包,ACKn=x+1便是确认接收到客户端发送的seq=x的包,并请求x+1的包,然后还有自身的随机序列号),便进入SYN-RCVD(等待接收状态)。当客户端接收到服务端的确认包后,就直接进入了established状态,此刻他回复给服务端的确认包就可以含有数据了,回的包:(还是先确认ACK=1,以及确认序号ACKn=y+1(确认接收到了序列号为y的包,并请求y+1的包),然后还有自身这个包的序列号seq=x+1),这里加1都是保证传输数据包的有序性。然后服务端接收到客户端的确认包后,就进入了established状态,这样连接就建立成功了。

TCP四次挥手:

在我们访问完后,想断开连接,这时候就会经过tcp的四次挥手的过程。从客户端开始向服务端发送断开连接请求的包(同理内含有FIN包请求在吗,然后随机生成一个序列号u),然后就从established状态进入到FIN-WAIT-1状态,等待服务端的回包。在服务端接收到客户端的请求断开连接的包后,就进入CLOSE-WAIT状态并向客户端发送确认包(ACK置1确认收到包,并确认收到的包的序列号并请求seq=u+1的包,然后随机生成一个属于自己这个包的序列号v),在客户端接收到服务端发送的第一个确认包后,就直接进入到FIN-WAIT-2状态,等待服务端发送的请求断开的请求包(因为有时服务端可能还有一些数据还没有完全发给客户端,所以还有一次发送请求断开的握手,还可以携带最后需要发送的数据)。服务端发送完确认包后,就可以发送最后需要发送给客户端的数据,并写带请求断开连接的参数(FIN置1,再次ACK置1,再随机生成包序列号w,确认seq=u包并请求客户端u+1的包),然后就进入LAST-ACK状态,等待客户端最后的确认包。客户端接收到服务端的请求断开连接的包后,直接回复服务端最后的确认包(ACK置1,之前的序列号+1:seq=u+1,确认收到服务端的w包,seq=w+1),然后就进入TIME-WAIT状态,等待2MSL(确认最后一个ack被服务端接收到;防止旧报文干扰新连接),就直接断开连接,进入到CLOSED状态。服务端接收到客户端的确认包后就进入到CLOSED状态。

TCP的可靠机制:

        确认机制:每发送一次数据,对端都需要对此确认

        重传机制:如果没有收到对端的确认报文,则认为数据未发送

        排序机制:数据进行分段之后,需要进行排序

        流控机制:(滑动窗口机制)调节流量流速,同时发送的报文,只用确认最后那个包,减小tcp确认机制对链路资源的消耗。

排序、去重:

        TCP按SEQ重新排队,如果SEQ重复,则重复的包直接丢弃。

RTT和RTO:

        RTT:数据包来回一趟的时间

        RTO:多久没收到ACK包算超时(RTO时间可以动态调整,比RTT较大),超时则重发(超时重传机制)

快速重传:

        连续收到3个重复ACK包,就直接不等超时,就直接立刻重传

MTU和MSS:
        
MTU:链路层一帧最大数据(以太网1500)

        MSS:TCP一段最大数据部分

                :MSS=MTU-IP头-TCP头≈1460

                :如果超过MSS则就TCP分段

流量控制(滑动窗口机制):

        目的:接收方告诉发送方:你别发太快了,我缓存快满了,跟不上。

                :接收方再TCP头里面填Window大小

拥塞控制:

        维护两个变量:

                cwnd:拥塞窗口(网络能承受多少)

                ssthresh:慢启动门限

(1)慢启动

        cwnd从1开始指数增长:1-2-4-8-……

        到设定的ssthresh就停止慢启动,然后慢慢一个一个增长,直到接收方快承受不了再重新来

(2)拥塞避免

        cwnd线性加1增长,如果发送丢包/超时,则ssthresh=cwnd/2,然后cwnd重置为1,再增长

(3)快速恢复

        如果只是丢包,不是超时,则ssthresh=cwnd/2,cwnd=ssthresh+3,然后线性恢复,不会回到1重新恢复。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐