运输层
应用场景比较!
应用层协议提供两种不同的运输层协议。
UDP(用户数据报协议):为应用程序提供了一种不可靠的,无连接的服务。
TCP(传输控制协议):为应用程序提供了一种可靠的,面向连接的服务。
多路复用与多路分解
多路分解:将运输层报文段中的数据交付到正确的套接字。
多路复用:从源主机的不同套接字中收集数据块,并为每个数据块封装上首部信息从而生成报文段,将其传输到网络层。
如何实现?
主机上的每个套接字被分配一个端口号,当报文段到达主机时,运输层检查报文段中的目的端口号,并将其定向到相应的套接字。报文段中的数据通过套接字进入所连接的进程。
1.无连接的多路复用与多路分解
运输层报文段:应用程序数据,源端口号,目的端口号,其他两个值。
UDP套接字:目的IP地址和目的端口号的二元组来全面标识的。
2.面向连接的多路复用与多路分解
TCP套接字:源IP地址,源端口号,目的IP地址,目的端口号。
**UDP使用(应用层协议)提供可靠性。
**TCP/UDP的端口使用(16)位二进制表示。
UDP用户数据报协议
无连接:注意到使用UDP时,在发送报文段之前,发送方和接收方的运输层实体之间没有进行握手,因此,UDP称为无连接的。
既然TCP提供可靠的数据传输服务,那么TCP是否总是首选呢?
不是。原因如下:
1.实际应用通常要求最快发送速率,能够容忍一些数据丢失的时候。采用UDP。(应用层能更好地控制要发送的数据和发送时间)
2.UDP不需要任何准备即可进行数据传输,不会引入建立连接的时延。(无需连接建立)------DNS应用
3.某些应用服务器使用UDP,以便能够支持更多的活动客户机(无连接状态)
4.每个TCP报文段有20字节的首部开销,而UDP只有8个字节开销。(分组首部开销)
UDP报文段结构:
UDP首部只有4个字段,每个字段由两个字节组成。每个字节8bit;接收主机使用检验和来检查报文段中是否存在差错;长度字段指明了包括首部在内的UDP报文段长度。
面向连接的运输:TCP
TCP连接提供的是全双工服务(由A–>B,由B–>A),点对点的。
建立起TCP连接的方式:三次握手
传输过程
建立起TCP连接后,客户机进程通过套接字传递数据流,一旦通过套接字,它就由客户机中运行的TCP控制了,TCP将数据连接到发送缓存,不断从发送缓存中取出一块数据加上TCP首部,形成TCP报文段,网络层封装在网络层IP数据报中,然后下传到网络层。当TCP在另一端接收端一个报文段后,该报文段的数据就放入TCP连接到接收缓存中,应用程序从此缓存中读取数据流。
TCP报文段结构
1.序号
假定A主机上的进程想通过TCP连接B主机上的一个进程发送一个数据流。数据流500000字节,最大传输单元MSS1000字节,TCP将数据流构建为500各报文段,第一个报文段的序号被赋为0,第二个报文段序号赋为1000,第三个2000…
2.确认序号
往返时延的估计与超时
1.估计
任意时刻,仅为一个已发送的但目前未被确认的报文段测量一个Sample RTT(采样往返路程)。
加权平均值:
a = 0.125
2.设置贺管理重传超时间隔
其中
定义了RTT偏差,运算公式如上,B = 0.25
可靠数据传输
TCP的可靠数据流传输服务确保一个进程从接收缓存中读出非损坏的,无间隔的,非冗余的和按序的数据流。
2.加倍超时间隔
定时器过期很可能是由网络拥塞引起,即太多的分组到达源与目的地之间路径上的路由器队列中,造成分组丢失或长时间排队时延,拥塞时候,如果源持续重传分组,会使拥塞更加严重。,因此,TCP使用发送方重传都是经过越来越长的时间间隔进行的。
TCP连接的建立
From:微信公众号 —>Java团长
三次握手:
三次握手(Three-way Handshake)其实就是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备。
第一步:客户端的TCP首先向服务器端的TCP发送一个特殊的TCP报文段(SYN报文段)。该报文段中不包含应用层信息,报文段首部的标志位(SYN比特)被置为1,选择一个初始化序列号x。----------发送过SYN报文段后,进入SYN_SENT(同步发送)状态。
第二步:当服务器主机接收到上述报文段,会为该TCP连接分配TCP缓存和变量,并给客户机发送允许连接的报文段(SYNACK)。该报文段中不包含应用层信息,报文段首部的标志位(SYN比特,ACK比特)被置为1,确认序号置为x+1,选择一个初始化序列号y。--------SYN_RCVD状态
第三步:收到SYNACK报文后,客户机为该连接分配缓存和变量,还会向服务器发送一个报文段,该报文段首部标志位(ACK)被置为1,确认序列号为y+1,序号为x+1。----------收到过SYNACK报文段后,进入ESTABLISHED(已建立)状态。
当连接结束后,主机中使用的“资源”(缓存和变量)被释放。
问题:1.为什么要初始序号,为什么是三次握手,不是两次,不是四次?
问题:2.什么是半连接队列?
服务器第一次收到客户端的SYN之后,双方还没有完全建立连接,服务器会把这种请求连接放到一个队列里,此队列称为半连接队列,队列满了就会出现丢包现象。
服务器SYN-ACK重传机制:未收到客户端的确认包,首次重传,等一段时间,第二次重传,直到超过最大重传次数,就会将该连接信息从半连接队列中删除。
问题:3. ISN(Initial Sequence Number)是固定的吗?
ISN随时间而变化,因此每个连接都将具有不同的ISN。ISN可以看作是一个32比特的计数器,每4ms加1 。这样选择序号的目的在于防止在网络中被延迟的分组在以后又被传送,而导致某个连接的一方对它做错误的解释。
三次握手的其中一个重要功能是客户端和服务端交换 ISN(Initial Sequence Number),以便让对方知道接下来接收数据的时候如何按序列号组装数据。如果 ISN 是固定的,攻击者很容易猜出后续的确认号,因此 ISN 是动态生成的。
问题:4 三次握手过程中可以携带数据吗?
1,2不可以,3可以。
问题:4 SYN攻击是什么?
服务器端的资源分配是在二次握手时分配的,而客户端的资源是在完成三次握手时分配的,所以服务器容易受到SYN洪泛攻击。
SYN攻击就是Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server则回复确认包,并等待Client确认,由于源地址不存在,因此Server需要不断重发直至超时,这些伪造的SYN包将长时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络拥塞甚至系统瘫痪。