bookstack

传输层

功能概述

传输层只有主机才有的层次,为应用层提供通信服务使用网络层的服务

传输层功能

  1. 传输层提供进程和进程之间的逻辑通信
  2. 复用和分用
  3. 传输层对收到的报文进行差错校验

分用:传输层从网络层收到数据后交付指明的应用进程

传输层两个协议

  1. 面向连接的传输控制协议TCP
  2. 无连接的用户数据报协议UDP

UDP:传送数据之前不需要建立连接,收到UDP报文后也不需要给出任何确认。不可靠、无连接、时延小,适用于小文件

传输层寻址与端口

端口是传输层SAP,标识主机中的应用进程

端口号只有本地意义,在因特网中不同计算机的相同端口是没有联系的

端口号长度是16bit,能表示65536个不同端口号

熟知端口号:0-1023给TCP/IP最重要的一些应用程序,让所有用户都知道

登记端口号:1024~49151 没有熟知端口号的应用程序使用的

客户端使用的端口号:49152~65535仅在客户端进程运行时才动态选择

套接字

在网络中采用发送方和接收方的套接字组合来识别端点。套接字为宜标识了网络中的一个主机和它上面的进程

套接字Socket = (主机IP地址,端口号)

UDP协议

概述:UDP只在IP数据报服务智商增加了很少检测功能

主要特点

UDP是无连接的,减少开销和发送数据之间的时延

UDP使用最大努力交付,即不保证可靠交付

UDP是面向报文的,适合一次性传输少量数据的网络应用

应用层给UDP多长的报文,UDP就照样发送,即一次发一个完整的报文

UDP无拥塞控制,适合很多实时应用

UDP首部开销小,8B,TCP要20B

UDP首部格式

发送时,找不到对应的目的端口号,就丢弃报文,并给发送方发送ICMP端口不可达差错报文

UDP校验

伪首部只有在计算校验和时才出现,不向下传送也不向上递交

封装UDP报文的IP数据报首部协议字段时17

UDP长度:UDP首部8B+数据部分长度(不包括伪首部)

在发送端

填上伪首部,全0填充校验和字段,全0填充数据部分(UDP数据报要看成许多4B的字串接起来)

伪首部+首部+数据部分采用二进制反码求和

把和求反码填入校验和字段

去掉伪首部,发送

在接收端

填上伪首部

伪首部+首部+数据部分采用二进制反码求和

结果全为1则无差错,否则丢弃数据报/交给应用层附上出差错的警告

TCP协议

TCP特点

TCP面向连接(需连接)的传输层协议

每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的

TCP提供可靠交付的服务,无差错、不丢失、不重复、按序到达

TCP提供全双工通信,面向字节流

发送缓存:准备发送的数据&已发送但未收到确认的数据

接收缓存:按序到达但尚未被接受应用程序读取的数据&不按序列到达的数据

TCP把应用程序交下来的数据看成仅仅是一连串的无结构的字节流

TCP报文格式

序号:在一个TCP连接中传送的字节流中的每一个字节都按顺序编号,本字段表示本报文段所发送数据的一个字节的序号

确认号:期望收到对方下一个报文段的第一个数据字节的序号,若确认号为N,则证明序号N-1为止的所有数据都已正确收到

数据偏移(首部长度):TCP报文段的数据起始处距离TCP报文段的起始处有多远,以4B为单位,即1个数值是4B

紧急URG:URG=1时,表明此报文段中有紧急数据,是高优先级的数据,应尽快传送,不用在缓存里排队,配合紧急指针字段实用

确认位ACK:ACK=1时确认号有效,在连接建立后所有传送的报文段都必须把ACK置为1

推送位PSH:PSH=1时,接收方尽快交付接受应用进程,不再等到缓存填满时再向上交付

复位RST:RST=1时,表明TCP连接中出现严重错误,必须释放连接,然后再重新建立传输连接

同步位SYN:SYN=1时,表明是一个连接请求/连接接受报文

终止位FIN:FIN=1时,表明此报文段发送方数据已经发完,要求释放连接

窗口:指的是发送本报文段的一方的接收窗口,即现在允许对方发送的数据量

校验和:校验首部+数据,校验时要加上12B伪首部,第四个字段为6

紧急指针:URG=1时才有意义,指出本报文段中紧急数据的字节数

选项:最大报文长度MSS,窗口扩大,时间戳,选择确认等

