运输层

运输层

概述

  • 运输层向它上面的应用层提高通信服务
  • 当网络的边缘部分中的两个主机使用网络的核型部分的功能进行端到端的通信时,只有主机的协议栈才有运输层,而网络和兴部分中的路由器在转发分组时都只用到下三层的功能。

这里写图片描述

  • 网络层是为主机之间提供逻辑通信,而运输层为应用进程之间提供端到端的逻辑通信。运输层有复用和分用的功能。

应用层所有的应用进程都可以通过运输层再传送到IP层(网络层),这就是复用。运输层从IP层收到数据后必须交付指明的应用进程,就是分用

  • 通过协议端口号将报文交付给特定的进程,这就是说,虽然通信的终点是应用进程 ,但我们只要把要传送的报文交到目的主机的某一个合适的目的端口,剩下的工作(即最后交付目的进程)就有TCP来完成。

UDP和TCP的首部格式中都有源端口和目的端口。

服务器端常用的端口号

应用进程 FTP TELNET SMTP DNS TFTP HTTP SNMP SNMP(trap)
熟知端口号 21 23 25 53 69 80 161 162

运输层协议

TCP对应的协议:

  • FTP:定义了文件传输协议,使用21端口。
  • Telnet:远程登录协议,一种用于远程登陆的端口,使用23端口,用户可以以自己的身份远程连接到计算机上,可提供基于DOS模式下的通信服务。
  • SMTP:邮件传送协议,用于发送邮件。服务器开放的是25号端口。
  • POP3:它是和SMTP对应,POP3用于接收邮件。POP3协议所用的是110端口。
  • HTTP:是从Web服务器传输超文本到本地浏览器的传送协议。

UDP对应的协议:

  • DNS:用于域名解析服务,将域名地址转换为IP地址。DNS用的是53号端口。
  • SNMP:简单网络管理协议,使用161号端口,是用来管理网络设备的。由于网络设备很多,无连接的服务就体现出其优势。
  • TFTP(Trival File Tran敏感词er Protocal),简单文件传输协议,该协议在熟知端口69上使用UDP服务。
  • NFS、BOOTP 这里写图片描述

UDP概述

用户数据报协议UDP只在IP的数据报服务之上增加了很少一点的功能,这就是复用和分用以及差错检测的功能。

1. UDP主要特点:

  1. UDP是无连接的,因此减少了开销和发送数据之前的时延
  2. UDP使用尽最大努力交付,不保证可靠交付,因此主机不需要维持复杂的链接状态表
  3. UDPshi面向报文的。即一次交付一个完整的报文。因此,应用程序必须选择合适大小的报文。若报文太长,UDP把它交付给IP层后,IP层在传送时可能要进行分片,这会降低IP层的效率。反之,若报文太短,UDP把它交给IP层后,会使IP数据报的首部的相对长度太大,这也降低了IP层的效率。
  4. UDP没有拥塞控制。因此网络出现的拥塞不会使源主机的发送速率降低。
  5. UDP支持一对一,一对多,多对一和多对多的交互通信。
  6. UDP的首部开销小,只有8个字节,比TCP的20个字节的首部短。

2. UDP首部格式

这里写图片描述

3. 端口分用

当运输层从IP层收到UDP数据报时,就根据首部中的目的端口,把UDP数据报通过相应的端口,上交最后的终点-应用进程。

这里写图片描述

如果接收方UDP发现收到的报文中的目的端口号不正确(即不存在对应于该端口号的应用进程),就丢弃该报文,并由网际控制报文协议ICMP发送“端口不可达”差错报文给发送放。

4. 计算检验和

在计算检验和时,要在UDP用户数据报之前增加12个字节的伪首部。所谓“伪首部”只是在计算检验和时,临时添加在UDP用户数据报前面,得到一个临时的UDP用户数据报。检验和就是根据这个临时的UDP用户数据报来计算的。伪首部既不向下传送也不向上递交,而仅仅是为了计算检验和。

