计算机网络漫谈之传输层 咱们讨论了如果需要确定一个计算机上的不同网络程序(比如QQ和浏览器),需要端口的标识,但是IP头部和帧的头部都没有端口的标识字段,需要新的协议。和前面IP协议的实现套路一样,我们需要一个空间来存放端口号,因此就有了传输层的协议TCP和UDP。最简单的实现就是UDP协议,它的格式几乎就是在数据前面,加上端口号。UDP数据包,也是由”标头”和”数据”两部分组成。

“标头”部分主要定义了源端口和接收端口,”数据”部分就是具体的内容。具体的Head结构如下所示:

然后,把整个UDP数据包放入IP数据包的”数据”部分,而前面说过,IP数据包又是放在以太网数据包之中的,所以整个以太网数据包现在变成了下面这样:

目前我们的数据包更加完善了,也更加能体现层层封装的意思。绿色头部是UDP头部,红色头部是IP头部,蓝色头部是帧的头部,”上层标头+数据”作为下层的数据。

UDP协议的优点是比较简单(它的数据包包头几乎只有端口和长度),容易实现,但是缺点是可靠性较差,一旦数据包发出,无法知道对方是否收到。为了解决这个问题,提高网络可靠性,TCP协议就诞生了。这个协议非常复杂,但可以近似认为,它就是有确认机制的UDP协议,每发出一个数据包都要求确认。如果有一个数据包遗失,就收不到确认,发出方就知道有必要重发这个数据包了。

因此,TCP协议能够确保数据不会遗失。它的缺点是过程复杂(TCP三次握手、四次挥手等)、实现困难(数据重传机制、流量控制机制等)、消耗较多的资源。TCP数据包和UDP数据包一样,都是内嵌在IP数据包的”数据”部分。TCP数据包也是由“标头”和“数据”组成的。当然,“标头”是重点。下面我们一起来看看TCP数据包的“标头”:

明显比UDP的数据包“标头”复杂多了,我们下面来依次解释每个字段的含义。我尽量以最简单的方式来解释每个字段,目前你大概知道是干什么的就行了:

  • 源端口与目的端口: 各占16位,分别写入源端口号和目的端口号。
  • 32位序列号: 占32位,能唯一标识一次通信中的数据包序号,可以看作是一个数据包的ID。
  • 32位确认序列号: 占32位,作为确认收到使用,比如如果想确定上面32位序列号,就把此值填为其值加1。
  • 首部长度: 占4位.表示整个“标头”的长度,所以TCP报头最大为60字节。
  • URG: 占1位,紧急指针标志位,当URG=1时,表明紧急指针字段有效.它告诉系统中有紧急数据,应当尽快传送,这时不会按照原来的排队序列来传送.而会将紧急数据插入到本报文段数据的最前面。
  • ACK: 占1位,当ACK=1时,确认序列号才有效,当ACK=0时,确认序号ack无效。
  • PSH: 占1位,推送操作,很少用,没有了解。
  • RST: 占1位,当RST=1时,表明TCP连接出现严重错误,此时必须释放连接。 (9)SYN: 占1位,请求连接的标志。
  • FIN: 占1位,释放链接的标志.
  • 16位窗口的大小:占16位,表示期望对方发送的字节数。
  • 16位检验和: 占16位,用于检验包数据是否正确。
  • 紧急指针: 占16位,只有当URG=1时的时候,紧急指针才有效,它指出紧急数据的字节数。

总链:计算机网络漫谈系列文章

最新文章

  1. 通读SDWebImage②--视图分类
  2. 前端利器---Bootstrap
  3. 新浪博客地址 http://blog.sina.com.cn/u/2145079955
  4. 关于sql where id in 转换成数据类型 int 时失败(转)
  5. uWSGI uwsgi_response_write_body_do(): Connection reset by peer 报错的解决方法
  6. I.MX6 wm8962 0-001a: DC servo timed out
  7. grails-MappingException: Could not determine Type
  8. 负载均衡软件LVS分析一(概念)
  9. 微信小程序-滚动消息通知
  10. linux模拟实现主机跨路由通信
  11. linux内核开发入门学习
  12. 使用OMS查询Api Management的调用日志
  13. erlang开发工具之intellij idea基本使用
  14. StanfordPOSTagger的用法
  15. OSS网页上传和断点续传(OSS配置篇)
  16. request和session的区别
  17. MGR主从不一致问题排查与修复
  18. 给echarts加个“全屏展示”
  19. Python_命名空间和作用域_25
  20. Codeforces 765 E. Tree Folding

热门文章

  1. javascript 继承 inheritance prototype
  2. hadoop报错
  3. genymotion启动模拟器后,sdk查询adb devices为空-解决方案
  4. 软件开发的V模型
  5. mysql8 navicat远程链接失败
  6. CF605E-Intergalaxy Trips【期望dp】
  7. AT3950-[AGC022E]Median Replace【贪心,dp】
  8. 深入浅出WPF-01.WPF缘起
  9. 淘宝商品html--网页结构
  10. android 使用SQLite的基本操作