面试准备之---计算机网络TCP/UDP

#常用的熟知端口号
面试准备之---计算机网络TCP/UDP_第1张图片

1. TCP

1.1 TCP(transpotation control protocol)传输控制协议

TCP:提供可靠的面向连接的字节流传输协议。

  • 面向连接是指发送数据前必须在两端通过“三次握手”建立连接,传输结束后通过四次握手终端连接;
  • 可靠传输是指TCP协议规定了以下情况的处理机制:①如何处理丢失或重复等差错情况。通过TCP的段编号和确认号②如何初始化一个数据流传输 ③如何协商结束数据流传输(协商开始和结束数据传输是通过三次握手及四次握手中传递的SYN FIN信号) ④流量控制和拥塞控制机制(TCP采用滑动窗口的方式进行流量控制,用拥塞窗口的速率调整算法慢启动快重传来进行拥塞控制)
  • 字节流是指TCP总是对交下来的报文看成是一串字节流,并对每一个字节进行编号。因此TCP是面向字节流的。
    TCP支持的应用协议:Telnet(远程登录)、FTP(文件传输协议)、SMTP(简单邮件传输协议)。TCP用于传输数据量大,可靠性要求高的应用。

1.2 TCP协议报头

面试准备之---计算机网络TCP/UDP_第2张图片
标志位:ACK标识确认序号是否有效 SYN请求建立连接 FIN通知对端,本端即将关闭

1.3 三次握手

面试准备之---计算机网络TCP/UDP_第3张图片
TCP通过三次握手同步连接双方的序列号和确认号并交换TCP窗口大小信息。

  1. TCP服务器进程先创建传输控制块TCB,时刻准备接受客户端的连接请求,此时服务器端处于监听(listen)状态;
  2. TCP客户进程也是先创建传输控制块TCB,然后向服务器发出连接请求报文,这是报文首部中的同部位SYN=1,同时选择一个初始序列号 seq=x ,此时,TCP客户端进程进入了 SYN-SENT(同步已发送状态)状态。TCP规定,SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号。
  3. TCP服务器收到请求报文后,如果同意连接,则发出确认报文。确认报文中应该 ACK=1,SYN=1,确认号是ack=x+1,同时也要为自己初始化一个序列号 seq=y,此时,TCP服务器进程进入了SYN-RCVD(同步收到)状态。这个报文也不能携带数据,但是同样要消耗一个序号。
  4. TCP客户进程收到确认后,还要向服务器给出确认。确认报文的ACK=1,ack=y+1,自己的序列号seq=x+1,此时,TCP连接建立,客户端进入ESTABLISHED(已建立连接)状态。TCP规定,ACK报文段可以携带数据,但是如果不携带数据则不消耗序号。
  5. 当服务器收到客户端的确认后也进入ESTABLISHED状态,此后双方就可以开始通信了。
  • 面试问题:为什么两次握手不可以?(为什么TCP客户端还要发送最后一次确认呢?)
    主要防止已经失效的连接请求报文突然又传送到了服务器,从而产生错误。
    如果使用的是两次握手建立连接,假设有这样一种场景,客户端发送了第一个请求连接并且没有丢失,只是因为在网络结点中滞留的时间太长了,由于TCP的客户端迟迟没有收到确认报文,以为服务器没有收到,此时重新向服务器发送这条报文,此后客户端和服务器经过两次握手完成连接,传输数据,然后关闭连接。此时此前滞留的那一次请求连接,网络通畅了到达了服务器,这个报文本该是失效的,但是,两次握手的机制将会让客户端和服务器再次建立连接,这将导致不必要的错误和资源的浪费。

如果采用的是三次握手,就算是那一次失效的报文传送过来了,服务端接受到了那条失效报文并且回复了确认报文,但是客户端不会再次发出确认。由于服务器收不到确认,就知道客户端并没有请求连接。

1.4 四次挥手