IP数据报的检验和只检验IP数据报的首部,但UDP的检验和时把首部和数据部分一起检验。

具体的计算过程还是看书吧

TCP

TCP概述

  • TCP提供一种面向连接的、可靠的字节流服务 。
  • TCP提供可靠交付,无差错,不丢失,不重复,且按序到达。
  • 提供全双工通信,TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据。
  • 在一个TCP连接中,仅有两方一对一进行彼此通信。广播和多播不能用于TCP
  • TCP使用校验和,确认和重传机制来保证可靠传输
  • TCP使用累积确认
  • TCP使用滑动窗口机制来实现流量控制,通过动态改变窗口的大小进行拥塞控制

TCP的连接

TCP把连接作为最基本的抽象。 每一条TCP连接有两个端点。TCP连接的端点不是主机,不是主机的IP地址,不是应用进程,也不是运输层的协议端口。 TCP连接的端点叫做套接字(socket).

根据RFC 793的定义: 端口号拼接到IP地址即构成了套接字。若IP地址是192.3.4.5 而端口号是80,那么套接字就是192.3.4.5:80.

套接字socket =(IP地址:端口号)

每一条TCP连接唯一地被通信两端的两个端点(即两个套接字)所确定。即: TCP连接::={socket1,socket2}={(IP1:port1)},(IP2:port2)}

socket名词的其他含义 允许应用程序访问连网协议的应用编程接口API,即运输层和应用层之间的一种接口,称为socket API,简称为socket

与本章socket不同。

三次握手与四次挥手

三次握手

所谓三次握手(Three-way Handshake),是指建立一个 TCP 连接时,需要客户端和服务器总共发送3个包。

三次握手的目的是连接服务器指定端口,建立 TCP 连接,并同步连接双方的序列号和确认号,交换 TCP 窗口大小信息。在 socket 编程中,客户端执行 connect() 时。将触发三次握手。

  • 第一次握手(SYN=1, seq=x):

    客户端发送一个 TCP 的 SYN 标志位置1的包,指明客户端打算连接的服务器的端口,以及初始序号 X,保存在包头的序列号(Sequence Number)字段里。

    发送完毕后,客户端进入 SYN_SEND 状态。

  • 第二次握手(SYN=1, ACK=1, seq=y, ACKnum=x+1):

    服务器发回确认包(ACK)应答。即 SYN 标志位和 ACK 标志位均为1。服务器端选择自己 ISN 序列号,放到 Seq 域里,同时将确认序号(Acknowledgement Number)设置为客户的 ISN 加1,即X+1。 发送完毕后,服务器端进入 SYN_RCVD 状态。

  • 第三次握手(ACK=1,ACKnum=y+1)

    客户端再次发送确认包(ACK),SYN 标志位为0,ACK 标志位为1,并且把服务器发来 ACK 的序号字段+1,放在确定字段中发送给对方,并且在数据段放写ISN的+1

    发送完毕后,客户端进入 ESTABLISHED 状态,当服务器端接收到这个包时,也进入 ESTABLISHED 状态,TCP 握手结束。

三次握手的过程的示意图如下:

四次挥手

TCP的连接的拆除需要发送四个包,因此称为四次挥手(Four-way handshake),也叫做改进的三次握手。客户端或服务器均可主动发起挥手动作,在 socket 编程中,任何一方执行 close() 操作即可产生挥手操作。

  • 第一次挥手(FIN=1,seq=x)

假设客户端想要关闭连接,客户端发送一个 FIN 标志位置为1的包,表示自己已经没有数据可以发送了,但是仍然可以接受数据。

发送完毕后,客户端进入 FIN_WAIT_1 状态。

  • 第二次挥手(ACK=1,ACKnum=x+1)

服务器端确认客户端的 FIN 包,发送一个确认包,表明自己接受到了客户端关闭连接的请求,但还没有准备好关闭连接。

