![68a71f2d5361e23129bdc44ec89958e2.png](https://i-blog.csdnimg.cn/blog_migrate/362a26d69f47272fb450edc9602b0c7c.jpeg)
引言:TCP UDP在OSI的七层模型,属于传输层,在通信行业,在软件开发行业,都是必须熟知的,那我们怎么去了解这两个呢。
TCP和UDP
TCP和UDP是传输层的两个重要的协议
TCP(Transmission Control Protocol) 传输控制协议
UDP(User Datagram Protocol)用户数据报协议
TCP的主要特点:
- 面向连接
- 每一条TCP连接只能是点对点的(一对一)
- 提供可靠交付的服务
- 提供全双工通信
- 面向字节流
UDP的主要特点:
- 无连接
- 尽最大努力交付
- 面向报文
- 无拥塞控制
- 支持一对一、一对多、多对一和多对多的交互通信
- 首部开销小(只有4个字段:源端口、目的端口、长度、检验和)
TCP进行拥塞控制的算法有4种:
慢开始(slow-start)、拥塞避免(congestion avoidance)、快重传(fast retransmit)、快恢复(fast recovery)
TCP 传送的数据单位协议是 TCP 报文段(segment)。
UDP 传送的数据单位协议是 UDP 报文或用户数据报。
TCP 不提供广播或多播服务。
UDP的首部格式:
- 源端口:2个字节
- 目的端口:2个字节
- 长度:2个字节
- 检验和:2个字节
![bd66c669a5bdbba04310f1c55e6b2a76.png](https://i-blog.csdnimg.cn/blog_migrate/ea20453ea3ccc0997b4adc6cba530ea6.jpeg)
![49fd86feaf97fcde70cf7ee15a77ec26.png](https://i-blog.csdnimg.cn/blog_migrate/f79b0b098037a5a55e5536ed41d68190.jpeg)
什么是端口
硬件端口与软件端口
在协议栈层间的抽象的协议端口是软件端口。
路由器或交换机上的端口是硬件端口。
硬件端口是不同硬件设备进行交互的接口,
而软件端口是应用层的各种协议进程与运输实体进行层间交互的一种地址。
两个计算机中的进程要互相通信,不仅必须知道对方的 IP 地址(为了找到对方的计算机),
而且还要知道对方的端口号(为了找到对方计算机中的应用进程)。
服务器端使用的端口号
熟知端口,数值一般为 0~1023。
登记端口号,数值为 1024~49151,为没有熟知端口号的应用程序使用的。使用这个范围的端口号必须在 IANA 登记,以防止重复。
客户端使用的端口号
又称为短暂端口号,数值为 49152~65535,留给客户进程选择暂时使用。
常见熟知端口:
FTP(File Transfer Protocol)文件传输协议 :21
TELNET远程终端协议:23
SMTP(Simple Mail Transfer Protocol)简单邮件传送协议:25
DNS(Domain Name System)域名系统:53
TFTP(Trivial File Transfer Protocol)简单文件传送协议:69
HTTP(HyperText Transfer Protocol)超文本传送协议:80
SNMP(Simple Network Management)简单网络管理协议:161
SNMP(trap):162
TCP UDP的通信方式
虽然在 UDP 之间的通信要用到其端口号,但由于 UDP 的通信是无连接的,因此不需要使用套接字。
TCP 连接的端点不是主机,不是主机的IP 地址,不是应用进程,也不是运输层的协议端口。TCP 连接的端点叫做套接字 (socket) 或插口。
每一条 TCP 连接唯一地被通信两端的两个端点(即两个套接字)所确定。
TCP 连接 ::= {socket1, socket2} = {(IP1: port1),(IP2: port2)}
可靠传输的工作原理:
- 停止等待协议
- 连续ARQ协议
1)“停止等待”
就是每发送完一个分组就停止发送,等待对方的确认。在收到确认后再发送下一个分组。
![ba83bfdde5659b20273c384322ec0164.png](https://i-blog.csdnimg.cn/blog_migrate/33017e3f1b12b929e1a0ce55bf93268b.jpeg)
出现差错的情况:
在接收方 B 会出现两种情况:
B 接收 M1 时检测出了差错,就丢弃 M1,其他什么也不做(不通知 A 收到有差错的分组)。M1 在传输过程中丢失了,这时 B 当然什么都不知道,也什么都不做。在这两种情况下,B 都不会发送任何信息。
如何保证 B 正确收到了 M1 呢?
解决方法:超时重传
A 为每一个已发送的分组都设置了一个超时计时器。
A 只要在超时计时器到期之前收到了相应的确认,就撤销该超时计时器,继续发送下一个分组 M2 。
自动重传请求 ARQ (Automatic Repeat reQuest)。意思是重传的请求是自动进行的,接收方不需要请求发送方重传某个出错的分组。
2) 连续ARQ协议:
发送方维持的发送窗口,它的意义是:位于发送窗口内的分组都可连续发送出去,而不需要等待对方的确认。这样,信道利用率就提高了。
连续 ARQ 协议规定,发送方每收到一个确认,就把发送窗口向前滑动一个分组的位置。
![89585da7ea654e4b2c7d005553124f2e.png](https://i-blog.csdnimg.cn/blog_migrate/fb5ce35f578a960649453657d83f00ef.jpeg)
TCP运输连接建立:
TCP 是面向连接的协议。
运输连接有三个阶段:
- 连接建立
- 数据传送
- 连接释放
TCP 建立连接的过程叫做三报文握手
![2b47f3d0ae1141e1d3eae4da8c4c6049.png](https://i-blog.csdnimg.cn/blog_migrate/39868dad358b7929acb8274766fde7f5.jpeg)
A 的 TCP 向 B 发出连接请求报文段,其首部中的同步位 SYN = 1,并选择序号 seq = x,表明传送数据时的第一个数据字节的序号是 x。B 的 TCP 收到连接请求报文段后,如同意,则 发回确认。B 在确认报文段中应使 SYN = 1,使 ACK = 1,其确认号ack = x + 1,自己选择的序号 seq = y。A 收到此报文段后向 B 给出确认,其 ACK = 1, 确认号 ack = y +1。A 的 TCP 通知上层应用进程,连接已经建立。B 的 TCP 收到主机 A 的确认后,也通知其上层应用进程:TCP 连接已经建立。
数据传输结束后,通信的双方都可释放连接。
TCP 连接释放过程是四报文握手。
![a9e3d09de6cb46544104f03cc436ae2d.png](https://i-blog.csdnimg.cn/blog_migrate/c8fa77b487eb5f9c5f940d6c48f74200.jpeg)
数据传输结束后,通信的双方都可释放连接。 现在 A 的应用进程先向其 TCP 发出连接释放报文段,并停止再发送数据,主动关闭 TCP 连接。 A 把连接释放报文段首部的 FIN = 1,其序号 seq = u,等待 B 的确认。B 发出确认,确认号 ack = u +1,而这个报文段自己的序号 seq = v。TCP 服务器进程通知高层应用进程。从 A 到 B 这个方向的连接就释放了,TCP 连接处于半关闭状态。B 若发送数据,A 仍要接收。若 B 已经没有要向 A 发送的数据, 其应用进程就通知 TCP 释放连接。