zoukankan      html  css  js  c++  java
  • Socket编程实践(1) --TCP/IP简述

    ISO的OSI

        OSI(open system interconnection)开放系统互联模型是由ISO国际标准化组织定义的网络分层模型,共七层, 从下往上为:


    OSI七层参考模型

    物理层(Physical Layer)

    物理层定义了所有电子及物理设备的规范,为上层的传输提供了一个物理介质,本层中数据传输的单位为比特(bit/二进制位)。属于本层定义的规范有EIA/TIA RS-232、RJ-45等,实际使用中的设备如网卡属于本层。

    数据链路层(Data Link Layer)

    对物理层收到的比特流进行数据成帧。提供可靠的数据传输服务,实现无差错数据传输。在数据链路层中数据的单位为帧(frame)。属于本层定义的规范有HDLC、PPP、STP等,实际使用中的设备如switch交换机属于本层。

    网络层(Network Layer)

    网络层负责将各个子网之间的数据进行路由选择,分组与重组。本层中数据传输的单位为数据包(packet)。属于本层定义的规范有IP、RIP、OSPF、ICMP、IGMP等。实际使用中的设备如路由器属于本层。

    传输层(Transport Layer)

    提供可靠的数据传输服务(注意OSI的传输层与TCP/IP的传输层的功能不尽相同),它检测路由器丢弃的包,然后产生一个重传请求,能够将乱序收到的数据包重新排序。

    会话层(Session Layer)

    管理主机之间会话过程,包括会话建立、终止和会话过程中的管理

    表示层(Presentation Layer)

    表示层对网络传输的数据进行变换,使得多个主机之间传送的信息能够互相理解,包括数据的压缩、加密、格式转换等。

    应用层(Application Layer)

    应用层与应用程序界面沟通,以达至展示给用户的目的。 在此常见的协定有: HTTP,HTTPS,FTP,TELNET,SSH,SMTP,POP3等

     

    TCP/IP模型

     

    TCP/IP主要协议

     

     

    数据封装(Encapsulation)图解

     

     

    数据分用(Demultiplexing:解包)图解

     


    链路层

    以太网帧格式

     

    以太网帧说明:

        链路层的数据包,称为以太网帧; 链路层不识别IP地址[因为IP地址是逻辑地址],链路层识别物理网卡MAC地址[硬件地址]需要根据IP地址找到对方的MAC地址(ARP地址解析协议)[MAC —> IP地址方向地址解析];

    //以太网首部代码
    struct ethernet_hdr
    {
        char dest_mac[6];
        char src_mac[6];
        short protocol;
    };

    ARP地址解析协议

    //ARP首部代码
    struct arp_hdr
    {
        unsigned short hwtype;	// 固定1
        unsigned short protype;	// 固定0x0800(代表为IP协议做请求)
        unsigned char hwaddrlen;	// 固定6(即MAC地址长度)
        unsigned char proaddrlen;	// 固定4 (即IP地址长度)
        unsigned short opcode;	// Request - 1, Reply - 0x0002
        unsigned char sender_mac[6];	// 发送者MAC
        unsigned char sender_ip[4];	// 发送者IP
        unsigned char dest_mac[6];	// 接收者MAC
        unsigned char dest_ip[4];	// 接收者IP
    };

    网络层

    IP数据报

     

    各个字段说明

    版本

    IP协议版本号, IPv4此字段值为4, IPv6此字段值为6

    首部长度

    取值范围5(0101)~15(1111), 单位为4字节, 因此首部最长为60字节

    服务类型

    长度为8位。此字段包含3位的优先权(现已忽略),4位的服务类型子字段(只能有一位置1)和1位的保留位(必须置0)。4位的服务类型分别为最小延迟(D)、最大吞吐量(T)、最高可靠性(R)、最小费用(F), 详细解释见下图

    总长度

    该字段长度为16位, 以字节为单位, 该字段长度包含IP的头部和数据部分, IP数据报最大长度为65535字节

    标识

    16位长度, 唯一标识一个数据报,如果发送一个数据包, 则该值加1, 如果数据报分段,则每个分段的标识都一样, 各个分片共享一个标识号

    标志

    3位标志中第一位不使用, 第二位为DF(Don`t Fragment不分段)位, 如果该位为1, 并且传输的数据报超过最大传输单元(MTU), 则该数据报会被丢弃, 并发送一个ICMP差错报文; 第三位MF(More Fragment更多分段)位,表示是否有更多的分片, 如果该位为1, 则说明后续还有分片, 最后一片MF为0

    片偏移

    以8个字节为单位,指出该分段的第一个数据字在原始数据报中的偏移位置,IP分片后每一个分组都具有自己的首部, 而且标志位相同, 但是片偏移值不同, 通过片偏移值接收端可以重新组装IP包

    生存时间(TTL)

    表示数据报最多可经过的路由器点的数量. 取值0~255,每经过一个路由器, TTL值减1,为0时被丢弃, 并发送ICMP报文通知源主机, TTL可以避免数据报在路由器之间不断循环(Tranceroute程序的实现原理)

    协议类型

    指明IP层上承载的是哪个高级协议, 在封装与分用的过程中, 协议栈知道该交给哪个层的协议处理, 如1为ICMP, 2为IGMP, 6为TCP, 17为UDP等.

    头部校验和

    保证数据报头部的数据完整性,但校验不包括数据部分。这样做的目的有二:一是所有将数据封装在IP数据包中的高层协议均含有覆盖整个数据的校验和,因此IP数据报没有必要再对其所承载的数据部分进行校验。二是每经过一个路由器,IP数据报的头部要发生改变(如TTL),而数据部分不变,这样只对发生改变的头部进行校验,显然不会浪费太多的时间。为了减少计算时间,一般不用CRC校验码,而是采用更简单的网际校验和(Internet Checksum)。

    选项与填充

    (选项为4字节整数倍,否则用0填充)

    安全和处理限制

    路径记录:记录所经历路由器的IP地址

    时间戳:记录所经历路由器的IP地址和时间

    宽松源站路由:指定数据报文必须经历的IP地址,可以经过没有指定的IP地址。

    严格的源站路由:指定数据报文必须经历的IP地址,不能经过没有指定的IP地址。


    //IP首部代码
    struct ip_hdr
    {
        char  ver_hl;
        char  tos;
        unsigned short len;
        unsigned short id;
        unsigned short fragment;
        char ttl;
        char protocol;
        unsigned short hdr_chksum;
        char src_ip [4];
        char dest_ip [4];
    };


    路由过程

     

    ICMP协议

        ICMP协议用于传递差错信息、时间、回显、网络信息等控制数据

        当我们ping 一台主机想看它是否运行时,就产生了一条ICMP 信息。远程主机将用它自己的ICMP 信息对ping 请求作出回应。

     

    ICMP协议说明:

        ICMP数据包本身是IP的一部分,ICMP包含在IP数据包的净荷数据中,IP头中协议类型为1; 主要用于网关或者目标机器利用ICMP与源通讯,当出现问题时,提供反馈信息; ICMP数据的第一个字节代表ICMP报文的类型,它决定了后续数据的格式

     

    //ICMP首部代码
    struct icmp_hdr
    {
        char	type;			// ICMP报文类型
        char 	code;			// “子类型”
        unsigned short  icmpchksum;	// 校验和
    };

    UDP用户数据报

     

    //UDP首部代码
    struct udp_hdr
    {
        unsigned short src_port;
        unsigned short dest_port;
        unsigned short len;
        unsigned short chksum;
    };

    TCP报文段

     

    协议描述

    源端口号和目的端口号

    源和目的主机的IP地址加上端口号构成一个TCP连接

    序号和确认号

    序号为该TCP数据包的第一个字节在所发送的数据流中的偏移量;确认号为希望接收的下一个数据字的序号;

    数据偏移(首部长度)

    以4个字节为单位,通常为20个字节

    6个标志位:

     

        URG

    如果使用了紧急指针,URG置1,紧急指针为当前序号到紧急数据位置的偏移量

        ACK

    为1表示确认号有效,为0表示该TCP数据包不包含确认信息

        PSH

    表示是带有PUSH标志的数据,接收到数据后不必等缓冲区满再发送

        RST

    用于连接复位,也可用于拒绝非法的数据或拒绝连接请求

        SYN

    用于建立连接,连接请求时SYN=1,ACK=0;响应连接请求时SYN=1,ACK=1

        FIN

    用于释放连接,表示发送方已经没有供发送的数据

    窗口大小

    表示在确认字节后还可以发送字节数,用于流量控制

    校验和

    覆盖了整个数据包,包括对数据包的首部和数据

    选项

    常见的选项是MSS(Maximum Segment Size, 最大报文长度)

     

    连接建立三次握手

     

    连接终止四次挥手

     

    TCP如何保证可靠性

        应用数据被分割成TCP认为最适合发送的数据块,称为TCP报文段传递给IP层。

        当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。

        当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒。

        TCP将保持它首部和数据的校验和。这是一个端到端的校验和,目的是检测数据在传输过程中的任何变化。如果收到段的校验和有差错,TCP将丢弃这个报文段并且不确认(导致对方超时重传);

        TCP承载于IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。TCP将对收到的数据进行重新排序

        IP数据报会发生重复,TCP的接收端必须丢弃重复的数据。

        TCP还能提供流量控制。TCP连接的每一方都有一定大小的缓冲空间。

    端口分类

    众所周知端口:从0到1023

    这些端口由IANA分配和控制它们紧密绑定于一些服务。通常这些端口的通讯明确表明了某种服务的协议。例如:21为ftp服务端口

    注册端口:从1024到49151

    这些端口不受IANA控制,但由IANA登记并提供使用情况清单。它们松散地绑定于一些服务。也就是说有许多服务绑定于这些端口,这些端口同样可以用于许多其它目的。例如:1433 Microsoft SQL服务端口

    临时端口:从49152到65535

    IANA不管这些端口。实际上,机器通常从1024起分配动态端口(例外:SUN的RPC端口从32768开始)

     

    综合:数据在网络中传输过程

     

        步骤a:应用程序ping会判断发送的是主机名还是IP地址,调用函数gethostbyname()解析主机机B,将主机名转换成一个32位的IP地址。这个过程叫做DNS域名解析.

        步骤b:ping程序向目的IP地址发送一个ICMP的ECHO包

        步骤c:将目标主机的IP地址转换为48位硬件地址,在局域网内发送ARP请求广播,查找主机B的硬件地址。

        步骤d:主机B的ARP协议层接收到主机A的ARP请求后,将本机的硬件地址填充到应答包,发送ARP应答到主机A。

        步骤e:发送ICMP数据包到主机B

        步骤f:主机B接收到主机A的ICMP包,发送响应包。

        步骤g:主机A接收到主机B的ICMP包响应包。


    其他更详细的关于TCP/IP计算机网络知识请参考博客:

    http://blog.csdn.net/zjf280441589/article/category/1854365

  • 相关阅读:
    POJ 1703 Find them, Catch them
    POJ 2236 Wireless Network
    POJ 2010 Moo University
    POJ 2184 Cow Exhibition
    POJ 3280 Cheapest Palindrome
    POJ 3009 Curling 2.0
    POJ 3669 Meteor Shower
    POJ 2718 Smallest Difference
    POJ 3187 Backward Digit Sums
    POJ 3050 Hopscotch
  • 原文地址:https://www.cnblogs.com/itrena/p/5926941.html
Copyright © 2011-2022 走看看