发送完毕后,服务器端进入 CLOSE_WAIT 状态,客户端接收到这个确认包之后,进入 FIN_WAIT_2 状态,等待服务器端关闭连接。

  • 第三次挥手(FIN=1,seq=y)

服务器端准备好关闭连接时,向客户端发送结束连接请求,FIN 置为1。

发送完毕后,服务器端进入 LAST_ACK 状态,等待来自客户端的最后一个ACK。

  • 第四次挥手(ACK=1,ACKnum=y+1)

客户端接收到来自服务器端的关闭请求,发送一个确认包,并进入 TIME_WAIT状态,等待可能出现的要求重传的 ACK 包。

服务器端接收到这个确认包之后,关闭连接,进入 CLOSED 状态。

客户端等待了某个固定时间(两个最大段生命周期,2MSL,2 Maximum Segment Lifetime)之后,没有收到服务器端的 ACK ,认为服务器端已经正常关闭连接,于是自己也关闭连接,进入 CLOSED 状态。

四次挥手的示意图如下:

图片来自:谢希仁,计算机网络第6版,P226

为什么三次握手而不是两次

主要是为了防止已经失效的连接请求报文段突然又传送到了B,因而产生错误。

正常的情况:A发出连接请求,但因连接请求报文丢失而未收到确认。于是A再重传一次连接请求。后来收到了确认,建立了连接。数据传输完毕后,就释放了连接。A共发送了两个连接请求报文段,其中第一个丢失,第二个到达了B。没有“已失效的连接请求报文段”。 异常情况:在刚才的正常情况中,若当A发出的第一个连接请求报文段并没有丢失,而是在某些忘了结点长时间滞留了,以致延误到连接释放以后的某个时间才到达B。本来这是一个早已失效的报文段。但B收到此失效的连接请求报文段后,就误以为是A又发出一次新的连接请求。于是就向A发出确认字段,同意建立连接。假定不采用三次握手,那么只要B发出确认,新的连接就建立了。---摘自谢希仁<计算机网络(第6版)>

为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?

这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。

SYN攻击

  • 什么是 SYN 攻击(SYN Flood)?

在三次握手过程中,服务器发送 SYN-ACK 之后,收到客户端的 ACK 之前的 TCP 连接称为半连接(half-open connect)。此时服务器处于 SYN_RCVD 状态。当收到 ACK 后,服务器才能转入 ESTABLISHED 状态.

SYN 攻击指的是,攻击客户端在短时间内伪造大量不存在的IP地址,向服务器不断地发送SYN包,服务器回复确认包,并等待客户的确认。由于源地址是不存在的,服务器需要不断的重发直至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求被丢弃,导致目标系统运行缓慢,严重者会引起网络堵塞甚至系统瘫痪。

SYN 攻击是一种典型的 DoS/DDoS 攻击。

  • 如何检测 SYN 攻击?

检测 SYN 攻击非常的方便,当你在服务器上看到大量的半连接状态时,特别是源IP地址是随机的,基本上可以断定这是一次SYN攻击。在 Linux/Unix 上可以使用系统自带的 netstats 命令来检测 SYN 攻击。

  • 如何防御 SYN 攻击?

SYN攻击不能完全被阻止,除非将TCP协议重新设计。我们所做的是尽可能的减轻SYN攻击的危害,常见的防御 SYN 攻击的方法有如下几种:

  1. 缩短超时(SYN Timeout)时间
  2. 增加最大半连接数
  3. 过滤网关防护
  4. SYN cookies技术

TCP报文段首部格式

TCP虽然是面向字节流的,但是TCP传送的数据单元是报文段。 TCP报文段首部的前20个字节是固定的。后面4n(n是整数)字节是根据需要而增加的选项。因此TCP首部的最小长度是20字节。 这里写图片描述

1.源端口和目的端口:各占2个字节,通过端口实现分用功能。

2.序号:占4个字节。TCP是面向字节流的。在一个TCP连接中传送的字节流中的每一个字节都按顺序编号。

