TCP/IP网络协议总结(一)

 

网络参考模型

                                  

                  OSI七层模型,在教学科研中的划分                                              重5层模型,在工程开发中的划分

重五层模型中:

        应用层任务:提供系统与用户的接口;

       传输层任务:负责进程间的通信;

       网络IP层任务:

             1.将传输层的报文分段分装成组;
             2.选择适当的路由,把分组交付到目的主机;
       数据链路层任务:将IP数据组装成帧
       物理层任务:透明传输比特流。
 

一、网络协议首部总结

         以太网帧结构

                                   

 

前导码:7 个字节,用于数据传输过程中的双方发送与接收的速率的同步。
SFD:帧开始符,1 个字节,用于标识一个以太网帧的开始。 
目的 MAC 地址:6 个字节,指明帧的接收者。
源 MAC 地址:6 个字节,指明帧的发送者。
长度:2 个字节,指明该帧数据字段的长度,但不代表数据字段长度能够达到 2^16 字节。
类型:2 个字节,指明帧中数据的协议类型,比如常见的 IPv4 中的 ip 协议采用 0x0800。
数据与填充:46~1500 个字节,包含了上层协议传递下来的数据,如果加入数据字段后帧长度不够 64 字节,会在数据字段加入填充字段达到 64 字节。
校验和:4 个字节,对接收网卡(主要是检测数据与填充字段)提供判断是否传输错误的一种方法,如果发现错误,则丢弃此帧。目前最为流行的用于校验和(FCS)的算法是循环冗余校验(cyclic redundancy check -- CRC)。
 
        PDU data结构

                    
                                

 

IP报文头部:占20个字节

                                

       (1) 版本号:IP协议的版本。如果是IPv4,值是4

  (2) 头部长度:4位最大为0xF,注意该字段表示单位是字(4字节)

  (3) 服务类型(Type Of Service,TOS):3位优先权字段(现已被忽略) + 4位TOS字段 + 1位保留字段(须为0)。4位TOS字段分别表示最小延时、最大吞吐量、最高可靠性、最小费用,其中最多有一个能置为1。应用程序根据实际需要来设置 TOS值,如ssh和telnet这样的登录程序需要的是最小延时的服务,文件传输ftp需要的是最大吞吐量的服务

  (4) 总长度: 指整个IP数据报的长度,单位为字节,即IP数据报的最大长度为65535字节(2的16次方)。由于MTU的限制,长度超过MTU的数据报都将被分片传输,所以实际传输的IP分片数据报的长度远远没有达到最大值。

 

下来的3个字段则描述如何实现分片:

  (5) 标识:唯一地标识主机发送的每一个数据报,其初始值是随机的,每发送一个数据报其值就加1。同一个数据报的所有分片都具有相同的标识值

  (6) 标志: 位1保留,位2表禁止分片(DF),若设置了此位,IP模块将不对数据报进行分片,在此情况下若IP数据报超过MTU,IP模块将丢弃数据报并返回一个ICMP差错报文;位3标识更多分片(MF),除了数据报的最后一个分片,其他分片都要把它设置为1

  (7) 位偏移:分片相对原始IP数据报数据部分的偏移。实际的偏移值为该值左移3位后得到的,所以除了最后一个IP数据报分片外,每个IP分片的数据部分的长度都必须是8的整数倍

 

  (8) 生存时间::数据报到达目的地之前允许经过的路由器跳数。TTL值被发送端设置,常设置为64。数据报在转发过程中每经过一个路由该值就被路由器减1.当TTL值为0时,路由器就将该数据包丢弃,并向源端发送一个ICMP差错报文。TTL可以防止数据报陷入路由循环

  (9) 协议: 区分IP协议上的上层协议。在Linux系统的/etc/protocols文件中定义了所有上层协议对应的协议字段,ICMP为1,TCP为6,UDP为17

  (10) 头部校验和: 由发送端填充接收端对其使用CRC算法校验,检查IP数据报头部在传输过程中是否损坏

  (11) 源IP地址和目的IP地址: 表示数据报的发送端和接收端。一般情况下这两个地址在整个数据报传递过程中保持不变,不论中间经过多少个路由器

  (12) 选项:可变长的可选信息,最多包含40字节。选项字段很少被使用。可用的IP可选项有:

  a. 记录路由: 记录数据包途径的所有路由的IP,这样可以追踪数据包的传递路径

  b. 时间戳: 记录每个路由器数据报被转发的时间或者时间与IP地址对,这样就可以测量途径路由之间数据报的传输的时间

  c. 松散路由选择: 指定路由器的IP地址列表数据发送过程中必须经过所有的路由器

  d. 严格路由选择: 数据包只能经过被指定的IP地址列表的路由器

 