面试准备之---计算机网络TCP/UDP_第4张图片
数据传输完毕后,双方都可释放连接。最开始的时候,客户端和服务器都是处于ESTABLISHED状态,然后客户端主动关闭,服务器被动关闭。

  1. 客户端发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
  2. 服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
  3. 客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
  4. 服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
  5. 客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗*∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
  6. 服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。
  • 面试问题:为什么客户端最后还要等待2MSL?
    第一,保证客户端发送的最后一个ACK报文能够到达服务器,因为这个ACK报文可能丢失,站在服务器的角度看来,我已经发送了FIN+ACK报文请求断开了,客户端还没有给我回应,应该是我发送的请求断开报文它没有收到,于是服务器又会重新发送一次,而客户端就能在这个2MSL时间段内收到这个重传的报文,接着给出回应报文,并且会重启2MSL计时器。
    第二,防止类似与“三次握手”中提到了的“已经失效的连接请求报文段”出现在本连接中。客户端发送完最后一个确认报文后,在这个2MSL时间中,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样新的连接中不会出现旧连接的请求报文。
  • 面试问题:为什么建立连接是三次握手,断开连接是四次挥手呢?
    建立连接的时候, 服务器在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。
    而关闭连接时,服务器收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,而自己也未必全部数据都发送给对方了,所以己方可以立即关闭,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送,从而导致多了一次。

1.5 TCP流量控制

TCP利用滑动窗口机制实现对发送方的流量控制,发送方的发送窗口不可以大于接收方给出的接收窗口的大小。窗口两个边沿的相对运动增加或减少了窗口的大小。当接收方没有缓存可用,会发送零窗口大小的报文,此时发送方不能够发送任何数据。

TCP的窗口单位是字节,不是报文段。

1.6 TCP拥塞控制

在计算机网络中的链路容量(即带宽)、交换节点中的缓存和处理机等,都是网络中的资源。在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就会变坏。这种情况就叫做 拥塞。

拥塞控制 就是 防止过多的数据注入网络中,这样可以使网络中的路由器或链路不致过载。
拥塞控制是一个全局性的过程,和流量控制不同,流量控制指点对点通信量的控制。
进行拥塞控制的四种算法:

  • 慢开始(Slow-start)
  • 拥塞避免(Congestion Avoidance)
  • 快重传(Fast Restrangsmit)
  • 快恢复(Fast Recovery)。
    在tcp双方建立逻辑链接关系时, 拥塞窗口cwnd的值被设置为1,还需设置慢开始门限ssthresh,在执行慢开始算法时,发送方每收到一个对新报文段的确认时,就把拥塞窗口cwnd的值加一,然后开始下一轮的传输,当拥塞窗口cwnd增长到慢开始门限值时,就使用拥塞避免算法。
    面试准备之---计算机网络TCP/UDP_第5张图片
  1. 慢开始
    假设当前发送方拥塞窗口cwnd的值为1,而发送窗口swnd等于拥塞窗口cwnd,因此发送方当前只能发送一个数据报文段(拥塞窗口cwnd的值是几,就能发送几个数据报文段),接收方收到该数据报文段后,给发送方回复一个确认报文段,发送方收到该确认报文后,将拥塞窗口的值变为2,发送方此时可以连续发送两个数据报文段,接收方收到该数据报文段后,给发送方一次发回2个确认报文段,发送方收到这两个确认报文后,将拥塞窗口的值加2变为4,发送方此时可连续发送4个报文段,接收方收到4个报文段后,给发送方依次回复4个确认报文,发送方收到确认报文后,将拥塞窗口加4,置为8,发送方此时可以连续发送8个数据报文段,接收方收到该8个数据报文段后,给发送方一次发回8个确认报文段,发送方收到这8个确认报文后,将拥塞窗口的值加8变为16,
    当前的拥塞窗口cwnd的值已经等于慢开始门限值,之后改用拥塞避免算法。
  2. 拥塞避免
    也就是每个传输轮次,拥塞窗口cwnd只能线性加一,而不是像慢开始算法时,每个传输轮次,拥塞窗口cwnd按指数增长。同理,16+1……直至到达24,假设24个报文段在传输过程中丢失4个,接收方只收到20个报文段,给发送方依次回复20个确认报文段,一段时间后,丢失的4个报文段的重传计时器超时了,发送发判断可能出现拥塞,更改cwnd和ssthresh.并重新开始慢开始算法,如图所示
    面试准备之---计算机网络TCP/UDP_第6张图片面试准备之---计算机网络TCP/UDP_第7张图片
  3. 快重传
    发送方发送1号数据报文段,接收方收到1号报文段后给发送方发回对1号报文段的确认,在1号报文段到达发送方之前,发送方还可以将发送窗口内的2号数据报文段发送出去,接收方收到2号报文段后给发送方发回对2号报文段的确认,在2号报文段到达发送方之前,发送方还可以将发送窗口内的3号数据报文段发送出去,假设该报文丢失,发送方便不会发送针对该报文的确认报文给发送方,发送方还可以将发送窗口内的4号数据报文段发送出去,接收方收到后,发现这不是按序到达的报文段,因此给发送方发送针对2号报文段的重复确认,表明我现在希望收到的是3号报文段,但是我没有收到3号报文段,而收到了未按序到达的报文段,发送方还可以将发送窗口中的5号报文段发送出去,接收方收到后,发现这不是按序到达的报文段,因此给发送方发送针对2号报文段的重复确认,表明我现在希望收到的是3号报文段,但是我没有收到3号报文段,而收到了未按序到达的报文段,,发送方还可以将发送窗口内的最后一个数据段即6号数据报文段发送出去,接收方收到后,发现这不是按序到达的报文段,因此给发送方发送针对2号报文段的重复确认,表明我现在希望收到的是3号报文段,但是我没有收到3号报文段,而收到了未按序到达的报文段,
    此时,发送方收到了累计3个连续的针对2号报文段的重复确认,立即重传3号报文段,接收方收到后,给发送方发回针对6号报文的确认,表明,序号到6为至的报文都收到了,这样就不会造成发送方对3号报文的超时重传,而是提早收到了重传
    面试准备之---计算机网络TCP/UDP_第8张图片
  4. 快恢复
    面试准备之---计算机网络TCP/UDP_第9张图片