3.确认号: 占4个字节,是期望收到对方下一个报文的第一个数据字节的序号。若确认号=N,则表明,到序号N-1为止的所有数据都已正确收到。

4.数据偏移:4位,它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。这个字段实际上是指出TCP报文段的首部长度。由于首部中还有长度不确定的选项字段,因此数据偏移字段是必要的。4位二进制数能表示的最大数是15,因此数据偏移最大值是60字节,这也是TCP首部的最大长度(即选项长度不能超过40字节)

5.保留: 占6位,保留为今后使用,但目前应置为0;

以下6个控制位说明本报文段的性质

6. 紧急URG: 当URG=1时,,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送,而不要按原来的排队顺序来传送。

7.确认ACK: 仅当ACK=1时确认号字段才有效。当ACK=0时,确认号无效。TCP规定,在连接建立后所有传送的报文段都必须把ACK置1。

8.推送PSH:当两个应用进程进行交互式的通信时,有时在一端的应用进程希望在键入一个命令后立即就能够收到对方的响应。在这种情况下,TCP就可以使用推送操作。这时,发送方TCP把PSH置为1,并立即创建一个报文段发送出去。接收方TCP收到PSH=1的报文段,就尽快地交付接收应用进程,而不再等到整个缓存都填满了后再向上交付。

9.复位RST:当RST=1时,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立运输连接。RST置1还用来拒绝一个非法的报文段或拒绝打开一个连接。

10. 同步SYN:在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应的报文段中使用SYN=1和ACK=1.因此SYN置为1表示这是一个连接请求或连接接受报文。

11.终止FIN:用来释放一个连接。当FIN=1时,说明此报文段的发送方的数据已发送完毕,并要求释放运输连接。

12. 窗口: 占2个字节。窗口指的是发送本报文段的一方的接收窗口(而不是自己的发送窗口)。窗口告诉对方:从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量。之所以要有这个限制,是因为接收方的数据缓存空间是有限的。总之,窗口字段明确指出了现在允许对方发送的数据量。窗口值是经常在动态变化着。

13.检验和: 占2个字节。检验和字段检验的范围包括首部和数据这两部分。和UDP用户数据报一样,在计算检验和时,要在TCP报文段的前面加上12字节的伪首部。

14.紧急指针:占2个字节。紧急指针仅在URG=1时才有意义,它指出本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据)。因此,紧急指针指出了紧急数据的末尾在报文段中的位置。注意,即使窗口为零时也可发送紧急数据。 15.选项:长度可变,最长可达40字节。

可靠传输的工作原理

确认和重传机制,就可以在不可靠的传输网络上实现可靠的通信。

像上述这种可靠传输协议常被称为自动重传请求ARQ,意思是重传的请求是自动进行的。接收方不需要请求发送方重传某个出错的分组。

连续ARQ协议:发送方维持一个滑动窗口,发送方没收到一个确认,就把发送窗口向前滑动一个分组的位置。接收方一般都是采用累积确认的方式。这就是说,接收方不必对收到的分组逐个发送确认,而是在收到几个分组后,对按序到达的最后一个分组发送确认。这就表示:到这个分组位置的所有分组都已正确收到了。

确认:A发送分组M1,发完就暂停发送,等待B的确认。B收到了M1就向A发送确认。A在收到了对M1的确认后,就再发送下一个分组M2。同样,在收到B对M2的确认后,再发送M3.

超时重传:

  1. A在发送完一个分组后,必须暂时保留已发送的分组的副本
  2. 分组和确认分组都必须进行编号
  3. 超时计时器设置的重传时间应当比数据在分组传输的平均往返时间更长一些。

TCP的流量控制

所谓流量控制,就是让发送方的发送速率不要太快,要让接收方来及接收

发送方的发送窗口rwnd(receiver window)不能超过接收方给出的接收窗口的数值。

接收方通过控制接收窗口的大小,控制发送方的发送速率。