网络IP协议相关技术应用:
1,DNS:域名解析服务,通过域名向域名服务器查询获得IP的过程; 
2,ARP地址解析协议:通过MAC地址解析获取IP地址;
3,ICMP:在ipv4中ICMP作为辅助作用支持,但在ipv6中,ICMP是ipv6中的一部分ICMPv6,直接影响IPv6是否可以正常通信。
4,DHCP:自动设置IP地址,统一管理IP地址分配;
5,NAT:IP地址转换协议。私网IP+端口号到公网IP+端口号的转换,在一定程度上NAT的诞生有效的缓解ipv4地址资源短缺的状况;
6,IP隧道:当两个ipv6网络通信,中间夹着一个ipv4网络,这是这两个ipv6网络之间是不能通信的。IP隧道技术采用在原有的IP首部后面追加IP首部的方式,才能正常转发到ipv6网络另一端。
 
IP的分包组包:
MTU:数据链路的最大传输单元。以太网LAN的MTU=1500个字节大小。
关于MTU大小的问题:IPv4要求路由器和数据链路处理MTU的下限为576字节。IPv6要求MTU最小下限为1280字节长的数据包。
        数据在网络传输过程中,当网络层数据报文大小超过当前主机MTU值时,这个数据报文无法一次性发送而导致数据切片处理。切片后的数据由目的主机进行组包。 但是当数据在网络传输过程中,当中间路由器MTU值小于两端路由器或者主机的MTU值,导致频繁的切片处理。
        这样看来,分片机制会加重路由器的处理负荷。应用MTU发现从发送端主机到接收端主机的路径所有数据链路中MTU最小值。从而避免中路路由器上发生切片处理,提高传输效率。

 

UDP报文头:8个字节

                                    

源端口:16 bit (2 个字节),是一个大于 1023 的 16 位数字,由基于 UDP 应用程序的用户进程随机选择。
目的端口:16 bit (2 个字节),指明接收者所用的端口号,一般由应用程序来指定。
数据长度:16 bit (2 个字节),标明 UDP 头部和 UDP 数据的总字节长度。
校验和字段:16 bit (2 个字节),用来对 UDP 头部和 UDP 数据进行校验。与 TCP 不同的是,此字段是可选项,而 TCP 数据段中必须包含校验和字段。数据:不定长度,为上层协议封装好的数据。

 

