目录
本文是根据小码哥的网络协议课程做的笔记
传输层有两个协议
TCP(Transmission Control Protocol),传输控制协议
UDP(User Datagram Protocol),用户数据报协议
UDP
UDP - 数据格式
UDP是无连接的,减少了建立和释放连接的开销。UDP尽最大能力交付,不保证可靠交付。因此不需要维护一些复杂的参数,首部只有8个字节(TCP的首部至少20个字节)
UDP长度占16位,首部的长度+数据的长度
检验和的计算内容:伪首部+首部+数据
伪首部:仅在计算检验和时起作用,并不会传递给网络层
端口(Port)
UDP首部中端口是占用2字节,可以推测出端口号的取值范围是:0~65535
客户端的源端口是临时开启的随机端口,一旦这一次请求结束了,这个端口可能就不占用了。服务器的端口要一直开着
防火墙可以设置开启\关闭某些端口来提高安全性
常见的一些协议默认使用的端口:
访问数据库时,为了安全起见,通常用防火墙关闭3306端口,先访问HTTP,再在内部发请求给mysql
常用命令行
netstat -an:查看被占用的端口
netstat -anb:查看被占用的端口,占用端口的应用程序
telnet 主机 端口:查看是否可以访问主机的某个端口
安装telnet:控制面板 - 程序 - 启用或关闭Windows功能 - 勾选 "Telnet Client" - 确定
TCP
TCP - 数据格式
数据偏移
占4位,取值范围是0x0101~0x1111
乘以4:首部长度(Header Length)
首部长度是20~60字节,由于首部长度至少是20个字节,所以数据偏移最小取值是5。首部长度可用于计算右面的TCP数据部分的偏移长度
保留
占6位,目前全为0
TCP的几个要点
可靠传输
流量控制
拥塞控制
连接管理 建立连接 释放连接
TCP - 小细节
有些资料中,TCP首部的保留(Reserved)字段占3为,标志(Flags)字段占9位。Wireshark中也是如此
UDP的首部中有个16位的字段记录了整个UDP报文段的长度(首部+数据),但是,TCP的首部中仅仅有个4位的字段记录了TCP报文的首部长度,并没有字段记录TCP报文段的数据长度。原因是UDP首部中占16位的长度字段是冗余的,纯粹是为了保证首部是32bit对齐。而TCP\UDP的数据长度,完全可以由IP数据包的首部推测出来。
传输层的数据长度 = 网络层的总长度 - 网络层的首部长度 - 传输层的首部长度
为什么要保证对齐呢,因为经常会有一个二进制的值,要乘以4才是最终的值,如数据偏移字段。所以要保证长度是4的倍数。
TCP - 检验和(Checksum)
跟TCP一样,TCP检验和的计算内容:伪首部 + 首部 + 数据
伪首部:占用12字节,仅在计算检验和时起作用,并不会传递给网络层
TCP - 标志位
URG(Urgent)
当URG=1时,紧急指针字段才有效。表明当前报文段中有紧急数据,应优先尽快传送
ACK(Acknowledgment)
当ACK=1时,确认号字段才有效
PSH(Push)
RST(Reset)
当RST=1时,表明连接中出现严重差错,必须释放连接,然后再重新建立连接