前言
运输层有TCP和UDP两个协议。都是为了支持不同主机间的进程的通信,端到端之间的通信是应用进程间的通信。
运输层提供的就是端到端间的逻辑通信,因为在两个主机是没有一条真正的线路连接的。在获得应用层的数据后,传输层要向下封装IP报头再到数据链路层封装成帧,然后再发送出去。
通过上面两个应用之间通信的概念图片也能发现路由器是不负责传输层的。
UDP(用户数据报协议)
用户数据报协议UDP只是在IP协议上增加了一点功能,也就是复用和分用以及差错检测的功能。这里只简单提一下UDP。
特性
-
无连接:不需要先建立连接(如三次握手)
-
尽最大努力交付(不可靠交付)
-
面向报文。对于应用层交付下来的报文,不作另外的处理,只添加了头部就向下交付到网络层。因此,UDP报文数据不能太长也不能太短,会造成IP分片过多或资源浪费。
-
没有拥塞控制。 不会因网络的堵塞导致发送的速率降低。因此会用在很多的实时应用中。
-
首部开销小,只有8字节。
首部结构
(1)源端口 – 2 bytes
(2)目的端口 – 2 bytes
(3)长度 – 2 bytes 整个UDP的长度,最小是8(仅有头部)
(4)校验和 – 2 bytes
其实前面还应该有一个伪首部,用于计算检验和,包括
(1)源 IP 地址 – 4 bytes
(2)目的 IP 地址 – 4 bytes
(3)0 – 1 bytes , 17 – 1 bytes
(4)UDP长度 – 2 bytes
功能,当 IP层的数据报到达时,根据目的端口将 UDP 数据报通过相应的端口,上交给最终的终点 —应用进程。
之前写过 IP数据报头部是将 首部检验,但是不检验数据部分。但是 UDP会把首部和数据一起检验(可能是因为数据报小一点?)。
TCP
特性
- 面向连接,要经过三次握手确定端对端都能接收和发送消息
- 可靠交付。保证无差错、不丢失、不重复、不乱序
- 双全工通信。也就是每一端都有发送和接收缓冲区,应用层在自己合适的时候对缓冲区进行读写
- 面向字节流。流 其实就是一个数据序列,在这里连续的消息是连在一起的,需要接收方知道怎么去辨别。
这里表示出了一个单方向的数据流。另外,我们可以看出TCP连接在这里是逻辑连接。TCP报文要先加上IP头部,再封装成帧,才离开主机发送到物理链路。
首部格式
多说无益,只有直接搞懂TCP头部才能有点掌握。
-
源端口
-
目的端口
-
序号:每个包都有自己的序号,并且初始序号是随机的
-
确认号:对一个序号为 100 的包进行确认,则该包确认号为 序号 + 1 。总而言之,若确认号为 N,到序号 N-1的所有数据都已经正确收到
-
数据偏移:指出TCP头部报文长度,因为首部有不确定长度的部分,所以这个字段还是很有必要的
-
保留:保留给以后用的,现在还是 0 (??)
-
六个 bit 的控制位,为1时某位有效
1、URG(紧急指针), 紧急数据,尽快处理
2、ACK(确认),只有它为1时上面的确认号才有效,建立连接后的所有报文段 ACK都必须为1
3、PSH(推送),收到PSH为1的报文时,尽快向上交付,不用等缓冲区满
4、RST(复位),表明连接出现错误,释放连接再重新建立
5、SYN(同步),表名序号,用来建立连接或接受连接
6、FIN(终止),释放一个连接 -
窗口 ,窗口值是自己作为接收方,给发送方看的,让发送方根据此设置它的发送窗口大小
-
检验和,检验首部和数据两部分,和UDP一样,检验时需要加上伪首部
-
紧急指针,在URG=1时有意义。指出数据中紧急数据的字节数
-
选项,最长可达 40字节,没有使用选项时,TCP首部长度为20字节。 先不具体介绍,以后讲到TCP的功能特性时就会知道用法了。
参考书籍
《计算机网络》 谢希仁