传输层(TCP/UDP)
传输层的功能
TCP和UDP各自的使用场景
TCP(Transmission Control Protocol,传输控制协议)协议。
UDP(User Data Protocol,用户数据报协议)协议。
TCP
- 需要将要传输的文件分段传输(所以需要建立会话,如果数据丢失要让服务器再重传一遍)
- 建立会话 (客户端得记着已经收了几个数据包了,直到传输完成,结束会话)
- 可靠传输
- 流量控制(客户端接收不过来,告诉服务器等会儿再传)
UDP
- 一个数据包就能够完成数据通信,不需要分段
- 不需要建立会话
- 不需要流量控制
- 不可靠传输 (没收到就重新再传一遍)
比如:在将域名解析成IP地址时,向DNS发送请求(一个数据包就行)时就用的是UDP(不需要建立会话)---域名解析就是UDP
QQ聊天,也是UDP协议
传一个500M的文件的时候,用的是TCP协议
发电子邮件,用的是TCP协议;ftp下载文件也是TCP协议
屏幕广播,多播,广播都是用的UDP(虽然一个数据包完不成,但是它不建立会话,也不保证传输的可靠性)
查看会话:netstat -n(不可能看到UDP,因为UDP不建立会话)
查看建立会话的进程:netstat -nb
传输层协议和应用层协议之间的关系
TCP/UDP可以加一个端口号,来标识应用程序
常见的应用层协议使用的端口 http=TCP+80 https=TCP+443 RDP=TCP+3389 //远程桌面 ftp=TCP+21 共享文件夹=TCP+445 SMTP=TCP+25 //发邮件 POP3=TCP+110 //收邮件 telnet=TCP+23 SQL=TCP+1433 //微软的SQL Server DNS=UDP+53
服务和应用层协议之间关系
- 服务使用TCP或UDP的端口侦听客户端请求(侦听:迎宾——这个服务开启了才会侦听)
- 客户端使用IP地址定位服务器 使用目标端口,定位服务
- 可以在服务器网卡上设置只开放必要的端口,实现服务器网络安全
如何在Windows上安装服务 (安装-开启)可以通过
DNS服务
Web服务
SMTP
POP3服务
如何查看侦听的端口:
netstat -an 查看服务侦听的端口
netstat -n 查看建立的会话
netstat -nb 查看建立会话的进程
telnet 192.168.80.100 3389 测试远程计算机某个端口是否打开
传输层为相互通信的应用进程提供了逻辑通信
传输层实现程序到程序(通过TCP加端口)
网络层实现服务器到服务器,地址到地址
传输层协议和网络层协议的主要区别:
每一层都会通过某个方式来区分上一层
网络层通过协议号来区分传输层是TCP还是UDP(协议号 TCP 6 UDP 17 IGMP 1)
传输层通过端口来区分应用层的应用
TCP的端口
端口用一个 16 位端口号进行标志。0-65535
端口号只具有本地意义(本地计算机中各个端口是唯一的),即端口号只是为了标志本计算机应用层中的各进程。在因特网中不同计算机的相同端口号是没有联系的。
熟知端口 0-1023
TELNET:23 SMTP:25 DNS:53 HTTP:80 https:443 RDP:3389
登记端口 1024-49151
客户端端口 49152-65535
传输层协议(TCP/UDP)
UDP
UDP的主要特点
UDP 是无连接的,即发送数据之前不需要建立连接。
UDP 使用尽最大努力交付,即不保证可靠交付,同时也不使用拥塞控制。
UDP 是面向报文的。UDP 没有拥塞控制,很适合多媒体通信的要求。UDP用户数据报
UDP 支持一对一、一对多、多对一和多对多的交互通信。
UDP 的首部开销小,只有 8 个字节。
UDP 的首部格式
在计算检验和时,临时把“伪首部”和 UDP 用户数据报连接在一起。伪首部仅仅是为了计算检验和。
TCP
TCP特点:
TCP 是面向连接的传输层协议。在传输之前需要确保已经连接了(打电话的喂?)
每一条 TCP 连接只能有两个端点(endpoint),每一条 TCP 连接只能是点对点的(一对一)。
TCP 提供可靠交付的服务。
TCP 提供全双工通信(同时收和发的通讯,A和B打电话:A在说,也需要B反馈,嗯!明白了!/嗯?什么?)。
面向字节流。
TCP需要实现流量控制(服务器发送的太快,客户端处理不过来,所以客户端需要让服务器等会儿)、拥塞控制(两端都正常,但是传输过程中出现的拥堵导致数据丢失)
TCP是面向字节流的
TCP 把连接作为最基本的抽象。
每一条 TCP 连接有两个端点。从一个ID+端口到另一个IP+端口(IP地址+端口------------->IP地址+端口)
TCP 连接的端点不是主机,不是主机的IP 地址,不是应用进程,也不是传输层的协议端口。TCP 连接的端点叫做套接字(socket) 。
端口号拼接到IP 地址即构成了套接字。
TCP可靠传输的工作原理——停止等待协议
确认和重传机制,我们就可以在不可靠的传输网络上实现可靠的通信。
这种可靠传输协议常称为自动重传请求ARQ (Automatic Repeat reQuest)。
ARQ 表明重传的请求是自动进行的。接收方不需要请求发送方重传某个出错的分组 。
但是,停止等待协议的优点是简单,但缺点是信道利用率太低。
提高信道利用率的方法:流水线传输(发送方可连续发送多个分组,不必每发完一个分组就停顿下来等待对方的确认。由于信道上一直有数据不间断地传送,这种传输方式可获得很高的信道利用率。)
那流水线传输怎么保证可靠传输呢?
下面看一个连续ARQ协议:
滑动窗口技术:(可靠的流水线传输)
连续发5个,然后等收到1的确认包之后再发送数据6,1就可以丢掉了
接收方可以采用累积确认:
如果收到了数据1,2,3,那我只发个3的确认包,如果收到了1,2,4,那我就发个2的确认包,那发送方就会重新发送3以及后面的
TCP报文段的首部格式
目标端口和源端口:各占两个字节
序号:文件被分成好多部分进行传输,序号就是这个数据段的第一个字节在文件中的第几个字节,序号占4个字节
确认号:接收方返回的时候要告诉发送方下面要发几号数据段了
数据偏移:TCP的首部并不是固定长度的(有20个字节的固定首部),还有一个选项,长度是可变的,所以会有一个数据偏移来告诉对面我的首部到哪儿结束。数据偏移占4个二进制(最大是15,1代表4位,也就是TCP的首部最大有154=60个字节)选项部分最多有40个字节
保留:6位二进制(没有用)
URG:发送插队标记位(二进制,为1的话表示我这个数据包不需要排队,直接传)如果想要告诉对面别传了,一般要等到前面几个包传完了才能排的上我,但是加上URG就可以直接传,不需要排队了
PSH:接收插队标记位,为1的话,这个数据包到达对面后直接排到最前面
ACK:二进制,如果是0的话,确认号无效,如果是1的话,确认号才有效
SYN:建立会话标记(发起的时候=1)(之后再传的时候就等于0了)
在客户端向服务器发送建立会话请求时候SYN=1,发送请求的时候,ACK=0(还没开始发送呢),这个时候确认号和序号都为0;
服务器接收到请求之后,再给客户端发送的时候,SYN=1,这个时候要确认我收到你发的请求了,所以ACK就=1,而且,确认号=1,序号=0
RST:RST为1的话表明TCP会话出现的严重异常,需要释放连接(正在通讯的时候,停止了,这个时候RST就置为1,需要再重新建立连接)
FIN:数据全都传完了,FIN=1,表明要释放连接了
*序号是我发的数据的第一个;确认号是告诉对面我已经收到了前面的,你接下去应该从哪儿开始发**
窗口:通知对方我的缓存区最大能放多少个字节window size,我能支持的最大的数据包MSS
校验和(与UDP一样,TCP的报文段前面有一个12个字节伪首部,是用来计算校验和的,这里的协议号是6)
紧急指针:只有当URG为1的时候才有效,指明紧急数据结束的位置
选项:有些数据包里有选项,可以规定最大数据报是多大MSS,是否支持选择性确认