目录
1.2.1 端口的作用:应用层与传输层数据传输,对应至相应的进程
1.3.1 面向连接服务:双方通信之前必须先建立连接,通信过程实时监控,通信结束释放连接
1.3.2 无连接服务:不需要事先建立连接,需要通信直接将信息发送到网络中,尽力而为发往目的地
3.1 TCP协议的特点:面向连接、端到端、可靠交付、全双工通信、面向字节流
1.传输层提供的服务
1.1 传输层的功能
1.1.1 提供进程之间逻辑通信
- 传输层:应用进程之间的逻辑通信(即端到端)
- 网络层:主机之间的逻辑通信
逻辑通信:传输层之间的通信好像是沿水平方向传送数据,但事实上并没有一条水平方向的物理连接。
1.1.2 复用和分用
- 复用:发送方不同进程都使用同一个传输层协议传送数据
- 分用:接收方剥去报文首部能把这些数据正确交付到目的进程
1.1.3 对收到的报文进行差错检测
- 传输层:首部和数据部分
- 网络层:只检查IP数据包首部
1.1.4 提供两种不同的协议:TCP和UDP
- 而网络层无法同时实现两种协议(要么是面向连接的服务,比如虚电路;要么是无连接的服务,如数据包)
1.2 传输层的寻址与端口
1.2.1 端口的作用:应用层与传输层数据传输,对应至相应的进程
- 端口(进程)于传输层,类似于IP地址(主机)于网络层,类似于MAC地址(主机)于数据链路层
1.2.2 端口号:标识应用进程
- 端口号长度:16bit,表示65536个不同端口号
- 端口号只具有本地意义,即至标识本计算机应用层的各进程
- 服务器端口号:
- 熟知端口号:0~1023,指派一些重要的应用程序
- 登记端口号:1024~49151
- 客户端端口号:49152~65535,也称临时端口,用完即不服存在,供其他客户进程使用
一些熟知端口号:
应用程序 | FTP | TELNET | SMTP | DNS | TFTP | HTTP | SNMP |
数值端口号 | 21 | 23 | 25 | 53 | 69 | 80 | 161 |
1.2.3 套接字
网络中通过IP地址标识不同的主机,通过端口号标识和区分一台主机中不同的应用进程。
套接字Socket=(IP地址:端口号)
1.3 无连接服务于面向连接服务
1.3.1 面向连接服务:双方通信之前必须先建立连接,通信过程实时监控,通信结束释放连接
1.3.2 无连接服务:不需要事先建立连接,需要通信直接将信息发送到网络中,尽力而为发往目的地
2.UDP协议
2.1 UDP数据报
UDP仅在IP数据报服务上增加了两个最基本的服务:
- 复用和分用
- 差错检测
2.2.1 UDP有如下特点:
- UDP无需建立连接。试想如果DNS运行在TCP而不是UDP上,速度会慢很多。但HTTP使用TCP而非UDP,是因为对于基于文本数据的Web网页,可靠性至关重要
- 无连接状态。不需要接受、发送缓存、拥塞控制参数和序号确认号等参数。
- 首部开销小。TCP有20B的首部,UDP只有8B
- UDP没有拥塞控制,满足某些追求稳定速度的应用
- UDP支持一对一、一对多、多对一和多对多的交互通信
2.2.2 UDP的首部格式
- 源端口。在需要对方回信时选用,不需要时可用全0
- 目的端口。
- 长度。UDP数据报长度,包括首部和数据,最小值为8(仅有首部)
- 检验和。可选,不想计算校验和置为全0
2.2 UDP校验
计算校验和,在UDP数据报之前增加12B的伪首部。不上传不下传,只为了计算校验和。
- 发送方:检验和字段填入全0,并添加伪首部。按二进制反码计算16bit的和,写入校验和字段
- 接收方:按二进制反码求16bit和,若无差错结果应为全1
为什么要使用UDP?直接用IP分组不就够了吗?
- 网络控制程序需要知道把它交给具体某个进程,UDP分组包含一个目的端口
- UDP对数据报包括数据段在内的差错检测,IP只对首部进行检测
3.TCP协议
3.1 TCP协议的特点:面向连接、端到端、可靠交付、全双工通信、面向字节流
-
TCP 面向连接,是一条逻辑连接
-
每条TCP只有两个端点,端到端(进程对进程)
-
TCP提供可靠交付服务,保证数据无差错、不丢失、不重复且有序
-
TCP全双工通信,连接两端设有发送缓存和接受缓存:
-
发送缓存:发送方准备发送的数据、已发送但未收到确认的数据
-
接收缓存:按需到达但尚未被接收程序读取的数据、不按序到达的数据
-
-
面向字节流,一连串无结构的字节流
TCP与UDP发送报文所采用的方式完全不同,UDP的报文长度有发送进程决定,TCP则根据接收方给出的窗口值和当前网络拥塞程度决定。
3.2 TCP报文段
各字段意义如下:
- 源端口:用于服务运输层与应用层的接口,运输层的复用和分用
- 目的端口:用于服务运输层与应用层的接口,运输层的复用和分用
- 序号:4B,TCP按字节传送,所以字节流中每个字节都按顺序编号。序号字段的值时本报文段所发送数据的第一个字节的序号
- 确认号:4B,期望收到对方下一个报文段的第一额数据字节的序号。若确认号为N,则N-1序号之前的数据都已正确收到
- 数据偏移(首部长度):指出TCp报文段的数据起始处距离TCP报文段的起始处有多远
- 保留:6位,保留为今后使用
- 紧急位URG:置1表明紧急指针有效,告诉系统此报文段中有紧急数据应尽快传送(第一个字节到紧急指针所指字节)
- 确认位ACK:
- 推送位PSH:接收方收到PSH=1的报文段,就尽快的交付给应用结成,不必等到整个缓存都满了再交付
- 复位位RST:出现严重差错,必须释放连接,再重新建立
- 同步位SYN:=1表示连接请求或连接接受报文,
- 终止位FIN:用来释放连接。
- 窗口:2B,现在允许对方发送的数据量。
- 校验和:2B,校验包括首部和数据
- 紧急指针: 2B,URG=1时有效,
- 选项:长度可变,TCP之规定了一种选项:最大报文长度MSS,数据字段的最大长度
- 填充:为了使整个首部长度位4B的整数倍
3.3 TCP连接管理(三次握手、四次握手)
TCP连接的建立采用C/S模式,主动发起连接的进程称为客户,等待连接建立的进程称为服务器。
3.3.1 TCP连接的建立
连接建立前,服务器处于LISTEN状态。
- 步骤一:
- 客户机TCP首先向服务器的TCP发送连接请求报文段。
- 这个特殊报文段首部中的同步位SYN置1。同时选择一个初始序号seq=x。
- TCP规定,SYN报文段不能携带数据,但消耗掉一个序号。
- 这时TCP客户进程进入SYN-SENT(同步已发送)状态。
- 步骤二:
- 服务器TCP收到连接请求报文段,同意建立连接,则向客户机发回确认,并为该TCP连接分配缓存和变量
- 确认报文段中,把SYN和ACK都置为1,确认号ack=x+1
- 同时也为自己选择一个初始序号seq=y
- 确认报文段不携带数据,但也要消耗掉一个序号。
- 这时TCP服务器进程进入SYN-RCVD(同步收到)状态
- 步骤三:
- 客户机收到确认报文段,还要向服务器给出确认,并为该TCP连接分配缓存和变量
- 确认报文段ACK位置为1,确认号ack=y+1,序号seq=x+1
- 该报文段可以携带数据,若不携带数据则不消耗序号。
- 这时TCP客户端进程进入ESTABLISHED(已建立连接)状态
这时就建立了TCP连接,接下来就可以传送应用层数据。TCP提供的是全双工通信。
另外值得注意的是:
- 服务端的资源是在完成第二次握手时分配的
- 客户端的资源是在完成第三次握手时分配的
3.3.2 TCP连接的释放
参与TCP连接的两个进程中的任何一个都能终止该连接,TCP连接释放的过程通常称为四次握手
- 步骤一:
- 客户端打算关闭连接,向TCP发送连接释放报文段,并停止发送数据
- 客户端主动关闭TCP连接,该报文段的终止位FIN置为1,序号seq=u,等于前面已传送的数据的最后一个字节的序号+1
- FIN报文段即使不携带数据,也要消耗掉一个序号
- 这时TCP客户端进程进入FIN-WAIT-1(终止等待1)状态
- TCP是全双工的,即可以想象为一条TCP连接有两条路,发送FIN一段停止发送数据,另一端还可以继续发送数据。
- 步骤二:
- 服务端收到连接释放报文段后即发出确认:确认号ack=u+1,序号seq=u,等于前面已传送过的数据的最后一个字节的序号+1
- 然后,服务器进入CLOSE-WAIT(关闭等待)状态
- 此时哦那个客户机到服务器这个而方向的连接就释放了,TCP处于半关闭状态
- 但服务器发送数据,客户端仍要接收,即从服务器到客户端这个方向连接并未关闭
- 步骤三:
- 若服务端已经没有向客户端发送的数据,就通知TCP释放连接
- 发出FIN=1的连接释放报文段,设该报文段的序号为w(在半关闭状态服务器可能又发送了一些数据),还需重复上次已发送的确认号ack=u+1
- 这时服务器进入LAST-ACK(最后状态)状态
- 步骤四:
- 客户端收到连接释放报文段,必须发出确认,把确认报文段中确认位ACK置为1,确认号ack=w+1,序号seq=u+1。
- 此时TCP连接还未释放,必须经过2MSL(最长报文段寿命)之后,客户端才进入CLOSED(连接关闭)状态
总结如下:
- 连接建立分为3步:
- SYN=1,seq=x
- SYN=1,ACK=1,seq=y,ack=x+1
- ACK=1,seq=x+1,ack=y+1
- 释放链接分4步
- FIN=1,seq=u
- ACK=1,seq=v,ack=u+1
- ACK=1,FIN=1,seq=w,ack=u+1
- ACK=1,seq=u+1,ack=w+1
3.4 TCP可靠传输
TCP使用校验、序号、确认和重传来确保发送方和接收方的字节流完全一样
3.4.1 序号
- TCP把数据视为一个无结构但有序的字节流
- 序号建立在传送的字节流上,而不是报文段上
3.4.2 确认
- TCP首部的确认号是期望收到对方的下一个报文段的数据的第一个字节的序号
- eg:B希望收到下一个报文段的数据是从第三个字节开始的,那么B发送给A的报文段中的确认号应为3
- TCP默认使用累积确认,即TCP只确认数据流中至第一个丢失字节为止的字节
- eg:B收到了A发送的包含字节0~2和字节6~7的报文段,由于某种原因,B还未收到字节3~5的报文段,此时B仍在等待字节3,因此B到A的下一各报文段将确认号置为3
3.4.3 重传:超时、冗余ACK
- 超时:重传时间到期,但还未收到确认,就要重传这一报文段
- 冗余ACK:
- 重传往往周期太长。
- 每当比期望序号大的失序报文段到达时,就发送一个冗余ACK,指明下一个期待字节的序号
3.5 TCP流量控制:滑动窗口
- 接收方根据自己缓存大小,动态调整发送方的发送窗口大小,称为接收窗口rwnd
- 发送方根据当前网络拥塞程度确定窗口,称为拥塞窗口cwnd
3.6 TCP拥塞控制:慢开始和拥塞避免、快重传和快恢复
发送窗口的上限值=min(rwnd,cwnd)
3.6.1 慢开始和拥塞避免
3.6.2 快重传和快恢复