Nagle算法:若发送应用进程把要发送的数据逐个字节地送到TCP的发送缓存,则发送方就把第一个数据字节先发送出去,把后面到达的数组字节都缓存起来。当发送方收到对第一个数据字符的确认后,再把发送缓存中的所有数组组装成一个报文段发送出去,同时继续对随后到达的数据进行缓存。只有在收到对前一个报文段的确认后才继续发送下一个报文段。当数据到达较快而忘了速率较慢时,用这样的方法可明显地减少所有的网络带宽。Nagle算法还规定。当到达的数据已达到发送窗口大小的一半或已达到报文段的最大长度时,就立即发送一个报文段。这样做,就可以有效地提高网络的吞吐量。

TCP的拥塞控制

什么是拥塞:

在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏。这种情况就叫做拥塞

拥塞控制:

拥塞控制就是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。

区别 流量控制是一个端到端的问题,是接收端抑制发送端发送数据的速率,以便使接收端来得及接收。拥塞控制是一个全局性的过程,涉及到所有的主机、所有的路由器、以及与降低网络传输性能有关的所有因素。

四种算法:

慢开始,拥塞避免,快重传和快恢复。

慢开始和拥塞避免

发送方维持一个拥塞窗口(cwnd)的状态变量。

发送方控制拥塞窗口的原则是:只要网络没有出现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送出去。只要网络出现拥塞,拥塞窗口就减小一些,以减少注入到网络中的分组数。

如何知道网络发生了拥塞呢

当网络发生拥塞时,路由器就要丢弃分组。因此只要发送方没有按时收到应当到达的确认报文,就可以猜想网络可能出现了拥塞。

慢开始算法:由小到大逐渐增大拥塞窗口数值。通常在刚刚开始发送报文段时,先把拥塞窗口cwnd设置为一个最大报文段MSS的数值。而在每收到一个对新的报文段的确认后,把拥塞窗口增加至多一个MSS的数值。

慢开始算法,没经过一个传输轮次,拥塞窗口cwnd就加倍。

为了防止拥塞窗口cwnd增长多大引起网络拥塞,还需要设置一个慢开始门限ssthresh状态变量。

  1. 当cwnd<ssthresh时,使用上述的慢开始算法。
  2. 当cwnd>ssthresh时,停止使用慢开始算法而改用拥塞避免算法。
  3. 当cwnd=ssthressh时,既可用慢开始算法,也可用拥塞避免算法。


拥塞避免:

算法的思路是让拥塞窗口cwnd缓慢地增大,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍。这样,拥塞窗口cwnd按线性规律缓慢增长.

无论是在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞,就要把慢开始门限ssthresh设置为出现拥塞时的发送方窗口值的一半(但不能小于2)。然后把窗口cwnd重新设置为1,执行慢开始算法。

慢开始与拥塞避免算法实例

现在发送窗口的大小和拥塞窗口一样大。

  1. 当TCP连接进行初始化时,把拥塞窗口cwnd置为1.为了便于理解,图中窗口单位不用字节而使用报文段的个数。慢开始门限的初始值置为16个报文段。即ssthresh=16.
  2. 在执行慢开始算法时,拥塞窗口cwnd的初始值为1,。以后发送方每收到一个对新报文段的确认ACK,就把拥塞窗口值加1,然后开始下一轮的传输(图5-25的横坐标是传输轮次)。因此拥塞窗口cwnd随着传输轮次按指数规律增长。当拥塞窗口cwnd增长到慢开始门限ssthresh时(即当cwnd=16时),就改为执行拥塞避免算法,拥塞窗口按线性规律增长。
  3. 假定拥塞窗口的数值增长到24时,网络出现超时(很可能发生了网络拥塞)。更新后的ssthresh值变为12(即变为出现超时时的拥塞窗口数值24的一半),拥塞窗口在重新置为1,并执行慢开始算法。当cwnd=ssthresh=12时,改为执行拥塞避免算法,拥塞窗口按线性规律增长,每经过一个往返时间增加一个MSS的大小。

results matching ""

    No results matching ""