计算机网络笔记,视频地址:https://www.bilibili.com/video/av9876107
传输层为相互通信的应用进程提供了逻辑通信 找到对应端口
此外,传输层还需要对收到的报文进行差错检测
常见应用层协议使用的端口:
传输层的数据包携带目标端口信息,不同服务根据端口匹配侦听
计算机上可能安装不同服务,但是接受的数据访问服务端需要匹配端口,这里涉及到了网络安全问题,避免恶意数据入侵服务
服务使用TCP或UDP端口侦听客户端请求
客户端使用IP地址定位服务器,使用目标端口定位服务
可以在服务器网卡上设置只开放必要的端口从而实现网络安全
netstat -a
:查看侦听的端口
telnet 192.168.80.100 3389
:测试到远程计算机192.168.80.100的3389端口是否打开
netstat -ano
:查看端口占用情况
tasklist | findstr "80"
:查看80端口被哪些应用占用
需要注意的是,端口号具有本地意义,同一个计算机上不同应用的端口号不同,但是不同计算机中的端口号没有联系,即不同计算机对应相同端口号表示的意义不同
端口可以分为三类:
UDP面向无连接的传输,不需要建立会话,非可靠传输,不需要流量控制
一个数据包就可以完成通信
UDP使用尽最大努力交付,不保证可靠交付,也不使用拥塞控制
UDP是面向报文的,适合多媒体通信要求
UDP支持一对一,一对多和多对多的交互通信
UDP首部开销小,只有八个字节
UDP首部格式:
伪首部中的UDP长度表示的是IP数据报的长度,首部中的长度表示UDP用户数据报的长度
计算过程如下:
1001 1001 0001 0011
+ 0000 1000 0110 1000
1010 0001 0111 1011
+ 1010 1011 0000 0011
1 0100 1100 0111 1110
进位 1
0100 1100 0111 1111
+ 0000 1110 0000 1011
0101 1010 1000 1010
+ 0000 0000 0001 0001
0101 1010 1001 1011
+ 0000 0000 0000 1111
0101 1010 1010 1010
+ 0000 0100 0011 1111
0101 1110 1110 1001
+ 0000 0000 0000 1101
0101 1110 1111 0110
+ 0000 0000 0000 1111
0101 1111 0000 0101
+ 0000 0000 0000 0000
0101 1111 0000 0101
+ 0101 0100 0100 0101
1011 0011 0100 1010
+ 0101 0011 0101 0100
1 0000 0110 1001 1110
进位 1
0000 0110 1001 1111
+ 0100 1001 0100 1110
0100 1111 1110 1101
+ 0100 0111 0000 0000
1001 0110 1101 1101
取反
0110 1001 0010 0010
应用:域名解析,QQ聊天、屏幕广播/多播
TCP是面向连接的传输,需要建立会话,是可靠的传输,有流量控制
每条TCP连接都有两个端点,是点对点的连接,全双工通信,面向字节流
传输的文件需要分段传输
应用:大文件传输,邮件发送
TCP连接的端点被称为套接字(socket),端口号拼接IP地址构成套接字
套接字 socket = (IP地址:端口号)
每一条TCP连接唯一地被通信两端的两个套接字确定,例如
{socket1,socket2}={(IP1:port1),(IP2:port2)}
传输连接的三个阶段:建立连接、数据传送、连接释放
TCP连接的建立都是采用客户服务器的方式,即将主动发起连接建立的应用进程叫做客户(Client),将被动等待连接建立的应用进程叫做服务器(Server)
TCP连接需要三次握手,断开需要四次挥手
三次握手
第一次握手:客户端发送syn报文请求到服务器,等待服务器确认,MSS表示最大数据包,seq表示序号,len表示数据长度;
第二次握手:服务器收到syn请求,向服务端发送一个确认报文ACK和一个请求连接报文SYN,WIN表示最大缓存;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK,此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
第三次握手是为了保证服务器SYN请求有效
握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。
四次挥手
与建立连接的“三次握手”类似,断开一个TCP连接则需要“四次握手”。
第一次挥手:客户端作为主动关闭方像服务器发送一个FIN报文申请断开,但是,此时客户端还可以接受数据
第二次挥手:服务器收到FIN包后,发送一个ACK给客户端,之后不再向客户端发送新的数据,但是如果已有数据在传输,会继续传输
第三次挥手:当服务端想客户端数据传输完成后,向客户端发送一个FIN断开报文
第四次挥手:客户端收到服务器的FIN报文之后, 向服务器发送ACK确认报文, 告诉服务器说我也收到了你的关闭请求了. 此时如果服务器收到了ACK报文,服务器就关闭了, 而客户端还要等待2MSL的时间之后才能关闭,如果2MSL内客户端未收到服务端重发的FIN就可以执行断开操作。
TCP首部包括固定的20个字节和可变数据
序号:分段数据的第一个字节是整个数据的第几个字节
确认号:记录发送端下一个数据段的起始字节数,例如发送1234这个数据段,确认号应该是5
数据偏移:记录TCP报文段从第几个字节开始有数据
URG(urgent):urg标记为1表示有较高的优先级,即在传输数据的时候不需要排队,直接先传
ACK(acknowledgment):ACK是0表示确认号无效,ACK为1表示确认号有效
SYN:建立会话请求,在建立请求那个会话为1,建立好会话后就为0
PSH(push):PSH设为1表示优先级较高,数据先传
RST(resset):RST=1表示服务中断,拒绝后面数据的通信,重新建立连接
FIN(finally):FIN=1表示释放连接
窗口:缓存大小,接收端要告诉发送端最大接收缓存,发送端要告诉接收端最大发送缓存
紧急指针:只有在urg=1时起作用,指明了紧急传递数据包的字节结束为止
这种可靠的传输协议被称为自动重传请求(Automatic Repeat reQuest, ARQ)
ARQ表明重传的请求是自动进行的,接收方不需要请求发送方重传某个出错的部分
但是ARQ的信道利用率太低
为了解决信道利用率低的问题,可以采用流水线传输,即发送方连续发送多个分组,如下图所示
连续ARQ协议可以连续发送数据
如上图所示,发送窗口为5,表示发送端可以连续发送五个数据包,然后等待接收端返回确认,等到第一个数据包确认,发送窗口前移一位,类似滑动窗口,注意在没有接收到接收端确认时,发送窗口中的数据不能丢弃
为了进一步提高效率,不需要每一个数据包都发送确认,可以使用累积确认,例如发送三个数据包,最后一个数据包发送确认就默认前两个都已经确认。
TCP实现可靠传输
以字节为单位的滑动窗口技术
即规定发送窗口和接收窗口,窗口中的数据可以打包发送,在接收端返回确认后,发送窗口可以往后移,发送成功的数据可以丢弃
选择性确认(SACK)
在发送的包不连续时,接收端会发送选择性确认,让发送端重新发送缺失的部分
超时重传时间
TCP每发送一个报文段就设置一个计时器,只要计时器设置的重传时间到了还未收到确认,就重传这一段报文
超时重传时间略大于加权平均往返时间 R T T s RTT_s RTTs
旧 的 新 的 样 本 R T T s = ( 1 − α ) ∗ ( 旧 的 R T T s ) + α ∗ ( 新 的 R T T 样 本 ) 旧的新的样本RTT_s=(1-\alpha)*(旧的RTT_s)+\alpha*(新的RTT样本) 旧的新的样本RTTs=(1−α)∗(旧的RTTs)+α∗(新的RTT样本)
发送端的窗口大小不能大于接收端
通过调整发送窗口和接受窗口的大小可以控制发送和接收的数据
当接收端缓存不足就需要缩小窗口,让可以处理缓存数据(将缓存数据发送给应用)
当对资源需求的总和大于可用资源就会出现资源拥塞情况
拥塞控制是一个全局性的过程,涉及到所有主机、所有路由器以及与降低网络传输性能有关的所有因素
可以看出,如果没有拥塞控制,可能使得传输量越大通过的数据量越少,更严重可能出现死锁情况,导致数据不能传输
发送方维持一个拥塞窗口(congestion window, cwnd)
发送方控制拥塞窗口的原则是:
慢开始门限刚开始设置为16,之后线性增长而不是按照指数增长,当出现网络拥塞后,新的慢开始门限变为网络拥塞前拥塞窗口的一半,之后拥塞窗口从1开始重新安装指数增长