TCP报文头:20个字节

                                   

      16位源端口号Source Port:告知主机该报文段是来自哪里;      16位目的端口号Destination Port,传给哪个上层协议或应用程序。进行TCP通信时,客户端通常使用系统自动选择的临时端口号,而服务器则使用知名服务端口号(比如DNS协议对应端口53,HTTP协议对应80,这些端口号可在/etc/services文件中找到)。

      32位序号:一次TCP通信(从TCP连接建立到断开)过程中某一个传输方向上的字节流的每个字节的编号。假设主机A和主机B进行TCP通信,A发送给B的第一个TCP报文段中,序号值被系统初始化为某个随机值ISN(Initial Sequence Number,初始序号值)。那么在该传输方向上(从A到B),后续的TCP报文段中序号值将被系统设置成ISN加上该报文段所携带数据的第一个字节在整个字节流中的偏移。例如,某个TCP报文段传送的数据是字节流中的第1025~2048字节,那么该报文段的序号值就是ISN+1025.另外一个传输方向(从B到A)的TCP报文段的序号值也具有相同的含义。
      32位确认号(acknowledgement number):用作对另一方发送来的TCP报文段的响应。其值是收到的TCP报文段的序号值加1。假设主机A和主机B进行TCP通信,那么A发送出的TCP报文段不仅携带自己的序号,而且包含对B发送来的TCP报文段的确认号。反之,B发送出的TCP报文段也同时携带自己的序号和对A发送来的报文段的确认号。
      4位头部长度(header length):标识该TCP头部有多少个32bit字(4字节)。因为4位最大能标识15,所以TCP头部最长是60字节。
      6位标志位包含如下几项:
            URG标志,表示紧急指针(urgent pointer)是否有效。
            ACK标志,表示确认号是否有效。我们称携带ACK标识的TCP报文段为确认报文段。
            PSH标志,提示接收端应用程序应该立即从TCP接收缓冲区中读走数据,为接收后续数据腾出空间(如果应用程序不将接收  到的数据读走,它们就会一直停留在TCP接收缓冲区中)。
            RST标志,表示要求对方重新建立连接。我们称携带RST标志的TCP报文段为复位报文段。
            SYN标志,表示请求建立一个连接。我们称携带SYN标志的TCP报文段为同步报文段。
            FIN标志,表示通知对方本端要关闭连接了。我们称携带FIN标志的TCP报文段为结束报文段。       16位窗口大小(window size):是TCP流量控制的一个手段。这里说的窗口,指的是接收通告窗口(Receiver Window,RWND)。它告诉对方本端的TCP接收缓冲区还能容纳多少字节的数据,这样对方就可以控制发送数据的速度。
      16位校验和(TCP check sum):由发送端填充,接收端对TCP报文段执行CRC算法以检验TCP报文段在传输过程中是否损坏。注意,这个校验不仅包括TCP头部,也包括数据部分。这也是TCP可靠传输的一个重要保障。
      16位紧急指针(urgent pointer):是一个正的偏移量。它和序号字段的值相加表示最后一个紧急数据的下一字节的序号。因此,确切地说,这个字段是紧急指针相对当前序号的偏移,不妨称之为紧急偏移。TCP的紧急指针是发送端向接收端发送紧急数据的方法。
      TCP头部选项:TCP头部的最后一个选项字段(options)是可变长的可选信息。这部分最多包含40字节,因为TCP头部最长是60字节(其中还包含前面讨论的20字节的固定部分)。

 

http客户端请求服务器的过程

 在我们客户端,通常通过浏览器从发送请求3步:

         step1:比如输入www.baidu.com按回车键,  首先域名服务器会解析这个域名的ip地址,也就是DNS域名解析过程,获取ip地址;
         step2:TCP连接这个IP;
         step3:发送http协议内容;
 
访问网页的整个过程简单的来说:下面我通过命令来模拟访问百度主页的过程:
       1. 输入命令:exec 8<> /dev/tcp/www.baodu.com/80   来建立一个TCP连接;
       2.输入命令:echo -e "GET / HTTP/1.0\n" 1>& 8    在tcp连接socket的基础上发送http协议request请求报文;
       3.服务器返回TCP连接上的socketfd,返回http协议response响应报文到文件描述符8,其实8就是一个socketfd; 我们通过输入命令:cat <& 8  来读取返回的文本内容。

http请求报文格式

                              

下面是我用浏览器请求我的nginx的默认页面的信息来举例:
请求行:

GET http://192.168.1.104:8080/ 

