IP/TCP协议详解

系列文章目录

第一篇 : TCP/IP协议详解
第二篇 : IP协议
第三篇 : TCP协议
第四篇 : 面试准备


文章目录

  • 系列文章目录
  • 前言
  • 第一章、TCP/协议族
    • 1.1 层次介绍
    • 1.2 封装
    • 1.3 分用


前言

IP/TCP学习系列目前总共包括4篇,本学习专栏都是自己学习的笔记与总结,前部分来源于游双编著的《Linux高性能服务器编程》,有兴趣的朋友可去学习原文,后面就是各个地方的整理与想法。本人也是在游戏后端中不断摸索前进,不足之处还希望指正!


第一章、TCP/协议族

因特网主流使用的协议族是TCP/IP协议族,是一个分层,多协议的通讯体系,其中主要使用的协议,以及他们之间的协作关系如下图所示:
IP/TCP协议详解_第1张图片

1.1 层次介绍

数据链路层:
数据链路层实现了网卡接口的网络驱动程序,以处理数据再物理媒介(如以太网,令牌环等)上的传输,网络驱动程序隐藏了不同物理网络的不同电气特性,为上层提供一个统一的接口。
两个主要的协议:
—》ARP协议(地址解析协议):实现IP地址到机器物理地址(常是MAC地址,以太网地址等)之间的相互转换。
—》RARP协议(逆地址解析协议):与ARP协议相反。
note:网络层使用IP地址寻址一台机器,数据链路层使用物理地址寻找一台机器。
网络层:
网络层实现数据的选路和转发,网络结构如广域网WAN通常使用众多的分级的三层路由交换机(物理层,数据链路层,网络层)来连接分散的主机或者局域网LAN从而构建大型网络。网络层的任务就是选择这些中间结点,从而确定两台主机之间的通信路径,并且网络层对上层协议隐藏了网络拓扑连接的细节,使得在传输层看来,网络是直接连接的。
协议:
—》IP协议(英特网协议):IP协议根据数据包的目的IP地址来决定投递它,具体介绍在本篇的第二章。
传输层:
传输层为两台主机上的应用程序提供端对端的通讯,只在乎两端,不在乎数据包的中转过程。
协议:
—》TCP协议(传输控制协议):为应用层提供可靠的,面向连接的和基于流的服务器,TCP使用超时重传,数据确认等方式来确保数据包被正确发送到目的端,因此TCP服务是可靠的。使用TCP协议通讯的双方必须先建立TCP连接,并且在内核中维持一些必要的数据结构,比如连接的状态,读写缓冲区,以及诸多定时器等。当通讯结束,双方必须关闭连接以释放这些内核数据。TCP服务是基于流的。基于流的数据没有边界限制,它源源不断的从通信一端流入另一端。发送端可以逐个字节地向数据流写入数据,接收端也可以逐个字节地将他们读出。
—》UDP协议(用户数据报协议):为应用层提供不可靠,无连接和基于数据报地服务器。UDP传输数据过程中,无法保证数据能正确地到达和不丢失,不进行数据校验等,一般结合上层协议地处理,如RTP协议等。UDP协议是无连接的,通讯双方不保持一个长久的联系,因此每次程序发送数据都要指明接收端地址。基于数据报的服务是相对于基于流的服务而言,每个UDP数据报都有个长度,接收端必须以该长度的最小单位一次将所有内容一次性读出,否则数据将被截断。
应用层:
应用层负责处理应用程序的逻辑,运行于用户空间。
几种协议或程序介绍:
—》ping:是应用程序,利用ICMP报文检测网络连接,是调试网络环境的必备工具。
—》DNS:域名服务,该协议提供机器域名到IP地址的转换。
—》telnet:远程登录协议。

1.2 封装

TCP/IP协议族的分层结构,使得每个层只需要努力的完成本层的工作,那么上层协议是如何使用下层协议提供的服务呢? 就是通过封装实现的,应用程序数据在发送到物理网络之前,将沿着协议栈从上往下依次传递,每层协议都将在上层数据的基础上加上自己的头部信息(有时也包括尾部信息),以实现该层的功能,这个过程就是封装。
IP/TCP协议详解_第2张图片
经过TCP封装后的数据称为TCP报文,前面提到,TCP协议为通讯双方维持一个连接,并且在内核中存储相关的数据。这部分数据中的TCP头部信息和TCP内核缓冲区(发送缓冲区或接收缓冲区)数据一起构成TCP报文段,如下图的虚线所示。
IP/TCP协议详解_第3张图片当发送端应用程序使用send(或write)函数向一个TCP连接写入数据时,内核中的TCP模块首先把这些数据复制到与该连接对应的TCP内核发送缓冲区中,然后TCP模块调用IP模块提供的服务,传递的参数包括TCP头部信息和TCP发送缓冲区中的数据,即TCP报文段。
经过UDP封装后的数据称为UDP数据包,UDP对应用程序数据的封装与TCP类似,不同的是,UDP无须为应用层数据保存副本,因为它提供的服务是不可靠的,当一个UDP数据报被成功发送后,UDP内核缓冲中该数据报就被丢弃。如果应用程序检测到该数据未能被接收端正确接收,并打算重发这个数据报,则应用程序需要重新从用户空间将数据报拷贝到UDP内核发送缓冲区中。
经过IP封装后的数据称为IP数据报,IP数据报也包括头部信息和数据部分,其中数据部分就是一个TCP报文段,UDP报文段或者ICMP报文段。
经过数据链路层封装的数据称为帧(frame)。传输媒介不同,帧的类型也不同,比如以太网上传输的是以太网帧(ethernet frame),而令牌环网络上传输的则是令牌环帧(tokenring frame),以以太网帧为例,如下:
在这里插入图片描述
以太网帧使用6字节的目的物理地址和6字节的额源物理地址来表示通讯的双方,4字节CRC字段对帧的其他部分提供循环冗余校验。帧的最大传输单元(MTU),即帧最多能携带多少上层协议数据,通常受到网络类型的限制,如中所示的以太网帧的MTU是1500字节,因此,过长的IP数据报可能会被分片(fragment)传输。
帧才是最终在物理网络上传送的字节序列。

1.3 分用

当帧到达目的主机时,将沿着协议栈自下向上依次传递。各层协议依次处理帧中本层负责的头部书,以获取所需要的信息,并最终沿着处理后的帧交给目标应用程序,这个过程就是分用。分用是依靠头部信息中的类型字段实现的。下图显示以太网帧的分用过程。
IP/TCP协议详解_第4张图片
因为IP协议,ARP协议和RARP协议都使用帧传输数据,所有帧的头部愮提供某个字段(具体情况取决于帧的类型)来区分他们。以以太网帧为例,它使用2个字节的类型字段来标识上层协议,如果主机接收到的以太网帧类型字段是0x800,则帧的数据部分为IP数据报,以太网驱动程序将其交付给IP模块;若类型字段为0x806,则帧的数据部分为ARP请求或应答报文,以太网驱动程序将其交付给ARP模块,同理为0x805,交付给RARP模块。
同样,因为ICMP,TCP协议和UDP协议都使用IP协议,所有IP协议数据报的头部采用16位的协议字段来区分他们。TCP报文段和UDP数据报则通过头部中的16端口号字段来区分上层应用程序。
帧通过上述分用步骤后,最终将封装前的原始数据发送到目标服务,这样,在顶层目标服务看来,封装和分用似乎没有发送过。

你可能感兴趣的:(IP/TCP学习笔记,网络,tcp/ip,网络协议)