运输层
物理层数据链路层网际层 是实现了网络的链接 但是实际上还是应用和应用间的通信 为了解决这个问题 必须要有应用层和运输层 运输层屏蔽了下面几层的细节 实现了一条虚拟的 好像端到端的服务链路
运输层端口号 复用和分用的概念:应用层的概念:
端口号 :为了实现不同主机的应用层通信 就给各个应用进程用pid来表示 不同的操作系统的pid格式不同 为了完成通信则一定要用统一的标识
举个例子:
pc客户端想问web 访问www.baidu.com 他会像一个记录网址和对应ip的dns服务器发送请求 会在源端口和目的端口 源端口在41256之外随便选一个 目的端口 选择56 这也是默认的dns查询ip的端口 发送过去之后查询信息分用之后进入dns服务器56接口开始查询 把结果封装在信息中返回当时的源端口这样就完成通信 这就是大致过程
例如tomcat请求8080 就是返回8080 来让tomcat处理 所以不能被占用
ucp和tcp区别:
最主要的区别就是一个是可靠传输一个是不可靠传输:不可靠传输:误码丢失直接丢弃 可靠传输 一定要到了才行 ucp常用于视频会议 tcp 用于文件传输
还有 ucp直接就能传 tcp必须要三握手四挥手 ucp可以一传多一串一 tcp只能一传一 ucp:报文首部简单 tcp复杂 ucp是面向应用层的完整报文 不拆分 tcp面向字节流 做出拆分 然后 传输 保证了安全可靠
tcp的流量控制:a-》b发送数据时 如果a发太快b来不及接收怎么办?这就用到了流量控制 是接收方对发送方的控制 使用了滑动窗口:
一开始b告诉a我的滑动窗口是400 发送到200时数据丢了怎么办 这样就对之前的确认 并且发送我的窗口时300 尽享流量控制 然后如图控制
可是这样会有一个问题:我的b有一些缓存了 修现在告诉a我可以滑动300 但是丢失了怎么办?这样不就无休止等待了?
我的a在滑动窗口是0时 就开启一个计时器 计时器到期九项b发送查询信息 如果是0 返回后继续开启计时器 如果是300 就传
拥塞控制:
慢开始:
拥塞避免:
一步一步试探:一开始吧cwnd的限制当成16 然后 从一开始指数增加 1 没丢失 传2 没丢失 传4 一直到16 开始执行拥塞避免 没丢失开始每次加1 16 17 18 一直到24 如果丢失 把阈值 放在24的一半 从头开始慢开始算法:
快重传 快恢复
快重传 刚才突然慢开始的情况是 突然发生了超时重传现象 那么可不可以这样 我1号传出去 2号丢失了 三号来了 我没收到2号 我发送一号确认 他发送四号 我还没收到2号 我继续发送一号确认 如此三次 我就知道要传2号了然后从1-5我都有了 这样不用超时重传就就是快重传 那什么时快恢复 就是当你发生了快重传 没必要快开始 只需要 在刚才快重传的一半直接执行拥塞算法就行 不用满开始
超时重传时间的选择;刚才说了超时重传对这个时间控制时tcp难点之一
有一个算法是这样的
这样的问题是 超时重传并不能计算正确定位rtt 有两种情况 1.a发送出去 超时重传 传完确认 这样rtt有时会被误判 a最开始的传输到 确认时间这就大了
还有一个 a发送 超时重传时间长了 a有发送一个 ack到了 这样应该是第一次到ack 可是算成第二个到ack就小了
所以之前的算法是 只要重传就别管
但是如果你第一个算完 但是后续的实验突然增大 都重传 你还算不出来时间 这就循环了 所以 不行 正确方法每次重传时间扩大二倍、
可靠传输的实现:
情景:A 向 B 发送消息,B 向 A 发送确认。
- 假设 B 上一个确认号 为 31
- 假设 B 的窗口为20字节
A收到上面两个信息开始在缓冲区重新构造自己的发送窗口。
- 下一个发送的字节序号是 31(30及之前的字节B全收到了)
- 发送窗口大小为 20
- 如果 32 33 先到了就会保存在缓存区 向还没到的最低窗口发送确认 这样就知道了31还没来发送31 这样一起进入接收方 发送33 的确认 接收后接受和发送的窗口一起向前滑动到33
运输连接的管理: 三报文握手
客户向服务器发起请求 SyN=1 代表请求但是不带任何 数据 第一次告诉客户 我是从哪个序号发送 客户端发送请求代表可以接受链接 发送两个ack一个是确认请求 一个是序号确认告诉客户算我的接收窗口在哪 然后客户端继续发送一个确认请求 建立链接
就是我告诉你 我下午几点来你家 你告诉我的你几点有空 但是你不能我没来你干等我 在我没来的时候你该干嘛干嘛 我来了 咱俩开始打游戏
能不能两次握手呢 不行 如果第一系请求确认在网络中滞后了 ab都穿输完了 他开始到了接收方 接收方准备好了 但是没有第三次确认来凝结1那么接收方白等浪费资源
四报文回收:
就是 我说我走了 你听到后说真走啦?但是这个时间你还可以给我拿个苹果 拿完之后我说那我真走啦 等你确认好走吧 我就走了 我们来一天就结束了 不能没有等待时间 因为没有等待时间 我说我走了 你没听到 你一直问我你走没呢 你没走我不敢关门
tco报文段的首部格式:
重点时序号 确认号 数据偏移 序号是 一个数据最开始的序号 窗口移动他就移动 确认号 我没收到的最小的序号
我发送方的意思是 我从200
开始发 长度是 100 你800之前已经成功接收了 下面的意思是 对 我800之前的都接受了 所以我从800开始 我接受了100个字节 所以我对你发的301之前进行确认