请求头:
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cache-Control: max-age=0
Connection: keep-alive
Host: 192.168.1.104:8080
If-Modified-Since: Thu, 30 Jul 2020 17:54:40 GMT
If-None-Match: "5f230960-264"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36

 

http请求方法总结:

1. GET:请求指定的页面信息,并返回实体主体。

2. HEAD: 类似于GET 请求,只不过返回的响应中没有具体的内容,用于获取报头。

3.POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。

4.PUT:从客户端向服务器传送的数据取代指定的文档的内容。

5.DELETE:请求服务器删除指定的页面。

6.CONNECT:HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。

7.OPTIONS:允许客户端查看服务器的性能。

8.TRACE:回显服务器收到的请求,主要用于测试或诊断。

9.PATCH:是对PUT 方法的补充,用来对已知资源进行局部更新。

 

DNS协议

在shell终端输入命令:nslookup www.baidu.com ; 

www.baidu.com 域名解析具体的流程可描述如下:
1. 主机 192.168.1.114 先向本地域名服务器 192.168.1.2 进行 递归查询;
2. 本地域名服务器采用 迭代查询,向一个根域名服务器进行查询;
3. 根域名服务器告诉本地域名服务器,下一次应该查询的顶级域名服务器 baidu.com 的IP 地址;
4. 本地域名服务器向顶级域名服务器 baidu.com 进行查询;
5. 顶级域名服务器 .com 告诉本地域名服务器,下一步查询权限服务器 www.baidu.com 的 IP 地址;
6. 本地域名服务器向权限服务器 www.baidu.com 进行查询;
7. 权限服务器 www.baidu.com 告诉本地域名服务器所查询的主机的 IP 地址是119.63.197.151;
8. 本地域名服务器最后把查询结果 119.63.197.151告诉主机 192.168.1.114 ;
递归查询:本机向本地域名服务器发出一次查询请求,就静待最终的结果。如果本地域名服务器无法解析,自己会以 DNS 客户机的身份向其它域名服务器查询,直到得到最终的 IP 地址告诉本机 。
迭代查询:本地域名服务器向根域名服务器查询,根域名服务器告诉它下一步到哪里去查询,然后它再去查,每次它都是以客户机的身份去各个服务器查询。
 
DNS协议格式
                               
DNS头部:
       会话标识(2个字节):是 DNS 报文的 ID 标识,对于请求报文和其对应的应答报文,这个字段是相同的,通过它可以区分 DNS 应答报文是哪个请求的响应;
       标志(2个字节),结构参考下图;
       数量字段(总共 8字节):Questions、Answer RRs、Authority RRs、Additional RRs 各自表示后面的四个区域的数目。Questions 表示查询问题区域节的数量,Answers 表示回答区域的数量,Authoritative namesversers 表示授权区域的数量,Additional recoreds 表示附加区域的数量;
 
                              
QR(1bit)查询/响应标志,0 为查询,1 为响应
opcode(4bit)0 表示标准查询,1 表示反向查询,2 表示服务器状态请求
AA(1bit)表示授权回答
TC(1bit)表示可截断的
RD(1bit)表示期望递归
RA(1bit)表示可用递归
rcode(4bit)表示返回码,0 表示没有差错,3 表示名字差错,2 表示服务器错误(ServerFailure)
 
DNS正文之Quesirises区域:
 
                               
查询名:长度不固定,且不使用填充字节,一般该字段表示的就是需要查询的域名(如果是反向查询,则为 IP,反向查询即由 IP 地址反查域名)

查询类型:
类型 助记符 说明
1      A         由域名获得 IPv4 地址
2      NS       查询域名服务器
5      CNAME 查询规范名称
6      SOA    开始授权
11    WKS    熟知服务
12    PTR     把 IP 地址转换成域名
13    HINFO 主机信息
15    MX      邮件交换
28    AAAA  由域名获得 IPv6 地址
252  AXFR   传送整个区的请求
255  ANY    对所有记录的请求;
 
