⛵️tcp/ip协议栈/udp

TCP/IP协议栈

深入浅出 TCP/IP 协议栈

设备一览

  • 物理层:中继器、集线器
  • 数据链路层:二层交换机、网桥、网卡
  • 网络层设备:路由器

链路层

对0和1进行分组,定义数据帧,确认主机的物理地址,传输数据;
所以链路层的主要工作就是对电信号进行分组并形成具有特定意义的数据帧,然后以广播的形式通过物理介质发送给接收方。

整个数据帧由首部、数据和尾部三部分组成,

  • 首部固定为14个字节,包含了目标MAC地址、源MAC地址和类型;
  • 数据最短为46个字节,最长为1500个字节,如果需要传输的数据很长,就必须分割成多个帧进行发送;
  • 尾部固定为4个字节,表示数据帧校验序列,用于确定数据包在传输过程中是否损坏。

网络层

定义IP地址,确认主机所在的网络位置,并通过IP进行MAC寻址,对外网数据包进行路由转发;

  • IP协议。制定了一套新地址来标识主机
  • ARP协议。即地址解析协议,是根据IP地址获取MAC地址的一个网络层协议。
  • 路由协议。ARP的MAC寻址还是局限在同一个子网中。首先通过IP协议来判断两台主机是否在同一个子网中,如果在同一个子网,就通过ARP协议查询对应的MAC地址,然后以广播的形式向该子网内的主机发送数据包;如果不在同一个子网,以太网会将该数据包转发给本子网的网关进行路由。

传输层

定义端口,确认主机上应用程序的身份,并将数据包交给对应的应用程序;

SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。
TLS与SSL在传输层对网络连接进行加密。

应用层

定义数据格式,并按照对应的格式解读数据。

  • HTTP

  • FTP

  • SMTP

    SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定;SSH 为建立在应用层基础上的安全协议。
    SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。

TCP三次握手

TCP的三次握手四次挥手

  • 客服端发送连接请求报文段,该报文段的头部中SYN=1ACK=0seq=x。请求发送后,客户端进入SYN-SEND状态
  • 服务端收到请求报文后,如果同意连接则发送一个应答,SYN=1,ACK=1,seq=y,ack=x+1.应答发送完成后便进入SYN-RCVD状态。
  • 当客户端收到连接同意的应答后,还要向服务端发送一个确认报文段,表示:服务端发来的连接同
    意应答已经成功收到。该报文段的头部为:ACK=1seq=x+1ack=y+1。客户端发完这个报文段后便进入ESTABLISHED状态,服务端收到这个应答后也进入ESTABLISHED
    状态,此时连接的建立完成!

为什么三次而不是两次

防止失效的连接请求报文段被服务端接收,从而产生错误,消耗服务器连接资源。(失效的连接请求:若客户端向服务端发送的连接请求丢失,客户端等待应答超时后就会再次发送连接请求,此时,上一个连接请求就是『失效的』)

TCP四次挥手

TCP连接是双向的,因此在四次挥手中,前两次挥手用于断开一个方向的连接,后两次
挥手用于断开另一方向的连接。

第一次挥手

若A认为数据发送完成,则它需要向B发送连接释放请求。该请求只有报文头,头中携带的主要参数为:
FIN=1seq=u。此时,A将进入FIN-WAIT-1状态。

  • FIN=1表示该报文段是一个连接释放请求。
  • seq=uu-1是A向B发送的最后一个字节的序号。

第二次挥手

B收到连接释放请求后,会通知相应的应用程序,告诉它A向B这个方向的连接已经释放。此时B进入
CLOSE-WAIT状态,并向A发送连接释放的应答,其报文头包含:ACK=1seq=vack=u+1

  • ACK=1:除TCP连接请求报文段以外,TCP通信过程中所有数据报的ACK都为1,表示应
    答。
  • seq=vv-1是B向A发送的最后一个字节的序号。
  • ack=u+1表示希望收到从第u+1个字节开始的报文段,并且已经成功接收了前u个字节。

A收到该应答,进入FIN-WAIT-2状态,等待B发送连接释放请求。

第三次挥手

当B向A发完所有数据后,向A发送连接释放请求,请求头:FIN=1ACK=1seq=w
ack=u+1。B便进入LAST-ACK状态。

第四次挥手

A收到释放请求后,向B发送确认应答,此时A进入TIME-WAIT状态。该状态会持续2MSL时间,若
该时间段内没有B的重发请求的话,就进入CLOSED状态,撤销TCB。当B收到确认应答后,也便进
CLOSED状态,撤销TCB

  • 为什么A要先进入TIME-WAIT状态,等待2MSL时间后才进入CLOSED状态?

为了保证B能收到A的确认应答。
若A发完确认应答后直接进入CLOSED状态,那么如果该应答丢失,B等待超时后就会重新发送连接
释放请求,但此时A已经关闭了,不会作出任何响应,因此B永远无法正常关闭。

TCP流量控制

TCP的流量控制和拥塞控制

如果发送方把数据发送得过快,接收方可能会来不及接收,这就会造成数据的丢失。所谓流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收。

滑动窗口

设A向B发送数据。在连接建立时,B告诉了A:“我的接收窗口是 rwnd = 400 ”(这里的 rwnd 表示 receiver window) 。因此,发送方的发送窗口不能超过接收方给出的接收窗口的数值。

传输速率

可以用不同的机制来控制TCP报文段的发送时机。如: <1>. TCP维持一个变量,它等于最大报文段长度MSS。只要缓存中存放的数据达到MSS字节时,就组装成一个TCP报文段发送出去。<2>. 由发送方的应用进程指明要求发送报文段,即TCP支持的推送( push )操作。<3>. 发送方的一个计时器期限到了,这时就把已有的缓存数据装入报文段(但长度不能超过MSS)发送出去。

TCP拥塞控制

拥塞:即对资源的需求超过了可用的资源。若网络中许多资源同时供应不足,网络的性能就要明显变坏,整个网络的吞吐量随之负荷的增大而下降。

拥塞控制:防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。拥塞控制所要做的都有一个前提:网络能够承受现有的网络负荷。拥塞控制是一个全局性的过程,涉及到所有的主机、路由器,以及与降低网络传输性能有关的所有因素。

慢开始

拥塞避免

快重传

快恢复

TCP和UDP区别

  • TCP 是面向连接的,udp是无连接的即发送数据前不需要建立链接

  • TCP 面向连接的、可靠的、基于字节流的通信协议,有流量控制,拥塞控制,提供全双工通信,面向字节流(把应用层传下来的报文看成字节流,把字节流组织成大小不等的数据块),每一条 TCP 连接只能是点对点的(一对一)。无差错,不丢失,不重复且按序到达

  • UDP 面向非连接的协议,它不与对方建立连接,而是直接就把数据包发过去了,尽最大可能交付,没有拥塞控制,面向报文.支持一对一、一对多、多对一和多对多的交互通信。

  • UDP具有良好的实时性,工作效率更高,适合对于高速传输和实时性要求比较高的场景。

  • TCP对资源要求较高,UDP对资源要求较低