2. UDP

2.1 UDP(user Data protocol)用户数据报协议

用户数据报协议提供不可靠的无连接的传输服务。

  • 为什么是不可靠的呢?UDP协议:①没有确认机制。每当接收端接收到数据段之后,进行差错校验,不论是否有误,都不会给发端进行反馈,如果有错误就丢弃。这样发端就不知道这个数据段的传输情况,这对于提升效率是有好处的。②不对报文排序 即使数据段的顺序是不对的,收端也不会返回错误或者进行排序 ③没有反馈机制进行流量控制 流量控制能够有效避免接收端处理太慢从而造成缓冲区溢出的丢包事件,但是UDP没有这方面的处理,丢了就是丢了,也不会给发送端报告错误。 ④没有超时机制 丢包了也不会重发。

  • 但UDP也有优势:①它的报头开销小。UDP的头只有8字节长,但是TCP的头有20字节。报文头短,结构简单,提升了数据传输的效率。
    ②它是面向无连接的,不需要在传输之前建立连接。并且不用建立连接,就不需要维护连接状态。这有什么用呢?UDP的非连接性让它不需要给每一个数据报编号,和发送确认号。它的延迟就更少,实时性好。所以说,UDP更适于像视频传输那种对于正确率要求并不是很高,但是要求延迟低的应用。
    ③应用程序可控制何时发送数据。UDP想发送数据,直接发送即可,但是TCP就需要收到确认之后才能发送(由于拥塞和流量控制决定的)。并且遇到网络拥塞,TCP会使应用直接阻塞,无法发送。

  • UDP支持的应用协议:NFS(网络文件系统)、SNMP(简单网络管理系统)、DNS(主域名称系统)、TFTP(通用文件传输协议)等。

3. 包长

TCP整个包的最大长度是由最大传输大小决定。UDP整个包的最大长度为65535。

1、UDP:

UDP数据报的长度是指包括报头和数据部分在内的总字节数,其中报头长度固定,数据部分可变。数据报的最大长度根据操作环境的不同而各异。从理论上说,包含报头在内的数据报的最大长度为65535字节(64K)。

2、TCP:

对于TCP协议来说,整个包的最大长度是由最大传输大小(MSS,Maxitum Segment Size)决定,MSS就是TCP数据包每次能够传输的最大数据分段。

为了达到最佳的传输效能TCP协议在建立连接的时候通常要协商双方的MSS值,这个值TCP协议在实现的时候往往用MTU值代替(需要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes)所以往往MSS为1460。

通讯双方会根据双方提供的MSS值得最小值确定为这次连接的最大MSS值。

你可能感兴趣的:(面试准备)