您的位置:首页 > 理论基础 > 计算机网络

linux高性能服务器编程学习笔记一:TCP/IP协议详解

2017-11-25 21:23 316 查看
1、TCP/IP协议族是一个四层协议系统,自底向上依次为数据链路层、网络层、传输层、应用层。
2、数据链路层常用的协议有ARP协议。网络层常用的协议有ICMP协议和TP协议。传输层常用的协议有TCP协议和UDP协议。应用层常用的协议有ping、telnet、OSPF协议、DNS协议,其中ping直接使用网络层的ICMP协议,OSPF协议直接使用网络层的IP协议,telnet使用网络层的TCP协议,而DNS使用网络层的UDP协议。见下图:



3、数据链路层简介
(1)数据链路层实现了网络驱动程序以处理数据在物理媒介上(比如以太网)的传输。不同的物理网络有着不同的物理特性,而网络驱动程序就对其进行了封装,以便为上层协议提供统一的接口。
(2)要知道,在网络层路由寻址一台机器使用的是IP地址,而在数据链路层寻址一台机器一般来说使用的是物理地址,因此在传送数据的时候,网络层必须先将目标机器的IP地址转化为目标机器的物理地址,进而使用链路层提供的服务。
4、网络层简介
(1)网络层主要是实现数据包的选址和转发。一般来说,多个主机或者局域网通过路由器连接可以形成广域网。并且通常两台通信的主机并不是直接相连的,两者之间会存在多个中间节点(即路由器),此时就需要为其选择最好的或合适的路由路径,用于两台主机之间进行通信。网络层对上层(传输层)协议隐藏了网络拓扑连接的细节,使得在传输层和网络应用程序看来,通信两方是直接相连的
(2)网络层的核心协议是IP协议。IP协议根据数据包的目的IP地址来选择如何投递它。假如数据包是需要多次进行转发才能到达目的地,那么在转发过程中,IP协议总是会为其寻找合适的下一跳路由器,并交付给它负责转发,最终到达目的地,或者由于发送失败而丢弃。
(3)在网络层中,还有一个协议是IP协议的重要补充,那就是ICMP协议。分为两大类:差错报文(目标不可达(类型为3)和重定向(类型为5))和查询报文(ping程序使用ICMP查询报文查看目标是否可达)。具体格式见:



8位类型用于区分报文类型,8位代码具体细分不同的条件,例如,在类型为5的重定向报文中,0代码表示对网络重定向,1表示对主机重定向。16位校验和(CRC循环冗余校验)用于校验整个ICMP报文在传输过程中是否有损坏。
5、传输层简介
(1)传输层协议不似网络层协议一样,使用的是逐跳通信方式,它只关心通信的起始端和目的端。主要协议是TCP、UDP和SCTP协议
(2)TCP协议:面向链接,面向流以及可靠的协议。主要靠数据确认、超时重传等机制来保证其可靠的性质。使用TCP协议通信的双方必须先建立连接,并且在内核为该连接维持一些必要的数据结构,例如:连接的状态、读写缓冲区以及诸多定时器。在通信完毕也应当关闭连接以释放这些内核数据。基于流即表示数据没有边界限制。发送端可以逐个字节的向数据流中写入数据,接收端也可以逐个字节的向数据流读数据。
(3)UDP协议:与TCP协议相反,无连接、不可靠基于数据报的协议。表示假如数据乱序或数据丢失,UDP协议也只是简单的通知应用程序发送失败。因此使用UDP协议需要自己提供类似超时重传和数据确认的机制。与基于流相对,UDP是基于数据报的,也就是,每个UDP数据报都有一个长度,而接收端必须按照其长度为最小单位读取数据,否则造成数据截断。
6、应用层简介
(1)应用层负责应用程序的逻辑。数据链路层、网络层以及传输层由于负责网络通信的细节,必须既稳定又高效,因此一般在内核中实现。而应用层一般在用户空间中实现,因为它负责众多的应用程序,比如文件传输、名称查询和网络管理。比较常见的有ping程序(非协议)、telnet协议、OSPF协议(开放最短路径优先,一种动态路由更新协议)、DNS协议(域名和IP地址的映射)
(2)应用层协议(或程序)可能跳过传输层直接使用网络层协议,例如ping程序使用网络层的ICMP协议。OSPF直接使用网络层的IP协议。
7、封装和分用简介
(1)封装:现在考虑以下,上层协议是如何使用下层协议提供的服务的呢?主要是通过封装实现的。在应用程序数据发送到物理网络之前,数据沿着协议栈由上到下依次传递,在传递的过程中,每一层都会加上自己的头部信息以实现该层的功能。举个例子,应用程序经过TCP封装后称为TCP报文段。使用TCP协议必须先建立连接,并且在内核中维持相关数据,那么这部分数据中的TCP头部信息和TCP内核缓冲区数据(接收缓冲区或发送缓冲区)一起构成了TCP报文段。



