TCP & UDP 协议
思维导图:
1. TCP通信概述
1.1 tcp协议所在的层级
传输层协议:TCP、UDP、SCTP
应用层:http、https(实现某类具体应用)
1.2 端口占用
IANA:互联网地址名称分配机构
0-1023:众所周知,永久的分配给固定的应用使用,特权端口
1024-32768:也是注册端口,但要求不是特别的严格,分配给程序注册为某应用使用
32768+:客户端程序随机使用的端口,动态端口,或私有端口,其范围在 /proc/sys/net/ipv4/ip_local_port_range
1.3 Socket类型
BSD Socket:IPC的一种实现,允许位于不同的主机(也可以是同一主机)上的进程之间进行通信
1)Socket API(封装了内核中的socket通信相关的系统调用)
根据传输层的协议来分类
- SOCK_STREAM:tcp套接字
- SOCK_DGRAM:udp套接字
- SOCK_RAW:raw套接字
2)Socket Domain(根据套接字所使用的地址格式)
- AF_INET:Address Family,IPv4
- AF_INET:ipv6
- AF_UNIX:同一主机上的不同进程间基于socket套接字通信使用的一种地址(Unix_SOCK)
3)AF_UNIX机制说明
如果确认服务端客户端都在同一台主机上,让服务端监听在内存中的一个文件上,把这个文件当做地址,并告诉客户端任何时候客户端通信时只需要从内存中的这个文件中读取内容就可以了
1.4 TCP_FSM(TCP Finite State Machine)
- TCP有限状态机
CLOSED,LISTEN,SYN_SENT,SYN,RECV,ESTABLISHED,FIN_WAIT,CLOST_WAIT,FIN_WAIT2,LAST_ACK,TIMEWAIT,CLOSED
1.5 TCP协议的特征
1)概述
- 建立连接:三次握手
- 将数据打包成段(segment):校验和(CRC32)
- 确认、重传及超时
- 排序:逻辑序号
- 流量控制:滑动窗口算法
- 拥塞控制:慢启动和拥塞避免算法
2)对滑动窗口的解释
发送方一次可以发n个报文,但是一次最多发几个其实取决于对方的接受缓冲区的大小,因此,接受者一般会将自己的接受缓冲区的大小通过window的方式(tcp协议报文中的window字段)通知发送端,使得发送端和接受端速率不一致的时候能够协商出一个一致的速率出来。
2. TCP协议
2.1 TCP和UDP协议
1)TCP和UDP图示
2)TCP和UDP的应用场景
TCP:可靠、面向连接,有虚拟管道的概念(构建在网络层之上)
- 公屏讨论区:
- TCP收发邮件:TCP
- 发送邮件:SMTP(简单邮件传输协议),端口:25/tcp
- 接收邮件:POP3(邮局协议版本3),端口110/tcp
UDP:不可靠,但具有及时性
- 直播语音+视频:UDP
3)查看应用端口号:(Windows中)
# 查看IP地址对应的链接 netstat -nat | find '14.125.177.33' # 查看PID对应的端口和地址 netstat -nat | find '1778'
2.2 TCP报文首部详解
2.2.1 TCP首部图示
2.2.2 TCP报文首部各字段的解释
Source Port Number:源端口 之所以占据16个bit位,是因为2的16次方正好可以标识65535个端口号
Destination Port Number:目标端口
Sequence Number:请求时附带的随机序列号
Acknowledgement Number:应答时附带的序列号 在对方请求时附带的序列号的基础上加1
Header Length:报文首部的长度 4个bits表示首部最长的长度为2个4次方,也就是可以标识15段,一段为4个字节,则最长长度为60个字节
Reserved:报文的标识位,占据6bit,可表示6个flag
URG:报文段中发送的数据是否包含紧急数据,值为1时表示有紧急数据(后面的紧急字段只有当URG值为1时才生效) ACK:表示是否前面的确认号字段是否有效,ACK=1,表示有效(TCP规定,连接建立后,ACK必须为1) PSH:告诉对方收到该报文段收是否应该立即把数据推送给上层,如果为1,则表示对方应该立即把数据提交给上层,而不是缓存起来 RST:与主机的连接出现了严重错误(如主机奔溃),必须释放连接,然后再重新建立连接(或者说上次发送的数据有问题,主机拒绝响应) SYN:在建立连接时使用,用来同步序号 当SYN为1,ACK为0时,表示这是一个请求连接的报文段 当SYN为1,ACK为1时,表示对方同意建立连接 SYN为1,说明这是一个请求建立连接或同意建立连接的报文,只有在前两次握手中SYN才置1 FIN:标记数据是否发送完毕,如果FIN=1,将相当于告诉对方,自己的数据已经发送完毕,对方可以释放连接了
Windows Size:滑动窗口的大小 用以告知对方自己接受缓冲区的大小,以协商出一个合适的传输速率
TCP Checksum:TCP的校验和,提供额外的可靠性
Urgent Pointer:标记进制数据在字段中的位置
Options:可选部分(这部分的最大长度为40Bytes)
Data:数据部分
2.3 TCP的连接和断开(三次握手,四次挥手)
2.3.1 三次握手,四次挥手图示
2.3.2 关于2MSL
在四次挥手的最后阶段,客户端进入TIME_WAIT状态,继续等待2MSL的时间再完全断开连接。
在四次挥手的过程中,哪一方先调用close,哪一方就会在第三次挥手后继续等待2MSL的时间。
为什么要等待2MSL:MSL即为一个数据包在网络上存活的最长时间,即数据包从被发送到被接收所经历的最长时间;2MSL即为在四次挥手的第三次过程中,先发起中断连接的一方将会继续等待2倍MSL的时间后再完全中断tcp链接。等待2倍的MSL时间就是因为防止服务端没有收到最后一次的ACK,即在2MSL的时间内,若服务端没收到最后的ACK,在超过超时时间(MSL)后,服务端会认为客户端没收到第三次挥手中的FIN,这时服务端会再发一份FIN,这时一共经历了2MSL的时间,而客户端此时等待了2MSL的时间,正好可以接收这一次服务端重发的FIN请求,从而有效的保证了所有的请求和回应都会被对方接收。
2.4 TCP FSM(TCP有限状态机)
TCP的有限状态机(TCP FSM)其实就是TCP的11种状态。
3. UDP&ICMP协议
3.1 UDP协议
1)UDP概述
- 无连接、不可靠,但具有及时性
- 适用于更关注传输效率的应用
- 可靠性由应用层负责
适用:直播语音+视频:UDP
2)报文结构
3.2 ICMP协议
1)使用
ping和tracert会使用ICMP协议
ICMP的两个重要类型码(icmp-type)
- 请求码:8
- 应答码:0
路由跟踪:检测到的路径(三层)
- tracert -d 114.114.114.114
C:\Users\24698>tracert -d 114.114.114.114
通过最多 30 个跃点跟踪到 114.114.114.114 的路由
1 3 ms 1 ms 1 ms 192.168.1.1
2 20 ms 30 ms 5 ms 100.97.232.1
3 9 ms 5 ms 7 ms 111.38.4.157
4 10 ms 12 ms 11 ms 120.210.231.177
5 10 ms 13 ms 12 ms 120.193.121.38
6 11 ms 11 ms 13 ms 114.114.114.114
跟踪完成。
2)ICMP协议的类型码