TCP连接管理

TCP连接传输的三个阶段

建立连接

数据传送

连接释放

TCP连接的建立采用客户端服务器方式,主动发起连接建立的应用进程叫客户端,而被动等待连接建立的应用进程叫服务器

TCP连接建立(三次握手)

客户端发送连接请求报文段,无应用层数据。SYN=1,seq=x(随机)

服务器端为该TCP连接分配缓存和变量,并向客户端返回确认报文段,允许连接,无应用层数据。SYN=1,ACK=1,seq=y(随机),ack=x+1

客户端为该TCP连接分配缓存和变量,并向服务器端返回确认的确认,可以携带数据。SYN=0,ACK=1,seq=x+1,ack=y+1

SYN洪泛攻击

SYN洪泛攻击发生在OSI第四层,这种方式利用TCP协议的特性,就是三次握手

攻击者发送TCP SYN,SYN是TCP三次握手中的第一个数据包,而当服务器返回ACK后,该攻击者就不对其进行再确认,那这个TCP连接就处于挂起状态,也就是所谓的半连接状态,服务器收不到再确认的话,还会重复发送ACK给攻击者

这样更加会浪费服务器的资源,攻击者就对服务器发送非常大量的这种TCP连接,由于每一个都没法完成三次握手,所以在服务器上,这些TCP连接会因为挂起状态而消耗CPU和内存,最后服务器可能死机,就无法为正常用户提供服务了

设置SYN Cookie可以防止洪泛攻击

TCP的连接释放(四次挥手)

客户端发送连接释放报文段,停止发送数据,主动关闭TCP连接。FIN=1,seq=u

服务端返回一个确认报文段,客户到服务器这个方向的连接就释放了–半关闭状态。ACK=1,seq=v,ack=u+1

服务端发送完数据,就发出连接释放的报文,主动关闭TCP连接。FIN=1,ACK=1,seq=w,ack=u+1

客户端回送一个确认报文段,再等到时间等待计时器设置的2MSL(最长报文段寿命)后彻底关闭。ACK=1,seq=u+1,ack=w+1

TCP可靠传输

可靠:保证接收方进程从缓存区读出的字节流与发送方发出的字节流是完全一样的

可靠传输机制:校验、序号、确认、重传

校验:和UDP校验一样,增加伪首部

序号:一个字节占一个序号。序号字段指的是一个报文段第一个字节的序号

确认:TCP默认使用累计确认

超时重传:确认重传不分家,TCP的发送方在规定的时间内没有收到确认就要重传已发送的报文段

TCP采用自适应算法,动态改变重传时间RTTs(加权平均往返时间)

冗余确认:每当比期望序号大的失序报文段到达时,发送一个冗余ACK,指明下一个期待字节的序号

快速重传:发送方收到3个对于报文段1的冗余ACK,就认为报文段2丢失,重传2号报文段

流量控制

让发送方慢一点,要让接收方来得及接收,TCP利用滑动窗口实现流量控制

在通信过程中,接收方根据自己接收缓存的大小,动态调整发送方的发送窗口大小。即接收窗口rwnd(接收方设置确认报文段的窗口字段来将rwnd通知给发送方)。发送方窗口取接收窗口rwnd和拥塞窗口cwnd的最小值

流量控制过程

A向B发送数据,连接建立时,B告诉A:我的rwnd=400(字节)。设每一个报文段100B,报文段序号初始值为1

避免主机AB相互等待

TCP为每一个连接设有一个持续计时器,只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器

若持续计时器设置的时间到期,就发送一个零窗口探测报文段

接收方收到探测报文段时给出现在的窗口值

若窗口仍然是0,那么发送方就重新设置持续计时器

TCP拥塞控制

防止过多的数据注入到网络中,全局性的问题(流量控制是本位问题)

出现拥塞的条件

对资源需求的总和 > 可用资源

网络中有许多资源同时呈现供应不足,网络性能变坏,网络吞吐量随输入负荷增大而下降

拥塞控制的四种算法

慢开始:从1开始指数增大

拥塞避免:到达ssthresh值之后,加法增大

快重传:收到三个重复的确认执行快重传

快恢复:出现拥塞时,不是从1开始,而是从ssthresh的一半开始,并且新的ssthresh的值为拥塞处的一半

慢开始和拥撒避免

快重传和快恢复