查询类的值通常为 1,表明是 Internet 数据
 
 
二、TCP/IP协议栈
 
TCP/IP协议栈,重点知识清单(未完,待续)
1.ISO7层模型,重5层模型;
2.以太网数据帧格式;
3.传输层协议TCP与UDP区别;
4.TCP3次握手4次挥手;11种状态,半连接状态;
5.TCP长连接和短链接;
6.TCP超时重传,慢启动;
7.TCP拥塞控制;
8.TCP滑动窗口;
9.UDP广播broadcast;
10.6个定时器;
11.keepalive保活机制,心跳包;
 
网络协议报文头格式:
1.以太网帧头部;
2.IP报文头部;
3.UDP/TCP报文头部;
4.http 请求头数据报文格式;
5.DNS请求格式;
 
应用层协议设计应注意:
1.TCP传输层协议时,注意避免粘包;
2.UDP传输层协议时,注意避免丢包乱序;
 
              
 
下面我通过命令来模拟访问百度主页socket建立的过程:
 
1. 输入命令:exec 8<> /dev/tcp/www.baodu.com/80   来建立一个TCP连接;
 
2.输入命令:echo -e "GET / HTTP/1.0\n" 1>& 8    在tcp连接socket的基础上发送http协议request请求报文;
 
3.服务器返回TCP连接上的socketfd,返回http协议response响应报文到文件描述符8,其实8就是一个socketfd; 我们通过输入命令:cat <& 8  来读取返回的文本内容。
 
>cd /proc/$$/fd 
>ll
lrwx------ 1 root root 64 Aug  2 12:30 0 -> /dev/pts/0     //标准输入
 
lrwx------ 1 root root 64 Aug  2 12:30 1 -> /dev/pts/0     //标准输出
 
lrwx------ 1 root root 64 Aug  2 12:30 2 -> /dev/pts/0     //error
 
lrwx------ 1 root root 64 Aug  2 12:30 255 -> /dev/pts/0
 
lrwx------ 1 root root 64 Aug  2 12:30 8 -> socket:[17307]
 
lrwx------ 1 root root 64 Aug  2 12:30 9 -> socket:[17321]
 
>lsof -p $$
bash    1033 root    8u  IPv4  17307      0t0    TCP 192.168.1.104:37612->115.29.223.128:http (CLOSE_WAIT)
 
bash    1033 root    9u  IPv4  17321      0t0    TCP 192.168.1.104:37614->115.29.223.128:http (CLOSE_WAIT)
从以上记录我们可以看出有操作系统内核完成的socket的建立.
 
TCP连接的建立:
面向连接,建立的连接不是物理的,也就是TCP三次握手。
服务器端处于listen监听状态,客户端要想和服务器建立连接,首先要发送一个数据包,这个握手的控制数据包由传输控制层产生的,服务器端收到握手包会返回一个syn+ack包,客户端再回复一个ack包,这三个由通信两端内核里的传输控制层产生的数据包被称为三次握手,与应用软件无关。三次握手可以让通信双方都确认自己是通的,然后双方的操作系统内核为各自应用程序开辟资源。在这里是物理实际存在的,连接是没有通道的。
连接:三次握手之后双方内存里开辟资源开始为应用程序提供服务,这时就有上面的连接了。
 
可靠传输层协议;
由于TCP协议的确认机制
 
socket: sip:sport+dip:dport+protocol   sockfd可读可写事件,
TCP建立连接最多可建立1023个HTTP连接,因为端口号范围的限制1023(系统默认限制,可配置),如何突破打开文件描述符1023的限制,参考ractor单机搭建百万并发一文
 
                                        
 
TCP连接的断开,四次挥手:实质是系统资源的释放
长连接和短连接:采用长连接是为了减少服务器半连接状态的连接,释放系统资源;
 
                             
 
 
                                    
 
 

 

posted @ 2020-08-05 20:52  will287248100  阅读(647)  评论(0编辑  收藏  举报