一、端口的作用和分类
端口的作用
对TCP/IP体系的应用进程进行统一的标志,使运行不同操作系统的计算机的应用进程能够互相通信。通俗来讲,客户端使用IP地址来定位服务器,使用目标端口来定位服务,即把数据交给相应的应用程序。端口用一个16位端口号进行标志。
三类端口
熟知端口(数值一般为0~1023,用于TCP/IP中最为重要的一些应用程序):
ftp = TCP + 21
telnet = TCP + 23
SMTP = TCP + 25
http = TCP + 80
POP3 = TCP + 110
https = TCP+443
共享文件夹 = TCP + 445
SQL = TCP + 1433
RDP = TCP + 3389
DNS = UDP + 53
登记端口号(数值一般为1024~49151,给没有熟知端口的应用程序使用的)
客户端口号/短暂端口号(49152~65535,留给客户进程暂时使用的端口)
划分为3种端口保证了通信的准确、高效,也避免了冲突。
常见的应用层协议使用的默认端口
ftp = TCP + 21
telnet = TCP + 23
SMTP = TCP + 25
http = TCP + 80
POP3 = TCP + 110
https = TCP+443
共享文件夹 = TCP + 445
SQL = TCP + 1433
RDP = TCP + 3389
DNS = UDP + 53
PS:
1、网卡可以设置目标端口为某个值时的数据包才能进来,由此关闭非必须服务和设置网卡只接收必要服务的端口的数据包,关闭其他的端口来实现网络安全和服务器更高效率的运行。
2、通过更改服务器使用的默认端口,迷惑入侵者,使系统更加安全。
3、服务安装后必须启动才会侦听客户端请求。
4、CMD中查看服务侦听的端口的命令:
netstat -an 以数字形式显示所有连接或监听的地址和端口
netstat -n 查看建立的会话
netstat -nb 查看建立会话的进程(权限不够时需要以管理员身份运行CMD)
telnet 192.168.80.100 3389 测试远程计算机某个端口是否打开
二、TCP协议和UDP协议
UDP协议
特点:
- 无连接的(发送数据之前不需要建立连接)
- 尽最大努力交付,既不保证可靠交付,也不使用拥塞控制
- 支持一对一、一对多、多对多的交互通信
- 首部开销小,只有8个字节
举例:
- QQ传文件用的是TCP、聊天用的是UDP
- 直播、多播、网络语音通话用的是UDP
首部格式

- 长度:表示UDP用户数据报的长度
- 检验和:用到了网络层的首部信息(所以有伪首部这么一说),再加上UDP首部和UDP数据来进行计算
TCP协议
特点:
- 面向连接
- 每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点(一对一)
- 提供可靠服务
- 全双工通信
- 面向字节流
TCP的连接:
每一条TCP连接的端点不是主机,不是主机的IP地址,不是应用进程,也不是传输层的协议端口。TCP连接的端点叫做套接字(socket,端口号拼接到IP地址即构成了套接字)。
首部格式

- 序号:表示当前发送的这个数据的第一个字节是整个数据的第几个字节
- 确认号:接收方接收到一个数据后,发回一个数据指示下一个要接收的是第几个字节。比如接收了第1到5个字节,那么发送确认号为6的数据给发送方表示接下来要接收第6个字节
- 数据偏移:因为TCP首部长度是可变的(固定20个字节,最多60个字节),用数据偏移来表示首部有多少个字节,同时也表示真正的数据部分从哪里开始
- URG标记位:urgent,紧急,表示该数据在发送端是否要优先传输
- PSH标记位:push,URG是指在发送端优先传输,而PSH是指在接收端优先接收
- RST标记位:重置
- FIN标记位:用来结束一个TCP会话,但对应端口仍处于开放状态,准备接收后续数据
- ACK标记位:ACK为1时确认号有效,为0时确认号无效
- SYN标记位:为1时表示建立连接(SYN攻击:客户端在短时间内伪造大量不存在的IP地址,向服务器不断发送SYN包,服务器回复确认包,并等待客户的确认。由于源地址是不存在的,服务器需要不断地发送直至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪)
- 窗口:描述接收方的TCP数据报缓冲区大小的数据,发送方根据这个数据来计算自己最多能发送多长的数据
- 检验和:和UDP一样需要加伪首部一起运算
- 紧急指针:当URG标记位为1时才起作用。表示标记紧急处理的字节数。比如紧急指针为50,表示TCP数据部分的前50个字节是需要紧急处理的字节
三、TCP的连接和释放
建立连接——三次握手

为什么要有第三次握手?
①假如没有三次握手,当客户端第一次发送请求连接数据,这个数据却绕远路,很久没到服务器。客户端接收不到回复,又发了一次数据。这时数据走的直线,一下子就到了服务器,服务器回复确认,开始传输数据。而第一次绕远路的请求连接数据这时到了服务器,服务器又给发了一次请求连接,但客户端已经建立了一次连接,不再搭理,造成服务器一直等待。这种情况如果太多就会造成服务器瘫掉,所以需要第三次握手来确认。
②另一个需要三次握手的原因是防止死锁:客户端向服务器发送请求连接信息,服务器收到后回复确认连接信息,按照两次握手协议,服务器认为他们已经建立起连接,然后开始传输数据给客户端。但服务器发送回去的确认连接信息丢失了,而客户端还在等待服务器的确认连接信息,这时服务器发送的数据(非确认连接信息)都被客户端拒收。而服务器发送数据后没拿到数据确认信息,以为信息丢失了,继续重复传输相同数据,造成了死锁。
释放连接——四次挥手