那么当应用程序使用send(或者write)函数向一个TCP连接中写入数据时,内核中的TCP模块会将数据由用户空间复制到TCP内核发送缓冲区中。然后TCP模块调用IP模块提供的服务,传递的参数包括TCP头部信息和TCP发送缓冲区的数据,即TCP报文段。(TCP的内核缓冲区会为应用层数据保存副本)
   在这里顺带提一下,UDP数据报被成功发送之后,UDP内核发送缓冲区的数据就会被立刻丢弃,因为UDP提供的是不可靠的服务,无需为应用层数据保存副本。这也就表明,若是应用程序检测到数据报未能被接收端正确接收,如果要重发这个数据报,应用程序需要从用户空间将该数据报拷贝到UDP内核发送缓冲区中。
   经过IP封装后的数据称为IP数据报。其数据部分可能是TCP报文段、UDP数据报或者是ICMP报文。
   经过数据链路层封装的数据称为帧。帧类型和传输媒介有关(以太网传输的是以太帧,令牌环网传输的是令牌环网帧)。
   以太网帧的格式



  6字节的目的物理地址以及6字节的源物理地址,2字节的类型用于在分用的时候交付给正确的模块(IP模块、ARP模块)。4字节的CRC提供循环冗余校验。
  帧的最大传输单元(MTU),即帧最多能携带多少上层协议数据。通常受网络类型的限制,例如以太网帧的MTU是1500,因此过长的IP数据报就可能会进行分片传输。
(2)分用:当帧到达目的主机时,沿着协议栈自底向上依次传递。各层协议依次处理帧中本层负责的头部数据,并且根据自层头部信息的类型字段将数据交付到相应的上层模块当中。最终将处理后的帧交给目标应用程序



以以太网帧为例:使用2字节的类型字段来标识上层协议,若类型字段为0X800,表示数据部分为IP数据报,那么以太网驱动程序将数据交付给IP模块。若类型字段为0X806,则帧的数据部分为ARP请求或应答报文,那么以太网驱动程序将数据交付给ARP模块。
   同样,由于ICMP、TCP、IP协议都使用IP协议,所以IP数据报的头部信息会有16位协议字段来表示这些协议以便交付给相应的模块。TCP报文段和UDP数据报通过其头部的16位端口号字段来区分上层应用程序。比如DNS的端口号为53,HTTP协议的端口号为80。(所有知名应用程序端口号都可在/etc/services文件中找到)。
8、ARP协议工作原理
(1)ARP协议的主要作用是IP地址到物理地址的映射。既然有IP地址和物理地址这两种地址,那么ARP请求/应答报文就应当有硬件类型字段(2个字节)和协议类型字段(2个字节)标识映射的类型。例如硬件类型为1表示MAC地址,协议类型为0X800表示IP地址。也就是IP地址到MAC地址的映射。然后还有硬件地址长度字段(1个字节)和协议地址长度字段(1个字节)两个长度字段表征相应的长度。为了区分是ARP请求还是ARP应答报文或者RARP请求报文还是RARP应答报文,还需要有操作(2个字节)字段来标识。(相应的操作值为1、2、3、4)。然后需要通信双方的以太网和IP地址。其中发送的时候只填充除目的端以太网地址外的其它三个字段。目的端以太网地址在目的端发送ARP应答报文的时候填充进去并交换通信两方的角色(ARP请求报文中的源端物理和IP地址变为ARP应答报文中的目的端物理和IP地址,ARP请求报文中的目的端物理和IP地址变为ARP应答报文中的源端物理和IP地址。)



ARP请求/应答报文的长度如上所示为28字节,加上帧头部和尾部的18字节,则完整的以太网帧为46字节。(有些实现要求以太网帧的数据部分最短为46字节,这种情况一个携带ARP请求/应答报文的以太网帧为64字节)
9、DNS工作原理
(1)DNS是一套分布式的域名服务系统,用于域名到IP地址的映射。每个DNS服务器上都存放着大量的机器名和IP地址的映射。
(2)一般来说,查询分为两种:递归查询和迭代查询。递归查询指的是若目标DNS服务器无法解析域名,则它作为新的客户向其它DNS服务器继续查询,以此递归下去,直至获取结果并将该结果返回给客户端。迭代查询指的是若目标DNS服务器无法解析域名,则它会告诉客户端其它DNS服务器的IP地址以供客户端参考,由原来客户端继续向其它DNS服务器查询。
10、SOCKET和TCP/IP协议族的关系
(1)由于数据链路层、网络层、传输层协议是在内核中实现的,所以需要一套系统调用(SOCKET)使得应用程序能够访问这些协议提供的服务。
(2)由SOCKET定义的API主要有两个作用:一是将应用程序数据从用户空间拷贝到内核TCP/UDP发送缓冲区中,以此交付内核发送数据。或者从内核TCP/UDP接收缓冲区中复制数据到用户空间中,以读取数据。二是应用程序可以通过SOCKET定义的API修改内核中各层协议的某些头部信息或其他数据结构,从而控制底层通信的行为。比如通过setsockopt函数来设置IP数据报在网络中存活的时间。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: