TCP/IP协议
介绍
Transmission Control Protocol/Internet Protocol 传输控制协议/因特网互联协议
TCP/IP是一个Protocol Stack,包括TCP、IP、UDP、 ICMP、RIP、TELNET、FTP、SMTP、ARP等许多协议
最早发源于美国国防部(缩写为DoD)的因特网的前身ARPA网项目
TCP/IP是今天的互联网和局域网的基石和标准,共定义了四层,和ISO参考模型的分层有对应关系
TCP/IP与OSI对应关系:
特性
工作在传输层
面向连接协议
全双工协议
半关闭
错误检查
将数据打包成段,排序
确认机制
数据恢复,重传
流量控制,滑动窗口
拥塞控制,慢启动和拥塞避免算
端口划分
查看相关服务的端口号:Linux下的/etc/services配置文件
常用端口号:
snmp 161/tcp
http 80/tcp
https 443/tcp
kerberos 88/tcp
smtp 25/tcp
pop3 110/tcp
imap 143/tcp
smb 445/tcp
dns 53/tcp
dhcp/s 67/udp
dhcp/c 68/udp
dns 53/udp
TCP包头结构
源端口 :源设备的应用程序端口号;
目的端口 :目标设备应用程序的端口号;
序号 :在传输层,要将数据切分为多个段,每个段有自己的序号,以便接收方接收到后根据序号组合数据,数据可切割为
最大约43亿个段;
确认号 :确认是否接收到数据;
数据偏移 :TCP报文的头部多长,前20位是固定的,但是有可变选项,长度可变;
保留 :空闲的空间;
URG : 表示本报文段中发送的数据是否包含紧急数据,后面的紧急指针字段(urgent pointer)只有当URG=1是才有效;
ACK : 表示是否前面确认号字段是否有效。只有当ACK=1时,前面的确认号才有效。TCP规定,连接建立后,ACK必须为1,
带ACK标志的TCP报文段被称为确认报文段;
PSH : 提示接收端应用程序应该立即从TCP接收缓冲区中读走数据,为接收后续数据腾出空间,如果为1,则表示对方应当立
即把数据提交给上层应用,而不是缓存起来,如果应用程序不讲接收到的数据读走,就会一直停留在TCP接收缓冲区中;
RST : 如果接收到一个RST=1的报文,说明与主机的连接出现了严重错误(主机崩溃),必须释放连接,然后再重新建立连接。
或者说上次发送给主机的数据有问题,主机拒绝响应,带SRT标志的报文段被称为复位报文段;
SYN : 在建立连接时使用,用来同步序号。当SYN=1,ACK=0时,表示这是一个请求建立连接的报文段;当SYN=1,ACK=1时,
表示对方同意建立连接,SYN=1,被称为同步报文段;
FIN : 通知对方本端要关闭连接了,标记数据是否发送完毕,如果FIN=1,即告诉对方:“我的数据已经发送完毕,你可以释
放连接了”,带FIN标志的报文段被称为结束报文段;
窗口 :表示现在允许对方发送的数据量,也就是告诉对方,从本报文段的确认号开始允许对方发送的数据量,达到此值,需要
ACK确认后才能继续传送后边的数据。确认的时间为窗口大小乘以一个因子就得到的多长确认一次,窗口的大小是随着
网络负载而变化 的,不是固定的,而因子是在三次握手之后固定不变的;最大65536
校验和 :是提供额外的可靠性;
紧急指针 :标记紧急指针在数据段的位置;
选项部分 :其最大长度可根据TCP首部长度进行推算,TCP首部长度用4位表示,选项最长部分为:(2^4-1)*4-20=40字节;
TCP包头示意图:
TCP三次握手
第一次握手:当客户端主动请求(SYN-SENT)连接服务端,随机一个端口向服务端端口发起SYN=1同步序号请求,发出seq=x
本机序号,
第二次握手:服务端端口随时处于监听(LISENT)状态,当发现有请求连接时,立即做出响应,这时服务器向客户端发起SYN=
1同步序号请求,ACK=1是确认之前序号有效(ACK=0时序号无效),并且发出服务端序号seq=y,同时发送ack=
x+1(表示客户端发起请求时的seq=x序号服务端收到)。
第三次握手:报文到达客户端时,客户端也立即做出响应,返回ACK=1(表示之前序号有效),seq=x+1(x序号数字之前用过一
次,再次发送时为+1),ack=y+1(表示服务端向客户端发起的seq=y客户端已收到)。这时双方握手完毕,可以
交换数据。
三次握手意义:
客户端第一次发送请求给服务端时,服务端收到请求并返回服务端确认已收到客户端的请求
第二次则是由服务端向客户端返回确认包已收到请求,并同时发送服务端向客户端连接的请求
此时服务端不清楚客户端是否已收到服务端发给客户端的确认包及请求包,所以三次握手提高了可靠性
确保双方均确认后才可以开始交换数据
连接队列:
半连接队列:第一次客户端向服务端发起连接请求时,服务端会先查看自己的连接队列中是否还有空位去接收客服端的请求
当队列满时,服务端没有能力回应客户端。配置文件: /proc/sys/net/ipv4/tcp_max_syn_backlog
全连接队列:三次握手完成之后,服务端查看队列中是否还有空位容纳客户端,如果数量已达极限,则无法接纳其他客户端
配置文件: /proc/sys/net/core/somaxconn
TCP三次握手示意图:
TCP四次挥手
第一次挥手:在连接状态下客户端向服务端发送断开连接请求FIN=1(通知对方本端要关闭连接了,标记数据是否发送完毕,
如果FIN=1,即告诉对方:"我的数据已经发送完毕,你可以释放连接了"),seq=u(第一次断开请求序号),此时
客户端进入终止等待服务器确认阶段(FIN_WAIT_1)。
第二次挥手:服务端收到FIN=1,seq=u断开连接请求后,回应客户端ACK=1(确认之前序号有效),seq=v(服务端向客户端
发送自己的序号),ack=u+1(表示断开请求已收到),但是此时并不是回应确认断开,只是像客户端发送,我收到
你的断开请求而已,此时客户端仍是等待服务器确认阶段(FIN_WAIT_2)。
第三次挥手:服务端会检查数据是否传完,如有遗留继续发送,待服务端确认所有数据完成发送之后,因为此前一段时间还是
数据传送阶段,所以由服务端向客户端发起请求断开连接,向客户端发送FIM=1(告知客户端以传送完毕),
ACK=1(再次发送此前收到的序号有效),seq=w(因为数据传送有时间间隔,所以序号改变),
ack=u+1(再次确认断开请求已收到),此时服务端进入最后等待阶段。
第四次挥手:客户端在两次等待后收到服务端的断开请求,立即回应ACK=1(确认序号有效),seq=u+1(第二次序号为+1),
ack=w+1(确认服务端seq=w收到)。过程完毕,双方挥手完成,断开连接!
TCP四次挥手示意图:
FSM
Finite State Machine:有限状态机
三次握手:
CLOSED 没有任何连接状态
LISTEN 侦听状态,等待来自远方TCP端口的连接请求
SYN-SENT 在发送请求后,等待对方确认
SYN-RECEIVED 在接收和发送一个连接请求后,等待对方确认
ESTABLISHED 代表传输连接建立完成,双方进入传送数据状态
四次挥手:
FIN-WAIT-1 主动关闭,主机已发送关闭连接请求,等待对方确认
FIN-WAIT-2 主动关闭,主机已接收到对方关闭传输请求,等待对方发送关闭传输请求;
TIME-WAIT 完成双向传输连接关闭,等待所有分组消失
CLOSE-WAIT 被动关闭,接收到对方发来的关闭连接请求,并已确认
LAST-ACK 被动关闭,等待最后一个关闭传输连接确认,并等待所有分钟消失
CLOSING 双方同时常是关闭传输连接,等待对方确认
#抓取状态:ss -nt | sed -nr '1!s#([^ ]+).*#\1#p' | sort | uniq -c
UDP协议
介绍
User Datagram Protocol 用户数据报协议
提供与IP一样的不可靠,无连接的交付服务,UDP报文可能出现丢失,重复或者乱序到达等现象
通常音频、视频和普通数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响,如QQ等
特性
工作在传输层
提供不可靠的网络访问
非面向连接协议
有限的错误检查
传输性能高
无数据恢复特性
UDP包头结构
源端口:源设备的应用程序端口号
目的端口:目标设备应用程序的端口号
报文长度:整个报文大小
校验和:是提供额外的可靠性
数据:具体要传送的数据内容
UDP包头示意图:
TCP、UDP区别
连接:
TCP面向连接
UDP是无连接的,即发送数据之前不需要建立连接
安全:
TCP提供可靠的服务,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达
UDP尽最大努力交付,即不保证可靠交付
传输效率:
TCP传输效率相对较低
UDP传输效率高,适用于对高速传输和实时性有较高的通信或广播通信
连接对象数量:
TCP连接只能是点到点、一对一的
UDP支持一对一,一对多,多对一和多对多的交互通信