对网络传输层的理解

来源:互联网 发布:采购询价软件 编辑:程序博客网 时间:2024/05/20 03:06

从这篇博客起来总结计算机网络中传输层的部分。

传输层服务和协议概述

传输层协议为运行在不同host上的进程也就是应用进程提供了一种逻辑通信机制。什么叫逻辑通信机制呢?指的就是两个进程之间仿佛是直接连接的,它不需要关心这期间有多远的物理距离,经过了多少路由器,使用了哪些物理层等等。端系统运行传输层协议,其中发送方将应用递交的消息分成一个或多个的报文段,并向下传给网络层。接收方将接收到的报文段组装成消息并向上交给应用层。

传输层协议

可靠、按序的交付服务(TCP)

  • 拥塞控制
  • 流量控制
  • 连接建立

不可靠的交付服务(UDP)

基于“尽力而为”的网络层,没有做扩展。

这里写图片描述

复用和分用

复用:从多个报文段接收数据,为每块数据封装上头部信息,生成报文段,交给网络层。

分用:传输层依据头部信息将收到的报文段交给正确的socket,即不同的进程。如下图所示:

这里写图片描述

主机2上面运行着两个进程,分别是P1和P2,主机1的P3进程会给主机2的P1进程发报文段,主机3的P4进程会给主机2的P2进程发报文段,那么主机2的传输层作为接收端就要进行多路分用,就是要将报文段正确的交给对应的进程。主机收到报文段之后,传输层协议提取IP地址和端口号信息,将报文段导向相应的socket。

UDP

User Datagram Protocol用户数据报协议,基于IP协议,进行多路复用/分用和错误校验的工作。UDP提供一种尽力而为的服务模型,这是因为IP就是一种尽力而为的机制,而UDP在IP的基础上没有附加太多的东西所以就造成了这种不可靠的特性。UDP发送方和接收方之间不需要握手,每个UDP段的处理独立于其他段。

UDP为什么存在?

1.UDP无需建立连接,所以就会减少延迟的时间,这也就是为什么DNS用的是UDP而不是TCP。

2.实现简单,无需维护连接状态。

3.头部开销少。

4.没有拥塞控制,应用可以更好的控制发送时间和速率。

UDP的用途

常用于流媒体应用,容忍流失,速率敏感。还用于DNS,SNMP协议等。

在UDP上实现可靠性传输?

  • 在应用层增加可靠性机制
  • 应用特定的错误恢复机制

TCP

Transmission Control Protocol传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议。有以下几个特点:

  • 点对点
  • 可靠的,按序的字节流
  • 采用流水线机制
  • 能够对发送方/接收方进行缓存

通信双方在发送数据之前必须建立连接,连接状态只在连接的两端中维护,在沿途节点中并不维护状态。TCP连接包括:两台主机上的缓存、连接状态变量、socket等。

下图是TCP的段结构

这里写图片描述

其中介绍一下这几个标志位

  • ACK——确认连接
  • RST——复位
  • SYN——请求建立连接
  • FIN——终止连接

seq序列号——报文段中的一个字节的编号

ack——希望接收到的下一个字节的序列号

TCP三次握手

这里写图片描述

如上图所示简述一下tcp三次握手的过程:客户机发起建立连接的请求,发送报文段SYN=1,seq为初始的序列号。服务器端如果同意建立连接会返回一个报文段,SYN=1,ACK=1,选择自己的初始序列号,ack=上一个报文段seq+1,表示上一段的消息收到,下一次希望从这个位置开始接收数据。客户端收到来自服务端的反馈时,ACK=1,seq=上一个报文段ack+1刚好就是客户机所希望的,然后设置ack=上一个报文段seq+1。

为什么要三次握手?

我所了解的原因有两个。

第一,防止已经失效的连接请求突然发送到了客户端,也就是说当客户端发送连接请求后,服务器一直没有进行及时响应,后来突然进行这条请求的响应传到了客户端(我相信这时候客户端是懵逼的),很显然这时候这条响应已经失效了,但如果是两次握手那么这种情况就会造成一系列错误。

第二,假定客户机给服务器发送连接请求,服务器收到,发送确认应答表示已经成功的建立连接并开始发送数据。可是,客户端在服务器的应答在传输中丢失,客户端不知道服务器是否准备好,甚至怀疑是否收到连接请求。在这种情况下,客户端认为服务器连接未建立成功,将忽略服务端发来的数据,只能等待链接确认信号,而服务端在发出超时后,重复发送,形成死锁。

TCP四次挥手

这里写图片描述

客户端向服务器发送FIN控制 报文段,表示我已经没有数据向你传送了,请求断开。服务端收到FIN后,回复ACK,表示我收到你的关闭请求,进入等待关闭状态。当服务端也没有数据向客户端传送时,向客户端发送FIN表示我也没有数据向你发送。客户端收到FIN后,回复ACK,表示我收到你的关闭请求,进入最终确认状态。发送到服务端后,连接关闭。

为什么要四次挥手?

这是由于TCP的半关闭造成的,因为在客户端给服务端发送关闭请求服务端也给予回应后,服务端给客户端数据是流动的,也就是说服务端是可以向客户端发送数据的。所以,必须要再进行一次确认关闭,才能完全结束这个过程。

TCP流量控制

这里写图片描述

接收方为TCP连接分配buffer,左边是IP传递来的数据,右边传递给上层的应用进程。上层应用可能处理buffer中的数据的速度较慢,但是传输的速度又比较快,可能会导致buffer溢出,所以就要利用流量控制来控制传输的速度和数量,避免buffer溢出淹没接收方。

原创粉丝点击