运输层#
一、进程之间的通信
1、运输层向它上面的应用层提供通信服务 ,两台主机通信时,只有主机的协议栈才有运输层,网络核心部分的路由器在转发分组时只用到了下面三层功能
2、两台主机进行通信就是两台主机中的应用进程互相通信 ,IP协议将分组送到目的主机,运输层协议将网络层中的分组信息交付到主机的应用进程。通信的真正端点并不是主机而是主机中的进程
3、运输层的两个功能,复用 和分用
1)复用: 在发送方,不同的应用程序都可以使用同一个运输层协议传送数据(加上适当首部);
2)分用: 在接收方,运输层在剥去报文的首部后能够把这些数据正确交付目的主机进程。
二、端口
1、常说的端口是指层之间的抽象的协议端口,是一种软件端口;而交换机和路由器上的端口是硬件端口;前者是应用层各种协议进程与运输实体进行层间交互的一种地址
2、端口号位于UDP或者TCP的首部,运输层收到IP层交上来的运输层报文后,根据首部中的目的端口将数据交付应用层的目的应用进程。
3、运输层端口号的两大类:
1)服务器端使用的端口号 ,可分为两类:
~系统端口号:0-1023~登记端口号:1024-49151
2)客户端可使用的端口号: 49152-65535
三、UDP(User Datagram Protocol,用户数据报协议):
1、UDP协议只在IP的数据报服务之上添加了很少的功能,复用分用和差错检测功能。
2、UDP协议主要特点:
1)UDP是无连接的;
2)UDP使用尽最大努力交付 ,即不保证可靠交付;
3)UDP是面向报文的。发送发对应用层交下来的报文,在增加首部后就向下交付IP层,不合并,不拆分,保留报文边界
4)UDP没有拥塞控制
5)UDP支持一对一,一对多,多对一和多对多通信
6)UDP首部只有8个字节,开销小
四、UDP首部格式
1、UDP首部有4个字段,每个字段2字节,共8个字节
2、源端口: 需要对方回信时选用,不需要时全为0
3、目的端口: 重点交付报文时必须使用
4、长度: UDP用户数据报的总长度(首部+数据部分),最小值为8
5、检验和: 检验UDP数据报是否出错,有错就丢弃。UDP的检验和是把首部和数据部分一起检验 ,而IP数据报的检验和只检验IP数据报首部
6、如果接收方的UDP发现收到的报文中目的端口不对,就丢弃该报文,并由网际控制报文协议ICMP发送“端口不可达”差错报文给发送方
五、TCP(Transmission Control Protocol,传输控制协议)
1、TCP的主要特点:
1)TCP是面向连接的运输层协议。
2)每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点(一对一) 的
3)TCP提供可靠性交付。无差错,不重复,不丢失,并且按序到达
4)TCP提供全双工通信。
5)TCP是面向字节流。 TCP的流指的是流入到进程或者从进程中流出的字节序列 ,面向字节流的意思是:虽然应用程序和TCP的交互是一次一个数据块(大小不一),但是TCP仅把应用程序交下来的数据看成一连串无结构的字节流,TCP并不知道字节流的含义。例如发送方应用程序给TCP发送10个数据块,但是接收方的TCP可能4个数据块就把收到的字节流交付上层应用程序,接收方的应用程序必须有能力识别收到的字节流,也就是说,识别字节流的功能是应用层具备的。
2、TCP连接的端点: 不是主机,不是IP地址,不是应用进程,也不是运输层的协议端口,是套接字socket,socket = (IP:端口)
六、可靠传输
1、停止等待协议: 发送方发送完一个分组后,停止 发送,等待 对方对于该分组的确认,收到确认后再发送下一个分组。
1)发送方只要超过一定时间还没有收到对方的确认,就认为刚才发送的分组丢失了,因而重传刚才的分组,这就叫作超时重传 ,应注意:
~发送方在发送完一个分组后,必须暂时保留该分组的副本 (以备重传时使用),一旦收到对方的确认信息,可删除该分组副本~分组和确认分组都必须进行编号。编号是为了双方明确收到哪一个分组以及收到哪一个分组的确认
~重传时间应该比数据传输的平均往返时间更长一些~丢弃这个重复的分组 ,不向上层交付
2)如果接收方发送的确认分组丢失,导致发送发再次重发上一分组,此时接收方应该:
~~~重新发送确认分组
2、连续ARQ协议
1)发送发维持一个发送窗口,在发送窗口内的分组可以连续发送出去
2)接收方采取累计确认 ,对按序到达的最后一个分组发送确认
七、TCP报文的首部格式
1、TCP虽然是面向字节流的,但是TCP传送的数据单元却是报文段(message segment)
2、TCP的全部功能都体现在首部中的各字段中。首部包含20字节 的固定首部+4n字节的选项
3、首部固定部分各字段的意义如下:
1)源端口 和目的端口: 各占2字节。分别写入源端口号的目的端口号;
2)序号: 占4个字节。TCP传送的字节流中的每一个字节都按顺序编号;
3)确认号: 占4个字节。是期望收到对方下一个报文段的第一个数据字节的序号, 确认号为N,表明序号到N-1的所有字节已经正确收到
4)数据偏移: 占4bit,指出TCP报文段的数据起始处距离TCP报文段的起始处有多远
5)保留: 占6bit, 保留今后使用,目前全为0
下面为6个控制为,各占1bit
6)URG: 为1时,表示紧急指针(14)有效,告诉系统此报文段中有紧急数据,应尽快传送
7)ACK: 为1时,确认号字段才有效。TCP连接建立后,所有传送的报文必须将ACK置1
8)PSH: 为1时,立即交付应用进程
9)RST: 为1时,表示TCP连接中出现严重错误,必须释放连接然后重新建立连接
10)SYN: 连接建立是用来同步序号,同步后SYN为0。当SYN=1,ACK=0时,表示这是一个连接请求报文段;SYN=1,ACK=1时表示这是一个同意连接请求报文段报文段
11)FIN: 用来释放一个连接。当FIN=1时,表示次报文段的发送方的数据已经发送完毕,并要求释放连接
12)窗口: 占2字节,指发送本报文段的一方的接收窗口。告诉对方你应该设置多大的窗口值
13)检验和: 占2字节,检验和检验报文段首部和数据两个部分
14)紧急指针: 占2个字节,指出本报文段中紧急数据的字节数。从第一个字节开始,所以紧急指针指出紧急数据的末尾在报文段中的位置
15)选项: 长度可变,最大可达40字节
4、最大报文段长度MSS(Maximum Segment Size): 每一个TCP报文段找那个的数据字段的最大长度。并非TCP字段总长度,而是整个TCP报文段长度减去首部之后的数据部分 的长度
5、MSS设定规则: 尽可能大些,只要在IP层不需要再分片就行
八、TCP的流量控制
1、流量控制,是让发送方的发送速率不要太快,要让接收方来得及接收
九、TCP的拥塞控制
1、拥塞控制,就是防止过多的额数据注入到网络中,这样可以是网络中的路由器或者链路不至过载
2、与流量控制的区别:
1)流量控制是点对点通信量的控制,是端到端的问题(接收端通过窗口控制发送端 )
2)拥塞控制是一个全局性 的过程,涉及到网络中的各个结点
3、拥塞控制的两种方法:
1)开环控制: 在设计网络时事先将有关发生拥塞的因素考虑清楚,力求网络在工作时不产生拥塞。一旦系统运行起来,就不再中途进行改正
2)闭环控制: 一个动态解决拥塞的过程
4、TCP的拥塞控制方法
1)慢开始: 发送方维持一个拥塞窗口 的状态变量,该拥塞窗口一般起始值较小。
2)慢开始的基本思想是:当主机开始发送数据时,由于不清楚网络的负荷情况,所以从小到大逐渐增大发送窗口,也就是从小到大逐渐增加拥塞窗口数值
3)拥塞避免: 让拥塞窗口cwnd缓慢增大,即没经过一个往返时间RTT就把发送方的拥塞窗口加1,而不是像慢开始时呈指数式增长
4)快重传: 要求即便收到了失序的报文段,也要立即发出自己对已收到报文的重复确认。一般失序后,连续再发3次已收到的最后一个序号的报文段。
5)块恢复: 快恢复避免让发送方启动慢开始,而是重新设置发送方门限值ssthresh=cwnd/2,同时设置拥塞窗口cwnd=ssthresh,并开始拥塞避免算法
十、TCP的运输连接管理
1、三次握手建立TCP连接:
1)客户->服务器 :SYN=1,seq=x,客户向服务器发送连接请求SYN报文段,SYN报文段不能懈怠数据,但要消耗一个序号;
2)服务器->客户 :SYN=1,ACK=1,seq=y,ack=x+1,服务器向客户发送同一TCP连接请求报文段,序号为y,ACK为1保证确认字段ack有效,确认号ack=x+1表示要求客户端下一个报文段的序号从x+1开始;同样该报文段不能携带数据,但是要消耗一个序号;
3)客户->服务器 :ACK=1,seq=x+1,ack=y+1,客户收到服务器的确认后,还要向服务器再次发送确认。seq=x+1表示报文段开始序号,ack=y+1表示要求服务器下一个发来的报文段序号从y+1开始
2、最后一次客户想服务器的确认,是为了防止“已失效的连接请求报文段”突然又传到了服务器
3、四次挥手释放TCP连接:
1)客户->服务器 :FIN=1,seq=u,客户向服务器发送连接释放报文段。FIN=1为表示此报文段为请求连接释放报文段,seq=u,u为前面已传送的最后一个自己序号加1
2)服务器->客户 :ACK=1,seq=v,ack=u+1,服务器向客户发出确认报文,此时A到B这个方向的连接已经释放了,整个TCP连接处于半关闭状态 ,即客户已经没有数据再发送了,也不能再向服务器发送数据,但是服务器仍然可以给客户发送数据(如果还有的话),客户也仍然要接收
3)服务器->客户 :FIN=1,ACK=1,seq=w,ack=u+1,服务器把所有数据传给客户之后,向客户发送连接释放报文段,seq=w,w为半关闭状态发送的最后一个字节序号加1;
4)客户->服务器 :ACK=1,seq=u+1,ack=w+1,客户向服务器发送连接释放确认报文段;服务器收到确认报文后,立即进入closed状态
此时TCP连接并没有完全释放,必须经过时间等待计时器 设置的时间2MSL(最长报文段寿命)后,客户才能进入closed状态,TCP连接完全释放,一是为了保证客户发送的最后一个ACK报文段能够达到B,二是防止上述“已失效连接请求报文段”出现在本链接中