一、传输层
1.作用
负责数据的传送,保证数据能够从发送端传输至接收端。
2.端口号
2.1 一些概念
端口号用来标识特定主机上的唯一一个网络服务进程。
IP地址:用来标识公网中的一台主机。
套接字=IP+端口号,因此套接字可以唯一标识互联网中的一个进程。
2.2 端口号范围划分
0~1023:知名端口号,HTTP、FTP、SSH等这些广为使用的应用层协议,它们的端口号都是固定的。
1024~65535:操作系统动态分配的端口号。客户端程序的端口号,就是由操作系统从这个范围划分的。
我们自己写程序时,要避免使用知名端口号。
2.3 认识知名端口号
服务器 | 端口号 |
http | 80 |
https | 443 |
mysql | 3306 |
ssh | 22 |
ftp | 21 |
telnet | 23 |
查看知名端口号的命令
cat /etc/services
2.4 两个问题
一个进程是否可以绑定多个端口号? 可以
一个端口号是否可以被多个进程绑定? 不可以,因为端口号是唯一标识特定主机上的一个进程。
2.5 一些命令
netstat 查看网络状态
语法:netstat [选项]
常用选项:
n 拒绝显示别名,能显示数字的全部转化为数字
l 仅列出有在Listen(监听)的服务程序
p 显示建立相关链接的程序名
t (tcp)仅显示出tcp相关选项
u (udp)仅显示出udp相关选项
a (all)显示所有选项,默认不显示LISTEN相关
iostat 查看IO信息
pidof 查看服务器的进程
语法:pidof [进程名]
功能:通过进程名,查看进程ID。
ps aux | grep [进程名] 查看网络进程
eg:ps aux | grep tcpserver等价于 pidof tcpserver
ps -ef | grep java 查看Java进程
ping www.baidu.com 查看是否联网的状态
二、UDP协议
1.格式
很明显,UDP的报头为定长,共占8字节。因此,将UDP的报头和有效载荷正确分离的方法是定长。
在UDP的报头中,16位源端口号表示从哪个进程来,16位目的端口号表示要到哪里去。16位UDP长度指整个报文的长度,因此UDP的最大长度为2的16次方,即64K.16位检验和在一定程度上保证交互给下一次层,但是丢包问题不一定会重发。如果检验和出错,则会直接丢弃。
如果我们需要传送的数据大于64K,就需要在应用层手动分包,多次发送,并在接收端手动拼装。
2.UDP的特点
无连接:知道对端的IP和端口号就直接进行传输,通信不需要建立连接。
不可靠:这是一个中性词。因为UDP没有确认机制、重传机制,不能确保数据到达。如果因为网络故障该段无法发到对方,UDP协议层也不会给应用层返回任何错误信息。
面向数据报:指应用层交给UDP多长的报文,UDP原样发送,既不会拆分,也不会合并,而且发送端发送多少次多少数据,接收端接收多少次多少数据。UDP不能够灵活地控制读写数据的次数和数量。
UDP的优点:因为没有确认机制、重传机制,因此较简单、高效。
3.UDP的缓冲区
UDP没有真正意义上的发送缓冲区,但是有接收缓冲区。
UDP调用sendto会直接交给内核,由内核将数据传给网络层协议进行后续的传输工作。
UDP的接收缓冲区不能保证接收到UDP报的顺序和发送UDP报的顺序一致;如果缓冲区满了,再到达的UDP数据就会被丢弃。
4.基于UDP的应用层协议
NFS:网络文件系统
TFTP:简单文件传输协议
DHCP:动态主机配置协议
BOOTP:启动协议(用于无盘设备启动)
DNS:域名解析协议
自定义应用层协议
三、TCP协议
1.格式
TCP报文的结构:
16位源端口号和16位目的端口号分别说明了该报文从哪儿来,要到哪儿去。
发送方对自己发送的数据进行编号,形成序号;接收方会对发送方发送的数据进行确认,即生成确认序号。一般来说,确认序号比序号要大1,提示发送方下一条发送的数据从哪开始。同时,序号和确认序号也保证了数据的有序到达,确认序号机制以及去重机制(后面详细讲)。这些都保证了数据传输的可靠性。
4位首部长度(即报头长度),单位是4字节,故报文的最大长度是1111*4=15*4=60字节。而从TCP的结构可以看出,报头的标准长度是4*5=20字节。因此,根据报头长度,TCP协议将报头和有效载荷正确分离的方式也是定长。
6位标志位
URG:标识紧急指针是否有效,便于将URG标识的信息优先处理。
ACK:确认号是否有效。发出消息并且确认对方是否收到消息。
PSH:提示接收端应用程序尽快从TCP缓冲区把数据读走,这一工作由操作系统完成。
RST:对方要求重新建立连接。我们把携带RST标识的称为结束报文段。
SYN:请求建立连接。我们把携带SYN标识的称为同步报文段。
FIN:通知对方,本端要关闭了,我们称携带FIN标识的为结束报文段。
16位窗口大小:自己的接收缓冲区的剩余空间大小。流量机制
16位校验和:发送 端填充,CRC校验。接收端校验不通过,则认为数据有问题。此处的校验和不光包括TCP首部,还包括TCP数据部分。
16位紧急指针大小:标识哪部分数据是紧急数据。
40字节头部选项:暂时忽略。
2.三次握手与四次挥手
三次握手:
(1)客户端向服务器端发送SYN段,指明客户打算连接的服务器端接口以及初始序号(SEQ),请求建立连接。
(2)服务器发回包含服务器的初始序号的SYN报文段作为应答。同时,将确认序号设置为客户的ISN+1,用来对客户的SYN报文段进行确认,一个SYN占用一个序号。
(3)客户必须将确认序号设置为服务器的ISN+1,用来对服务器的SYN段进行确认。
只有这三次都完成,才说明建立了TCP连接。
为什么需要三次操作成功才能建立连接?
如果只有(1),客户端和服务器端将都认为未建立连接(因为服务器端没有确认,故客户端也认为未建立连接)。如果只有(1)和(2),客户端会认为成功建立连接,但服务器端由于没有收到客户端的确认序号,因此,服务器认为未建立连接。只有进行了(3),客户端和服务器端双方都认为建立了连接。建立连接是需要花费时间和空间成本的,如果第(1)(2)步失败,客户端和服务器端将都不会为建立连接消耗资源;如果第(3)步失败,(1)(2)成功,则客户端将会花费一定的时间和空间成本来维护连接,而服务器端则不会,这就避免了如果有大量客户端要求与服务器端建立连接,服务器端要维护无用的连接而消耗的成本。
四次挥手:
(1)客户端向服务器端请求断开连接。
(2)服务器端回应,确认同意断开连接。此时有一个CLOSE_WAIT状态,说明服务器准备关闭连接(但需要处理完之前的数据)。
(3)当服务器真正调用close关闭连接时,会向客户端发送FIN,要求断开服务器端与客户端的连接。此时服务器进入LAST_ACK状态,等待最后一个ACK(这个ACK时客户端确认收到了FIN)。此时客户端接收FIN时,进入TIME_WAIT状态,等待服务器端收到最后一个ACK,同时保证数据在网络中消散开。
(4)客户端对服务器端发送确认断开连接。
TIME_WAIT状态:
TCP协议规定,主动关闭连接的一方要处于TIME_WAIT状态,等待两个MSL(maximum segment lifetime)的时间才能回到CLOSED状态。MSL(TCP报文的最大生存时间)在RFC1122中规定为两分钟,但是各操作系统的实现不同,在Centos7上默认配置的值是60s。它的目的是为了保证最后一个报文可靠到达。
3.TCP的特点
可靠性
确认应答机制、数据的按序到达、16位检验和、去重机制、超时重发、流量控制、拥塞控制
TCP为了保证数据的可靠性,在效率上就会有所降低。但是TCP也提供了一些提高性能的方法:
滑动窗口、快速重传、延迟应答、捎带应答
面向字节流
4.基于TCP应用层的协议
HTTP:超文本传输协议
HTTPS:超文本传输安全协议
SSH:安全外壳协议
Telnet:远程终端协议
FTP:文本传输协议
SMTP:简单邮件传输协议
写TCP程序时自定义的应用层协议
5.TCP与UDP对比
二者没有绝对的好坏
TCP用于可靠传输的情况,应用于文件传输,重要状态更新等场景;
UDP用于对高速传输和实时性要求较高的通信领域,如早期的QQ,视频传输等。另外UDP也可以用于广播。