zoukankan      html  css  js  c++  java
  • TCP/IP基础

    1)  IP:网络互联协议,是计算机网络互联通信而设计的协议;

    如图1.2.1:IPv4包头

     

    版本(version):标识了数据包的IP版本号,4位,IPv4(0100) IPv6(0110);

    报头长度(header length):4位,表示32位字长的IP报头长度;

    服务类型(type of service):用来指定特殊的数据处理方式,8位,在字段上被划分为两个子字段:优先权和ToS;优先权用来设置数据包的优先级,而ToS允许按照吞吐量、时延、可靠性等选择传输服务,ToS通常被置0;

    总长度(total length)数据包总长度字段的长度为16位,以八位组为单位计,其中包括IP包头。

    标识符(identifier):字段长度为16位,通常与标记字段和分段偏移字段一起用作数据包的分段。如果数据包的原始长度超过MTU,就必须将数据包分段为更小的数据包。

    标记字段(flag):长度为3位,其中第一位没有使用。第二位DF=1时,表示路由器不能对数据包进行分段处理。可以用于在网络上测试MTU值;

    分段偏移(fragment offset):字段为13位,以8个8位组为单位,用于指明分段起始点相对于报头起始点的偏移量;

    生存时间(time to live):字段长度为8位,被设定为某个特定值,当数据包沿逐个路由器传输时,每个路由器都会降低TTL的值,当TTL=0时,数据包将被路由器丢弃,并向源发送错误信息;

    报头校验和(header checksum):针对IP报头的纠错字段。不计算被封装的数据,UDP/TCP/ICMP等都有各自的校验和。如果没有错误,则16位应该都为1;

    源地址和目的地址:分别表征发送数据发收双方的源点和目的点的IP地址;

    可选项(option):是一个长度可选的字段,被添加在报头中包括源点产生的信息和其他路由器的信息,通常用于测试。

       

    2)  IPv4:IPv4地址长度为32位,包含4个字节,通常用点分十进制表示;

    组成:网络号+主机号

    如图1.2.2

     

    网络号:表示某个IP地址段,标识的是网络中的某个子网;可由IP地址和地址掩码做&计算得到

    主机号:表示网络中的某台主机;

    地址掩码:表示整个数据链路的地址,一般由IP地址的网络号部分全部置1,主机部分全部置0计算所得;

    子网:基于整个网络下分的subnet,通常是一个主A、B、C类地址的一个子集;通常可由IP地址&子网掩码计算得到;

    子网号:主机位全为0;

    广播地址:主机位全为1的地址;

    网络分类:按主机地址的数量网络通常被分为大型、中型、小型网络;相应的IP地址也被分为A、B、C类地址;

    如表1.2.3

    规则(第1个8位组)

    Max/min

    十进制

    掩码

    A类:第一位恒为0

    00000000=0

    01111111=127

    1~126,

    255.0.0.0

    B类:第一、二位恒为10

    10000000=128

    10111111=191

    128~191

    255.255.0.0

    C类:第一、二、三位恒为110

    11000000=192

    11011111=223

    192~223

    255.255.255.0

    注:127.0.0.0为设备使用回环地址段,发送到该地址的数据将会被直接发送回发送进程而不离开此设备;

    VLSM(可变长子网掩码):为了使用CIDR和通过route summary来控制路由表的大小,以最有效的方式使用地址空间,VLSM采取在A/B/C类地址的基础上从主机位中截取几位作为网络号,以增加网络号的方式;

    CIDR(无类域间路由)为解决IPv4地址耗尽的瓶颈采用的一种措施,路由策略完全基于整个32bit的IP地址来操作;

    例如:

    C类地址:192.168.1.0/24  255.255.255.0

    在C类的地址上我们采取从主机号中借去一位作为网络号

    主机:11000000.10101000.00000001.00000000  192.168.1.1-254/24

    Mask: 11111111.11111111.11111111.00000000   255.255.255.0

    借出一位作为网络号后:

    主机:11000000.10101000.00000001.00000000  192.168.1.1-126/25

    Mask:11111111.11111111.11111111.10000000  255.255.255.128

    主机:11000000.10101000.00000001.10000000  192.168.1.129-254/25

    Mask:11111111.11111111.11111111.10000000  255.255.255.128

    ARP(地址解析协议): 是根据主机IP地址获取MAC地址的一个协议;

    MAC(媒体控制控制)设备物理地址,用来确定网络中设备的位置;

    APR的工作过程:

    主机A的IP地址为192.168.1.1,MAC地址为0A-11-22-33-44-01;

    主机B的IP地址为192.168.1.2,MAC地址为0A-11-22-33-44-02;

    当主机A要与主机B通信时,地址解析协议可以将主机B的IP地址(192.168.1.2)解析成主机B的MAC地址,以下为工作流程:

    第1步:根据主机A上的路由表内容,IP确定用于访问主机B的转发IP地址是192.168.1.2。然后A主机在自己的本地ARP缓存中检查主机B的匹配MAC地址。

    第2步:如果主机A在ARP缓存中没有找到映射,它将询问192.168.1.2的硬件地址,从而将ARP请求帧广播到本地网络上的所有主机。源主机A的IP地址和MAC地址都包括在ARP请求中。本地网络上的每台主机都接收到ARP请求并且检查是否与自己的IP地址匹配。如果主机发现请求的IP地址与自己的IP地址不匹配,它将丢弃ARP请求。

    第3步:主机B确定ARP请求中的IP地址与自己的IP地址匹配,则将主机A的IP地址和MAC地址映射添加到本地ARP缓存中。

    第4步:主机B将包含其MAC地址的ARP回复消息直接发送回主机A。

    第5步:当主机A收到从主机B发来的ARP回复消息时,会用主机B的IP和MAC地址映射更新ARP缓存。本机缓存是有生存期的,生存期结束后,将再次重复上面的过程。主机B的MAC地址一旦确定,主机A就能向主机B发送IP通信了。

    如图1.2.4:ARP报文格式

    ARP报文格式

    硬件类型  

    协议类型

    硬件地址长度  

    协议长度

    操作类型

    发送方硬件地址(0-3字节)

    发送方硬件地址(4-5字节)

    发送方IP地址(0-1字节)  

    发送方IP地址(2-3字节)

    目标硬件地址(0-1字节)

    目标硬件地址(2-5字节)

    目标IP地址(0-3字节)

         

    硬件类型:指明了发送方想知道的硬件接口类型,以太网的值为1;

    协议类型:指明了发送方提供的高层协议类型,IP为0800(16进制);

    硬件地址长度和协议长度:指明了硬件地址和高层协议地址的长度,这样ARP报文就可以在任意硬件和任意协议的网络中使用;

    操作类型:用来表示这个报文的类型,ARP请求为1,ARP响应为2,RARP请求为3,RARP响应为4;

    发送方硬件地址(0-3字节):源主机硬件地址的前3个字节;

    发送方硬件地址(4-5字节):源主机硬件地址的后3个字节;

    发送方IP地址(0-1字节):源主机硬件地址的前2个字节;

    发送方IP地址(2-3字节):源主机硬件地址的后2个字节;

    目标硬件地址(0-1字节):目的主机硬件地址的前2个字节;

    目标硬件地址(2-5字节):目的主机硬件地址的后4个字节;

    目标IP地址(0-3字节):目的主机的IP地址。

    TCP协议(传输控制协议):TCP提供一种面向连接的、可靠的字节流服务;

    TCP是面向连接的,故TCP的连接的双方在彼此交换数据前必须先建立一个TCP连接。

    TCP通过以下的方式来提供可靠性:

    • 应用数据在连接中被分割成TCP认为最适合发送的数据块,TCP传递给IP的信息单位称为报文段或段(segment);
    • 当TCP发出一个segment后,它启动一个定时器,等待目的端确认收到这个报文段,如果不能及时收到一个确认,将重发这个报文段;
    • 当TCP收到对端的数据时,将发送一个确认,通常推迟几分之一秒发送,而不是立即发送确认;
    • TCP将保持它首部和数据的校验和,这是一个端到端的校验和,目的是检测数据在传输过程中的任何变化,如果校验和有差错,那么TCP将丢弃这个报文段和不确认收到此segment(希望发端超时并重发);
    • Segment作为IP数据报来传输,而IP数据报的到达可能会失序,故segment的到达也可能会失序。如有必要,TCP将对收到的数据进行重新排序,把数据以正确的顺序交给应用层;
    • TCP接收端对于重复的数据将会丢弃;
    • TCP连接的每一方都有固定的缓存空间,TCP的接收端只允许对端发送接收端缓冲区所能接纳的数据,用以防止较快主机致使较慢主机的缓冲区溢出;以此提供TCP流量控制;

    TCP的首部:

    如图1.2.5:IP数据报中的TCP数据封装

     

    如图1.2.6:TCP首部的数据格式

     

    源端口(Source Port),目标端口(Destination Port :各2字节

    源端口号,标识主机上发起传送的应用程序;目的端口标识主机上传送要到达的应用程序。源端和目的端的端口号,用于寻找发端和收端应用进程。这两个值加上I P首部中的源端I P地址和目的端I P地址唯一确定一个TCP连接。一个I P地址和一个端口号有时也称为一个插口(socket),插口对(socket pair)(包含客户I P地址、客户端口号、服务器 I P地址和服务器端口号的四元组 )可唯一确定互联网络中每个TCP连接的双方。IP+TCP端口唯一确定一个TCP连接。

    TCP协议通过使用"端口"来标识源端和目标端的应用进程。 端口号可以使用0到65535之间的任何数字。在收到服务请求时,操作系统动态地为客户端的应用程序分配端口号。在服务器端,每种服务在"众所周知的端 口"(Well-Know Port)为用户提供服务。

    封包序号(Sequence Number: 4字节

    由于 TCP 封包必须要带入 IP 封包当中,所以如果 TCP 数据太大时(大于 IP 封包的容许程度), 就得要进行分段。这个 Sequence Number 就是记录每个封包的序号,可以让收受端重新将 TCP 的数据组合起来。

    序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。

    确认号(Acknowledge Number): 4字节

    为了确认主机端确实有收到我们 client 端所送出的封包数据,我们 client 端当然希望能够收到主机方面的响应,那就是这个 Acknowledge Number 的用途了。 当 client 端收到这个确认码时,就能够确定之前传递的封包已经被正确的收下了。这个号是期望收到对方的下一个报文段的数据的第一个字节的序号。

    数据偏移(Data Offset:4比特

    和IP数据包头部一样,也有个Options字段,长度是不固定的,而为了要确认整个TCP封包大小,就需要这个标志来说明整个封包区段的起始位置。

    这个字段指出TCP报文段的数据起始处距离 TCP报文段的起始处有多远。“数据偏移”的单位不是字节而是32bit字(4字节为计算单位)。

    没有任何选项字段的TCP头部长度为20字节;最多可以有60字节的TCP头部。

    保留字段(Reserved: 占6比特

    保留为今后使用,但目前应置为0。 

    状态控制码(Code,Control Flag

    标志位字段(U、A、P、R、S、F):占6比特。各 比特的含义如下:

    URG:紧急比特(urgent),当URG=1时,表明紧急指针字段有效,代表该封包为紧急封包。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据), 且上图中的 Urgent Pointer 字段也会被启用。

    ACK:确认比特(Acknowledge)。只有当ACK=1时确认号字段才有效,代表这个封包为确认封包。当ACK=0时,确认号无效。

    PSH:(Push function)若为1时,代表要求对方立即传送缓冲区内的其他对应封包,而无需等缓冲满了才送。

    RST:复位比特(Reset) ,当RST=1时,表明TCP连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。

    SYN:同步比特(Synchronous),SYN置为1,就表示这是一个连接请求或连接接受报文,通常带有 SYN 标志的封包表示『主动』要连接到对方的意思。。

    FIN:终止比特(Final),用来释放一个连接。当FIN=1时,表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。

    滑动窗口(Window: 占2字节

    窗口字段用来控制对方发送的数据量,可以告知对方目前本身有的缓冲器容量(Receive Buffer) 还可以接收封包。当 Window=0 时,代表缓冲器已经额满,所以应该要暂停传输数据。单位为字节。TCP连接的一端根据设置的缓存空间大小确定自己的接收窗口大小,然后通知对方以确定对方的发送窗口的上限,这个值是本机期望一次接收的字节数。

    TCP校验和(Checksum) : 占2字节

    当数据要由发送端送出前,会进行一个检验的动作,并将该动作的检验值标注在这个字段上; 而接收者收到这个封包之后,会再次的对封包进行验证,并且比对原发送的 Checksum 值是否相符,如果相符就接受,若不符就会假设该封包已经损毁,进而要求对方重新发送此封包!在计算检验和时,要在TCP报文段的前面加上12字节的伪首部。

    紧急指针(Urgent Pointer)  :占2字节

    这个字段是在 Code 字段内的 URG = 1 时才会产生作用。可以告知紧急数据所在的位置(紧急指针指出在本报文段中的紧急数据的最后一个字节的序号)。

    选项(Options :长度可变。

    TCP首部可以有多达40字节的可选信息,用于把附加信息传递给终点,或用来对齐其它选项。

    目前此字段仅应用于表示接收端可以接收的最大数据区段容量,若此字段不使用, 表示可以使用任意数据区段的大小。 这个字段较少使用。

    TCP首部的主要选项:

    最大报文段长度MSS(Maximum Segment Size)是TCP报文段中的数据字段的最大长度。MSS告诉对方TCP:“我的缓存所能接收的报文段的数据字段的最大长度是MSS个字节。”

    填充字段(Padding)

    如同 IP 封包需要有固定的 32bits 表头一样, Options 由于字段为非固定, 所以也需要 Padding 字段来加以补齐才行。同样也是 32 bits 的整数。这是为了使整个首部长度是4字节的整数倍。

    TCP连接的建立和终止过程

    建立一个TCP连接需要三次握手,而终止一个链接需要经过4次握手,这由TCP的半关闭(half-close)造成的。TCP连接是全双工的(即数据在两个方向上能同时传递),故每个方向上必须单独进行关闭。当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接,当一端收到一个FIN,它必须通知应用层另一端已经终止那个方向的数据发送。而发生FIN通常是应用层进行关闭的结果。

    如图1.2.7:

     

    连接建立三次握手:

    • 当一端发送SYN请求建立TCP连接时,发送端执行active open,另一端执行passive open,发送端为连接选择一个初始序号(ISN),ISN随时间而发生变化,故每个连接都将具有不同的ISN;
    • 服务器发回包含本服务器初始序号的SYN报文段作为应答,同时将确认序号设置为client的ISN加1作为对发送端client的SYN的确认;
    • 发送端必须发送server服务器端的ISN序号加1作为端服务器SYN报文段的确认;

    连接终止4次握手:

      • 首先执行关闭的一端(一般是client)将执行主动关闭(active close),而另一方(一般是server)将执行被动关闭(passive close);active close端发送第一个FIN;
      • 当server收到这个FIN后,返回给客户端一个ack,用来确认收到关闭请求,确认序号为收到的序号加1;同时向server的应用程序传送一个文件结束符;
      • 接收到结束符后,应用程序会关闭它的连接,同时向client发回一个FIN,表示关闭server到client的连接,client将回复一个收到确认,ack ,确认序号为收到序号加1;
      • 连接通常是由客户端发起的,第一个SYN由客户端传到服务器端。每一端都能主动发送FIN关闭这个连接,但是一般由客户端决定何时终止连接,因为客户进程通常由用户交互控制,用户会键入类似“quit”的命令来终止进程;
    这个神经病来自七院,又哭又笑的像一只老鬼
  • 相关阅读:
    linux系统编程综合练习-实现一个小型的shell程序(二)
    linux系统编程综合练习-实现一个小型的shell程序(一)
    Makefile学习二
    Makefile学习一
    jquery遍历:数组、对象、json
    ThinkPHP中:使用递归写node_merge()函数
    ThinkPHP中:多个项目共享同一个session问题
    多域名THINKPHP利用MEMCACHE方式共享SESSION数据
    ThinkPHP中:用户登录权限验证类
    ThinkPHP中:检查Session是否过期
  • 原文地址:https://www.cnblogs.com/commanderzhu/p/4821556.html
Copyright © 2011-2022 走看看