数据传输结束后,通信的双方都可释放连接;
A发出连接释放报文段,并停止再发送数据,主动关闭TCP连接;
B发出确认,此时TCP处于半关闭状态。B若发送数据,A仍然接收;
数据发完,B的进程就通知TCP释放连接;
A收到连接释放报文段后,发出最后的确认。
为什么最后有一个time-wait状态?
当客户端发最后一个确认关闭的信息,该信息丢了,那么服务器会再发送一次请求关闭信息,如果没有time-wait状态,这个请求关闭信息会被客户端拒收。
四、TCP的可靠传输
可靠传输的工作原理——停止等待协议

停止等待协议:发送完一个分组后等待对方确认,只有收到对方确认后才发送下一个分组。
超时重传
TCP每发送一个报文段,就对这个报文段设置一次计时器。只要计时器设置的重传时间到了但还没有收到确认,就要重传这一报文段。
流水线传输
如果线路使用停止等待协议,发送一个分组完,等待确认后再继续发送,那么信道利用率很低,速度也慢,这时就可以使用流水线传输的方式来获得很高的信道利用率。
流水线传输的概念:发送方可连续发送多个分组,不必每发完一个分组就停下来等待对方的确认。

连续ARQ协议
指发送方维护一个滑动窗口,如果这个窗口设置为5,则依次连续发送1~5这5个分组,发送完就停下,当接收到分组1发送成功的确认,则窗口向右滑动到第6个分组,开始发送第6个分组。
累计确认
在连续ARQ协议中,如果发送方发送5个分组,接收方只收到1、2、4、5分组,第3个分组丢失了,那么确认信息的确认号是3,表示只接到第1,2个分组,让发送方把3、4、5分组重新发送一遍。

五、TCP的流量控制
为什么要控制TCP的流量?
TCP的流量控制并不是为了缓解网络压力(TCP拥塞控制要做的事),而是为了让发送方的发送能力匹配接收方的接收能力,以免发送端发送速率过快导致丢包的情况。
如何实现流量控制?
发送端和接收端均有发送缓存和接收缓存,发送时把分组先放在缓存中,然后通过滑动窗口发送。接收时也先放在缓存中,然后从缓存中通过滑动窗口接收。那么控制滑动窗口的大小,也就对流量进行了控制。接收方发送接收窗口大小给发送端来同步接收与发送窗口,以此实现流量控制。
六、拥塞控制
出现拥塞的原因:
对资源的需求>可用资源
拥塞控制与流量控制的区别:
拥塞控制是一个全局性的过程,涉及到所有主机、所有路由器,以及与降低网络传输性能有关的所有因素。
流量控制指发送端和接收端点对点通信的控制,用于协调发送端和接收端的发送和接收速率。
拥塞控制的作用:

正常来说网络的吞吐量会随着流量的变大而变大,但实际情况并不是这样,如果没有拥塞控制,那么当线路上的流量大到一定程度时吞吐量反而归零,出现死锁的情况。拥塞控制就是用来防止这种情况的发生。
实现拥塞控制的方法
拥塞窗口
发送方维持拥塞窗口,如果网络没有出现拥塞,拥塞窗口就增大,发送更多的分组;如果网络出现拥塞,拥塞窗口就减小,减少发送到网络中的分组
慢开始(或称为慢启动)

一开始发送数据报时,如果立即将大量的数据注入到网络中,可能会出现网络的拥塞。慢开始就是在刚开始发送数据时先探测一下网络的状况,如果网络状况良好,发送方每发送一次文段都能正确的接受确认报文段。那么就从小到大的增加拥塞窗口的大小,即增加发送窗口的大小。(发送窗口取接收方窗口和拥塞窗口这两个变量中较小的一个)
拥塞避免算法

在拥塞窗口<ssthresh值(慢开始门限值)时,拥塞窗口大小呈指数规律增长。当拥塞窗口 ≥ ssthresh值时,拥塞窗口呈加法规律增长(放慢增长速度)。一旦出现网络拥塞,设置新的ssthresh值,该值变为出现网络拥塞时拥塞窗口的一半,而拥塞窗口也马上减少为1。
快重传和快恢复

快重传算法:一旦丢失数据包,接收端马上发送三个重复的确认给发送端要求重新发送丢失的数据。
快恢复算法:快恢复算法一般与快重传算法结合使用。该算法认为你能马上发送三个确认包说明网络情况良好,所以没有必要慢启动(这样可能会降低效率),采用新的方法:
ssthresh值设置为拥塞窗口的一半,再把拥塞窗口设置为ssthersh的值(不像慢启动那样直接设置为1)
浙公网安备 33010602011771号