赞
踩
一、传输层与传输层协议
二、用户数据报协议(UDP)
三、传输控制协议TCP
四、TCP协议滑动窗口
传输层中实现传输层协议的软件称为”传输实体“,传输层之间出传输的报文称为”传输协议数据单元(TPDU)“
传输层实现分布式进程通信,首先就要解决进程标识的问题,在计算机网络中,只有知道IP地址和端口号,才能唯一找到通信的进程,即:
传输层端口号 + 网络层IP地址 = IP:端口
用一个例子来类比:
要找XX学校教学楼的601教室,所以必须知道学校地址和课室号,学校相当于IP地址,601教室相当于端口号
TCP/IP传输层的寻址是通过TCP与UDP端口号来实现的,TCP与UDP规定用不同的端口号来表示不同的应用程序
在TCP/IP协议中,端口号的数值取0-65535,且端口号分为三种类型:熟知端口号,注册端口号和临时端口号
TCP/UDP给每种标准的Internet服务器进程分配一个确定的全局端口号,由IANA同一分配
当用户开发新的网络应用程序时,可以为这种新的网络应用程序的服务器程序在IANA登记一个注册端口号
由运行在客户上的TCP/UDP软件随机选取的,只对一次进程通信有效
网络中的两台主机要实现进程通信,它们必须事先约定好传输层协议,如果一台用TCP,另一台用UDP,由于两种协议的报文格式,端口号分配的问题,会使得两台主机无法正常通信。
如果考虑到进程标识和多重协议识别,网络中一个进程的全网唯一的标识应该用三元组来表示:协议+IP地址+端口号;当两台主机通信时,一个完整的通信标识需要五元组:协议+本地IP地址+本地端口号+远程地址+远程端口号
一台运行TCP/IP协议的主机可能同时运行不同的应用程序,这些应用程序有的使用TCP,有的使用UDP,而TCP/IP协议允许多个不同应用程序的数据,同时使用IP地址和一个物理连接来发送和接受数据
多路复用和多路分解工作流程:
1. IP协议把TCP和UDP的TPDU都封装在一个IP分组上,发送到接收端
2. 接收端从IP分组中拆出TPDU传送到传输层
3. 传输层更具不同TPDU的端口号,区分出不同的TPDU属性,分别传送到不同的应用程序
应用层协议和传输层协议有三种类型:依赖TCP协议的应用层协议,依赖UDP协议的应用层协议,同时依赖TCP、UDP协议的应用层协议
依赖TCP协议的应用层协议:TELNET(虚拟终端协议)、SMTP(电子邮件协议)、FTP(文件传输协议)、HTTP(超文本传输协议)
依赖UDP协议的应用层协议:SNMP(简单网络管理协议)
同时依赖TCP、UDP协议的应用层协议:DNS(域名服务协议)
源端口号和目的端口号
指包括报头在内的用户数据报的总长度,UDP的报头规定为8字节,而UDP长度字段为16位,因此数据最大值为 2 ^ 16 - 8 = 65527
可选部分,用来检测用户数据报、UDP报头和伪报头传输过程中是否出错
UDP协议简洁,效率高,处理速度快,在P2P会话类中很突出,适用于实时语音与视频传输
1. 视频播放应用
2. 简短的交互式应用
3. 多播与广播应用
TCP传输数据前,源进程端口和目标进程端口必须建立了TCP传输连接
字节流中每一个字节都会有编号,虽然是面向字节的,但是不是每字节传输,而是把字节流分段,一个端的多个字节打包成一个TCP报文段发送
支持一个服务器与多个客户端,也支持一个客户端与多个服务端
提供确认重传,拥塞控制功能
TCP报头长度为20~60字节,其中基本长度为20字节,选项部分长度可变为40字节
包括源端口号和目的端口号
TCP是面向字节流的,它要为字节流中的每一个字节按顺序编号当TCP连接建立时,双方需要各自产生初始序号,然后为字节顺序编号。
例如一个TCP连接需要发送4500个字节,初始序号为10000,分为5个报文段发送,则:
第一个报文段的字节序号范围:10000~10999
第一个报文段的字节序号范围:11000~11999
第一个报文段的字节序号范围:12000~12999
第一个报文段的字节序号范围:13000~13999
第一个报文段的字节序号范围:14000~14499
表示一个进程已经正确接受序号为N的字节,要求发送端发送序号为N+1的字节
报头长度在20~60字节
字段长度为6位
控制字段定义了6种不同的控制位,同一时间可以设置1位或多位,控制字段用于TCP的建立连接和终止、流量控制,以及数据传送过程
1. URG(紧急位)
表示该报文段优先级高,尽快发送
2. ACK(确认位)
TCP连接确定后的所有报文的ACK都要为1
3. PSH(推送位)
当两个进程交互式通信时,一端应用进程希望输入一个命令后,能够立即得到对方的响应,则PSH置为1
4. RST(复位位)
复位位为1,有两种含义:一是因主机崩溃等原因造成TCP连接出错,需要立即释放连接,然后重建连接;二是拒绝一个非法TCP报文或拒绝释放一个连接
5. SYN(同步位)
用于在建立连接时同步序号。例如,当SYN=1,ACK=0,表示这是一个连接建立请求报文,同一建立连接的响应报文为SYN=1,ACK=1
6. FIN(终止位)
FIN=1表示请求释放TCP连接
窗口大小用于接收端通知发送端,下次最多可以发送多少字节数的报文
计算校检和和UDP相同,只是UDP校检和是可选的,TCP是必须的
表示TCP报文数据部分的最大长度,默认为536字节,它的大小可以直接影响发送和接受缓冲区设置的大小和使用效率
TCP协议的工作分为三个阶段:连接建立,报文传输,连接释放
TCP连接建立需要经过三次握手
关于为什么要三次握手,这涉及到一个著名的两军问题
第一次:A军派人穿过红军告诉B军要发动总攻
第二次:B军派此人再次穿过红军A军,告知A军,B军已收到(此时A确定了B已经收到,但是B不确定送信的人回去时有没有被红军俘获,所以需要第三次)
第三次:A再次派该人穿过红军,告知B军,我已经收到了你的确认
(seq为随机生成的序号,ack为确认号)
记住不要弄混ACK和ack,ACK是标志位,ack是确认序号
SYN=1:连接建立请求报文
SYN=1+ACK=1:连接建立请求确认报文
ACK=1:连接建立请求确认报文
三次握手:
1. 客户端开始为CLOSE状态,发送SYN=1,报文序号seq=x至服务端,此时客户端进入SYN-SEND状态
2. 服务端开始为LISTEN状态,表示正在监听连接,服务端接受到SYN,于是发送SYN+ACK的报文,报文序号seq=y,ack为x+1,表示我已经接受到客户端的序号x的报文了,下次客户端要给我发送序号x+1的报文,此时进入SYN-RCVD状态
3. 客户端接收到SYN+ACK后,发送ACK,seq=x+1(因为第2步中服务端ack=x+1,表示要客户端下次要发送x+1的报文给我),ack=y+1,此时双方进入到ESTABLISHED状态,连接成功
FIN-WAIT-1:表示等待对方的FIN报文
FIN-WAIT-2:也是表示等待对方的FIN报文,此时是进入到了半关闭状态
TIME-WAIT:表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态了,如果FIN_WAIT_1状态下,收到了对方同时带 FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态。
CLOSING: 这种状态比较特殊,实际情况中应该是很少见,属于一种比较罕见的例外状态。正常情况下,当你发送FIN报文后,按理来说是应该先收到(或同时收到)对方的 ACK报文,再收到对方的FIN报文。但是CLOSING状态表示你发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文。什 么情况下会出现此种情况呢?其实细想一下,也不难得出结论:那就是如果双方几乎在同时close一个SOCKET的话,那么就出现了双方同时发送FIN报 文的情况,也即会出现CLOSING状态,表示双方都正在关闭SOCKET连接。
CLOSE_WAIT: 这种状态的含义其实是表示在等待关闭。怎么理解呢?当对方close一个SOCKET后发送FIN报文给自己,你系统毫无疑问地会回应一个ACK报文给对 方,此时则进入到CLOSE_WAIT状态。接下来呢,实际上你真正需要考虑的事情是察看你是否还有数据发送给对方,如果没有的话,那么你也就可以 close这个SOCKET,发送FIN报文给对方,也即关闭连接。所以你在CLOSE_WAIT状态下,需要完成的事情是等待你去关闭连接。
LAST_ACK: 这个状态还是比较容易好理解的,它是被动关闭一方在发送FIN报文后,最后等待对方的ACK报文。当收到ACK报文后,也即可以进入到CLOSED可用状态了。
CLOSE:表示已关闭连接
TCP连接释放需要四次握手
1. 客户机发送”连接释放请求报文“,提出连接释放请求
2. 服务器收到”连接释放请求报文“后,发送”连接释放请求确认报文“,服务器进程向高层应用进程通知客户请求释放TCP连接,此时客户机到服务器的TCP连接释放,但是服务器到客户机的TCP连接未断开,此时如果服务器还有数据需要发送时可以继续发送。这种状态为”半关闭“状态
3. 服务器没有数据要发送后,服务器向客户发送”连接释放请求报文“。提出连接释放请求
4. 客户机收到”连接释放请求报文“后,发送”连接释放请求确认报文“,此时TCP连接完全释放
1. 保持计时器
2. 时间等待计时器
3. 重传计时器
4. 坚持计时器
TCP协议通过滑动窗口机制来跟踪和记录发送字节的状态,实现差错控制功能
滑动窗口大小:接收端通知发送端,下次最多可以发送多少字节数的报文
TCP使用两个缓存和两个个窗口来控制字节流的传输
- 发送端TCP有一个缓存,用来存储应用进程准备发送的数据,发送端对这个缓存设置一个发送窗口,只要窗口值不为0就可以发送报文段
- 接受端TCP有一个缓存,用于接受字节流,等待应用进程读取,接收端设置一个接受窗口,窗口只大小等于接受缓存可以接受多少字节流的大小
注意:
1. 发送窗口 不能大于 接受窗口,也就是说,发送窗口的值是根据接受窗口的值来确定的
2. 当接受缓冲区满了时,接受窗口为0,此时会发送一个“零窗口通知”给发送端,这是发送端会停止发送(跟坚持计时器有关)
窗口滑动流程:
1. 差错控制和传输的字节流状态分类
对字节流状态的跟踪,可以对正确传输的字节流进行确认,从而达到利用滑动窗口协议控制差错的目的
2. 发送窗口和可用窗口
发送窗口:发送端每一次发送过程中能够连续发送的字节数取决于发送窗口的大小,长度等于第2、3类字节数之和
可用窗口:表示发送端随时可以发送的字节数,长度为第3类字节数
3. 发送完毕后的窗口变化
4. 处理确认并滑动窗口
处理完上面的报文后,窗口向左滑动,准备发送下一报文段
选择重传和数据链路层的相同,有拉回方式和选择重传方式
作用:流量控制的目的是为了控制发送端的发送速率,使之不超过接收端的接受速率,防止接收端来不及处理而导致报文段丢失
流量控制是点-点链路的通信量的局部控制
流量控制流程:
(tips:通知窗口值=0表示接收缓冲区已满,发送端暂停发送;理解此图要记住发送端发送的数据,首先发送到接收端缓冲区,再由应用程序读取)
作用:拥塞控制用于防止过多的报文进入网络,而造成路由器与链路过载。
拥塞控制是网络报文总量的全局控制
当拥塞发生时的条件:
对网络资源需求 > 网络可用资源
拥塞窗口
拥塞窗口:发送端根据拥塞情况确定的窗口值,是TCP实现拥塞控制最基本的手段,发送端在确定拥塞窗口大小时,可以采用慢开始算法(从小到达逐步增加拥塞窗口)和拥塞避免算法
发送窗口,通知窗口(接收端的窗口),拥塞窗口
发送窗口的确定,应该是通知窗口和拥塞窗口的较小值
只要发现网络上没有出现拥塞,就增大拥塞窗口;当出现拥塞,就减小窗口值,问题是如何确定拥塞?
什么是一次往返:发送端发送报文给接收端,接收端在规定时间内返回了确认报文。
如果一次往返异常(没有接受到接收端的确认报文),说明出现拥塞
以二进制指数增长
第一次往返:拥塞窗口设为2,然后发送2个最大报文段
第二个往返:拥塞窗口设为4
第三次往返:拥塞窗口设为8
第四次往返:拥塞窗口设为16
………….
一次往返,拥塞窗口+1
设置一个阀值(慢开始阀值)k,当前拥塞窗口为cwnd
- 当cwnd < k时,使用慢开始算法
- 当swnd > k时,使用拥塞避免算法
- 当cwnd = k时,都可以使用
假设出现异常时,会出现什么样的变化?
- 拥塞窗口置为1
- 阀值置为原来的1/2,即k/2
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。