传输层概述
传输层功能
一,实现了不用主机进程间的通信。
- 在网络层,解决的是主机到主机的通信;利用IP地址
- 在传输层,解决的是进程到进程的通信;利用套接字Socket(由IP地址+端口号组成)
二,传输层对收到的报文进行差错检验
端口
在程序层面传输数据,需要利用端口,来标明数据,类似于IP,一个ip地址代表一个主机,而一个端口代表一个程序。
- 服务端端口号
- 熟知端口号:0-1023
- 登记端口号:1024-49151
- 客户端端口号:49152-65535(随机分配的)
常用端口号如下:
端口 | 服务 |
---|---|
20、21 | FTP |
22 | SSH |
80 | HTTP |
443 | HTTPS |
53 | DNS |
用户数据报协议UDP
UDP概述
- 无连接的
- 不可靠交付,出错直接丢弃
- 面向报文的:一次发送一个完整的报文
- 用来传输少量数据
- 无拥塞控制,延时小,适合于直播,网络电话
UDP的首部格式
UDP首部字段很简单,由4个字段组成(其中伪首部会被丢弃),每个字段的长度都是两个字节,共8字节
- 源端口 原端口号,在需要对方回信时选用,不需要时可全0
- 目的端口 目的端口号,这在终点交付报文时必须使用,不然数据交给谁呢?
- 长度 UDP的长度,最小值为8字节,仅有首部
- 检验和 检测用户数据报在传输过程是否有错,有错就丢弃。
在传输的过程中,如果接收方UDP发现收到的报文中的目的端口不存在,会直接丢弃,然后由网际控制报文协议ICMP给发送方发送“端口不可达”差错报文。
伪首部不在网络中传输,只是在计算检验和,不向下传递也不向上递交。
传输控制协议TCP
TCP概述
- 面向连接的传输协议
- 提供可靠交付服务,无差错
- 全双工的通信。
- 面向字节流的,会把文件分成多个
TCP报文段首部
源端口和目的端口 各占两个字节,TCP的分用功能也是通过端口实现的。
序号 占4个字节,范围是[0,232],TCP是面向字节流的,每个字节都是按顺序编号。例如一个报文段,序号字段是201,携带数据长度是100,那么第一个数据的序号就是201,最后一个就是300。当达到最大范围,又从0开始。
确认号 占4个字节,是期望收到对方下一个报文段的第一个字节的序号。并且确认号为N,则表示序号N前所有的数据已经正确收到了。
数据偏移 占4位,表示报文段的数据部分的起始位置,距离整个报文段的起始位置的距离。间接的指出首部的长度。
保留 占6位,保留使用,目前为0.
URG(紧急) 当URG=1,表明紧急指针字段有效,该报文段有紧急数据,应尽快发送。
ACK(确认) 仅当ACK=1时,确认号才有效,连接建立后,所有的报文段ACK都为1。
PSH(推送) 接收方接收到PSH=1的报文段,会尽快交付接收应用经常,不再等待整个缓存填满再交付。实际较少使用。
RST(复位) RST=1时,表明TCP连接中出现严重差错,必须是否连接,再重连。
SYN(同步) 在建立连接时用来同步序号。当SYN=1,ACK=0,则表明是一个连接请求报文段。SYN=1,ACK=1则表示对方同意连接。TCP建立连接用到。
FIN(终止) 用来释放一个连接窗口。当FIN=1时,表明此报文段的发送方不再发送数据,请求释放单向连接。TCP断开连接用到。
窗口 占2个字节,表示发送方自己的接收窗口,窗口值用来告诉对方允许发送的数据量。
校验和 占2字节,检验和字段查验范围包括首部和数据部分。
紧急指针 占2字节,URG=1时,紧急指针指出本报文段中的紧急数据的字节数(紧急字节数结束后为普通字节)。
选项 长度可变,最长可达40字节。例如最大报文段长度MSS。MSS指的是数据部分的长度而不是整个TCP报文段长度,MSS默认为536字节长。窗口扩大,时间戳选项等
TCP连接管理
TCP建立连接-三次握手
第一次:客户端发送连接请求报文给服务端,其中SYN=1,seq=x。发送完毕后进入SYN_END状态。
第二次:服务端接收到报文后,发回确认报文,其中ACK=1,ack=x+1,因为需要客户端确认,所以报文中也有SYN=1,seq=y的信息。发送完后进入SYN_RCVD状态。
第三次:客户端接收到报文后,发送确认报文,其中ACK=1,ack=y+1。发送完客户端进入ESTABLISHED
状态,服务端接收到报文后,进入ESTABLISHED
状态。到此,连接建立完成。
三次握手原因
避免资源被浪费掉。如果在第二步握手时,由于网络延迟导致确认包不能及时到达客户端,那么客户端会认为第一次握手失败,再次发送连接请求,服务端收到后再次发送确认包。在这种情况下,服务端已经创建了两次连接,等待两个客户端发送数据,而实际却只有一个客户端发送数据。
TCP断开连接-四次挥手
第一次挥手:客户端发送FIN=1,seq=x的包给服务端,表示自己没有数据要进行传输,单面连接传输要关闭。发送完后,客户端进入状态。
第二次挥手:服务端收到请求包后,发回ACK=1,ack=x+1的确认包,表示确认断开连接。服务端进入CLOSE_WAIT
状态。客户端收到该包后,进入FIN_WAIT_2
状态。此时客户端到服务端的数据连接已断开。
第三次挥手:服务端发送FIN=1,seq=y的包给客户端,表示自己没有数据要给客户端了。发送完后进入LAST_ACK
状态,等待客户端的确认包。
第四次挥手:客户端收到请求包后,发送ACK=1,ack=y+1的确认包给服务端,并进入TIME_WAIT
状态,有可能要重传确认包。服务端收到确认包后,进入CLOSED
状态,服务端到客户端的连接已断开。客户端等到一段时间后也会进入CLOSED
状态。
四次挥手原因 由于TCP的连接是全双工,双方都可以主动传输数据,一方的断开需要告知对方,让对方可以相关操作,负责任的表现。
TCP可靠传输的实现
确认和超时重传
TCP流量控制
滑动窗口协议
TCP滑动窗口协议主要为了解决在网络传输数据的过程中,发送方和接收方传输数据速率不一致的问题,从而保证数据传输的可靠性,达到流量控制的效果。 发送方中的数据分为三种:
- 发送已确认
- 发送未确认
- 未发送
接收方数据分为三种:
- 已接收和确认但未被上层读取
- 接收未确认
在发送方的滑动窗口中,可分为发送窗口和可用窗口。发送窗口中的数据已发送接收方,但未接到接收方的确认;可用窗口则表示发送方还可以发送多少数据。发送方的窗口大小会受到接收方窗口的改变而改变。
TCP拥塞控制
拥塞
什么是拥塞呢,在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络性能就会变坏了,这种情况就叫拥塞。网络资源常指网络链路容量(带宽)、交换结点中的缓存和交换处理机。
当出现拥塞,条件允许一般都是通过添加网络资源,例如带宽换成更大的,但这治标不治本,而且不一定总是有用。网络拥塞往往是有许多因素引起的,因此就需要拥塞控制了。
拥塞控制
拥塞控制指防止过多的的数据注入到网络中,这样可以使网络中的路由器或链路不过载。拥塞机制是一个全局性的过程,涉及到所有主机、所有路由器,以及与降低网络传输性能有光的所有因素。
而滑动窗口协议的流量控制,是指点到点的通信量控制,是端到端的问题。
TCP的拥塞控制方法
TCP进行拥塞控制的算法有四种:慢开始、拥塞避免、快重传、快恢复。