计算机网络学习(三):传输层
传输层
传输层主要就是TCP和UDP协议:
TCP(Transmission Control Protocol) : 传输控制协议
UDP(User Data Protocol): 用户数据报协议
TCP需要将要传输的文件 分段传输,建立会话,可靠传输,流量控制(QQ传文件,邮件,FTP)
UDP 一个数据包就能够完成数据通信, 不分段,不需要建立会话,不需要流量控制,不可靠传输(DNS, QQ聊天,广播,多播)
netstat -n 查看建立的会话
netstat -nb 查看建立会话的进程
应用层协议和传输层协议关系
RDP远程桌面协议
SMTP发邮件协议
DNS即可以用TCP也可以用UDP,多数使用UDP
常见应用层协议使用的端口
http = tcp+80
https=tcp+443
RDP = TCP + 3389
FTP = TCP +21
共享文件夹=TCP+445
SMTP = TCP+25
POP3(收邮件) = TCP + 110
telnet = TCP+23
MSSQL = TCP+1433
DNS = UDP+53
服务和应用层协议之间的关系
启动一个服务侦听请求
Web服务侦听TCP的80端口请求
。。。
。。。
服务使用TCP或UDP的端口侦听客户端请求
客户端石笋IP地址定位服务器 使用目标端口 定位服务
可以在服务器网卡上设置只开放必要的端口 实现服务器网络安全
安装服务
更改服务使用的默认端口
迷惑入侵者 使系统更加安全
查看服务侦听的端口
netstat -an
netstat -n 查看建立的会话
netstat -nb 查看建立会话的进程
telnet ip port 测试到远程计算机某个端口是否 打开(端口扫描工具SSPORT)
设置windows网络安全
设置本地连接 TCP/IP筛选,使一些端口不能被访问
传输层功能 为相互通信的应用进程提供了逻辑通信,端口到端口
网络层: 提供主机之间的逻辑通信,服务器到服务器,地址到地址,IP到IP
传输层的端口: 协议号 TCP 6 UDP 17 IGMP 1
端口 0 ~ 65535
常用端口 0 ~ 1023
登记端口 1024 ~ 49151
客户端端口 19152 ~ 65535
netstat -n | find "ESTABLISHED" 查看是建立状态的会话
UDP
UDP的主要特点
无连接的,即发送数据之前不需要建立连接
使用尽最大努力交付,即不保证可靠交付,同时也不使用 拥塞控制
UDP是面向报文的,UDP没有拥塞控制,很适合多媒体通讯的要求
UDP支持一对一,一对多,多对一和多对多的交互通信
UDP首部开销小,只有8个字节
长度字段包括首部,检验和是包括首部和数据的计算,伪首部就是为了计算检验和,把网络层的部分信息取出来放到伪首部里计算
检验和放到全0的位置
TCP
TCP协议主要特点
TCP是面向连接的传输层协议 三次握手
每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的
TCP连接的端点叫套接字,端口号拼接IP构成了套接字,
每一条TCP连接唯一地被通信两端的两个端点所确定
TCP提供可靠的交付服务
TCP提供全双工通信
面向字节流
解释xxx
如何实现可靠传输
这种可靠传输协议常称为自动重传请求ARQ(Automatic Repeat reQuest)
ARQ表明重传的请求是自动进行的。接受方不需要请求发送方重传某个出错的分组。
TA 收数据包用的时间,TA是确认号,大小相对固定,TD发数据包用的时间,RTT数据往返时间
信道利用率U
RTT和TA长度相对固定,只要提高增大Td,就能提高利用率
目前通讯、上网、聊天都是流水线传输
滑动窗口,假设发送窗口是5,就是窗口中有5个数据包,依次发5个数据包,然后等待确认,收到1号数据包确认,向右滑动一下,6号数据包被框住了,发送6号数据包,有一个确认才能向右移动,流水线传输通过滑动窗口技术来实现可靠传输。
每一个数据包都要收到一个确认,效率还是不高,所以采用累积确认
累积确认:连续的几个数据包,收到后面的确认,就当是前面的都收到了,后面的没收到确认就当丢失了,连着前面的都发送一遍。
TCP 报文段首部格式
首部有20字节固定首部,大部分数据报都是20字节。
序号(seq):分段后第一个字节是整个文件的第几个字节
确认号(ack):告诉发送方下一个数据包从第几个字节开始发(这次收到了前3个数据包,确认号就是4),确认号表示期望收到的下一个字节的序号
数据偏移:因为存在可变长度部分,数据偏移就是用来记录TCP报文段从多少个字节以后开始是数据,4位二进制,最大为15,单位为4个字节,最长可以表示60个字节,所以可变长度部分最大为40个字节。
过程:
DNS 域名解析
TCP :
SYN ,建立连接,MSS:最大数据包,1460(本机支持的最大数据包),WIN(窗口大小):缓存大小,发了这么多数据还没有收到确认就停止发送,建立连接的同时也商量了一些参数。
标记位:
也叫控制位,用来说明本报文的性质
URG:优先传,比如传的时候按了 Ctrl + C停止,要发一个数据包过去,但缓存里面还有很多数据包,这个标记位置1,则优先发送
ACK: 如果是0,确认号无效,1确认号才有效
SYN: 建立联机的时候用到, 发起方要建立会话,SYN位为1, 此情况下没有数据分块,所以序号是0, 确认号是对已接收数据的确认,所以此时不需要确认号,所以ACK位为0, 接收方同意建立,SYN=1,序号是0,确认收到了发送方发的数据包,确认号是1,ACK位是1。
相关攻击:
SYN攻击:不停的发送要建立会话的数据包,但是发送的数据包源地址全都写不存在的或者别的没有要建立会话的,然后目标机器不停的同意建立会话,占用计算机资源。
Land攻击:目标地址和源地址都写目标 机器,让其自己与自己建立会话
PSH: 和URG类似,但是URG是发送端优先发,PSH是在接收方的缓存里优先传递给应用程序
RST : 如果为1,说明TCP出现严重错误,中断连接,如果还需要通讯,需要重新建立会话,在传输过程中按刷新或者终止按钮会出现这个字段
FIN : 数据通讯结束的时候,数据传完了,释放连接,这一位为1
窗口
窗口占了两个字节,确认缓存大小,发送方先告诉接收方自己的接收缓存是多少,接收方把自己的发送缓存设置成这个值,接收方也需要告诉发送方自己的接收缓存有多大,然后发送方的发送缓存也要设置成和接收方相同。
检验和
两个字节,校验范围是首部和数据两部分,和UDP一样,计算的时候要加上十二个字节的伪首部,但是需要把伪首部中的第四个字段中的17改成6,因为TCP协议号是6,其他和UDP相同。
紧急指针
两个字节,只有在URG为1的时候才生效,如果紧急指针为50,那么数据部分从1到50 的部分是需要紧急处理的部分,它代表了紧急处理数据的最后位置。
以下字段可有可无
选项
可以规定最大数据报的大小,wireshark抓包中的MSS,还可以有其他选项,比如确认的时候是否支持选择性确认。
填充: 如果选项不够4个字节的整数倍,凑够4个字节的整数倍
TCP如果实现可靠传输
1. 等待确认
增加效率:窗口技术,累积确认
1. 以字节为单位的滑动窗口技术
如果丢失了部分,则选择性确认SACK,告诉哪一段丢失了。
2. 超市重传时间的选择
TCP每发送一个报文段,就对这个报文段设置一次计时器,只要计时器的重传时间到了但还没收到确认就会重传此报文段
超时重传时间应略大于上面得出的加权平均往返时间RTTs,RTTs:发数据包的平均往返时间,
RFC2988推荐的α值为1/8,由公式可以看出α越大,越依赖新的往返时间
3. 流量控制
解决通信两端处理速度不一致问题。
建立会话的时候有个拥塞窗口rwnd(Receiver Window,接收者窗口),两边要一致,传输过程中大小可能会有变化。
Q: 丢失中间的数据包怎么办?
丢失中间的包确认号为丢包确认号,要求发送方重传丢的包即后续的包。比如A发给B1245,丢了3,B会发确认号3,要求A重发345
缓存满了不接收了,就把rwnd改为0,处理完后再修改rwnd,这就是流量控制。
发送方也会定时发送确定窗口大小的数据包,来确认窗口大小,避免接收方的确认包丢失的情况。
4. 拥塞控制
出现资源拥塞的条件:对资源的需求总和大于可用资源
拥塞控制是一个全局性的过程,涉及到所有的主机、所有的路由器,以及与降低网络传输性能有关的所有因素
流量控制往往指在给定的发送端和接收端之间的点对点通信量的控制,他所要做的就是抑制发送端发送数据的速率,以便使接收端来得及接收
提供的负载就是传输的数据量。
拥塞控制:
发送方维持拥塞窗口cwnd(congestion window,拥塞窗口)
发送方控制拥塞窗口的规则是:
- 只要网络没有出现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送出去
- 只要网络出现拥塞,拥塞窗口就减小一些,以减少注入网络中的分组数
慢开始算法原理
- rwnd是用于流量控制的窗口大小,主要取决于接收方的处理速度,由接收方通知发送方调整
- cwnd是用于拥塞处理的窗口大小,取决于网络状况,由发送方探查网络主动调整
发送方发现发的数据包接收方都接收了,说明网络良好,就会逐渐加大拥塞窗口的大小。
当拥塞窗口达到慢开始门限(ssthresh)的时候,窗口大小就不再指数规律增长了,开始慢慢加一的增长,当发送过程中出现丢包的情况,就重新设置新的慢开始门限,并拥塞窗口从一开始重新慢慢增加。
拥塞避免是指在拥塞避免阶段把拥塞窗口控制为线性增长,使网络比较不容易出现拥塞。
快重传:接收方收到了没按顺序来的数据包(如124,没有3 ),就立刻给对方发送三个确认,说明丢包,而开始的发送方收到了接收方发来的三个确认,则发送方直接发送丢失的包,同时说明网络不阻塞,执行快重传算法,拥塞窗口也直接从新的慢开始门限慢慢增加,而不会从1开始增加。
快恢复是相对于慢开始来说的。
发送窗口的上限值:Min[ rwnd, cwnd ]
TCP的传输连接管理
传输连接有三个阶段:建立连接、数据传送、连接释放
建立连接: 用三次握手建立TCP连接
三次握手的最主要目的是保证连接是双工的,可靠更多的是通过重传机制来保证的
第一次握手:客户端发送 SYN=1 ,ACK = 0, seq = x (x是随机数) (同步数据包SYN=1,确认号没用所以ACK为0,seq序号由客户端自定)
第二次握手:服务端回应:SYN=1, ACK=1, seq=y(y是随机数),ack=x+1 (ACK=1,确认号生效,为x+1,序号y由服务端自定)
第三次握手:客户端发送 ACK=1, seq=x+1, ack=y+1 (第三次不再设置SYN)
第三次握手的必要性:
情景: A发送给B一个请求建立连接,但是路由选择了较远的一条路,A看B没回应,就又发了一个请求,这次选择了较近的路,B直接给了回应,于是二者就开始传输数据了,过了一会B收到了A刚开始发的请求,于是又给了一个回应,但是A已经传好数据了,就不管B的回应了,B就开始等待,造成资源浪费,这种情况多了B就瘫痪了。如果是三次确认,B会没握手成功,没收到回应就释放掉连接。
用三次握手建立TCP连接的各状态
SYN-SENT LISTEN SYN-RCVD ESTAB-LISHED ESTAB-LISHED
netstat -n 查看会话状态
TCP的连接释放
MSL默认是2分钟,目的是防止服务器没有收到客户端最后的一个停止信息,继续发数据包过来。