计算机网络——传输层(25王道最新版)
传输层
- 传输层提供的服务
- 进程 端口号 传输层协议之间的关系
- socket套接字
- 有链接 VS 无连接 | 可靠 VS 不可靠
- UDP数据报及检验
- 数据报格式
- 检验方法
- TCP
- TCP协议的三大阶段
- TCP报文段格式(很重要)
- 建立连接(三次握手)(超级超级重要)
- 数据传输
- 释放连接(四次挥手)
- TCP连接管理小节
- 结语
传输层提供的服务
-
地位
-
概述
进程 端口号 传输层协议之间的关系
socket套接字
- 解决了每次传输 需要重复输入协议(TCP/UDP)以及对方的IP地址和端口号的问题 它的本质是一种数据结构
- 例如进程1与进程5之间需要传输数据 因为他们都是使用的TCP协议 所以就会创建一个TCP套接字
- 在这个套接字里面需要指明对方的IP地址和端口号
- 接下来如果两个进程之间需要有多次的数据传输 就可以直接用套接字来说明传输方向
有链接 VS 无连接 | 可靠 VS 不可靠
- 在下面两张图中 左边指的是TCP 右边指的是UDP
UDP数据报及检验
- UDP
- TCP
数据报格式
检验方法
- 对于一组数据
- 对于多组数据
- 说明
- 小节
TCP
TCP协议的三大阶段
-
一次链接可以传输多个报文
-
这里引入了换一个概念就是MSS 表示我们传输时报文段的最大长度
-
这里重点说一下这句话“TCP是面向字节流的 UDP是面向报文的”
-
怎么样来理解呢
-
对于TCP协议而言 它将应用层交给他的数据看作是一连串的字节流 不管关心数据到底是报文Y的还是报文Z的 只是根据MSS的限制将它拆分成合适的大小进行传输
-
跟前面UDP不同的是 UDP数据报每次运输的都是一个完整的报文
-
这便是 面向字节流和面向报文的含义
TCP报文段格式(很重要)
建立连接(三次握手)(超级超级重要)
- 因为我们的TCP协议是在建立连接的基础之上的 所以我们在传输数据之前必须有一个建立连接的过程
- 在前面的学习中我们知道当SYN=1的时候 表示这是一个连接请求或者接受报文 对应到下图中显然只有握手1是在请求连接 只有握手2是在同意请求连接
- 则显然只有握手1和握手2的SYN=1
- seq表示传输的数据的起始位置 ack=667 说明的是我(接收方)希望你下一次给我发送的数据是从667开始的
- 这里还需要提一下窗口值的概念
- 例如A发送给B的时候设置window=200 ack=100意思是告诉B 你下一次给我发送数据的时候要从100这个位置开始 并且的接收能力是200 换句话说 从100开始 我(A)还允许你给我发200B的数据
- 特别要注意的是 对于握手2 他虽然表示的同意连接 也就是他的TCP报文段只由首部构成 并没有任何的数据部分 但是他仍然需要消耗一个序号 即他返回的ack需要在seq(起始位置)的基础上+1
- 为什么说需要特别注意呢 因为握手3可以选择要不要携带数据 他在不带数据的情况下跟握手2不同的是 他并不需要消耗一个序号
- 三次握手的状态变化
数据传输
释放连接(四次挥手)
- 在前面我们学习了FIN=1表示发送方的数据已经全部发送完毕
- 但是我们的TCP是提供全双工通信的 也就是双向的 这是一个传输层的协议
- 不同于我们数据链路层实现流量控制与可靠传输时候学习的S-W,GBN,SR等协议 他们都是有明确的发送方和接受方的 也就说明他们是工作在半双工条件下的协议
- 在四次挥手中只有挥手1(表示客户传输完毕)和挥手3(表示服务器传输完毕)表示数据传输完毕 也就是说他们是都可以作为发送方的
- 挥手2和挥手4是我们各自作为接收方告诉对面数据已经被接收 而这恰恰又体现了TCP是一种可靠 有连接的传输服务
- 特别需要说明的是挥手1和挥手3可以携带数据 但是他们一般不携带数据
- 而挥手2是可以携带数据的 因为挥手1仅仅是进程A单方面结束了数据传送
- 挥手4是不可以携带数据的 因为挥手3之后已经代表数据传送结束了
#### 四次挥手的状态变化
- 对于TIME-WAIT这个状态是用于我们防止我们的服务器没有接收到挥手4 假如真的传输失败了
- 那么这个时间段的等待就是非常有必要的 因为对于我们的服务器而言 他长时间没有收到我们A给他发送的挥手4
- 他就会重新发送挥手3 这样我们的进程A就会收到 然后重新发送挥手4
- 如果这一段时间什么也没有收到 那么我们的客户进程就默认对面已经收到了我们发出的挥手4
TCP连接管理小节
结语
今天翻草稿箱的时候 居然还有以前写的文章没发出去哈哈 还有好几篇等我稍微完善一下再发出去
该说不说 现在感觉ipad写还行啊 感觉CSDN优化了~