zoukankan      html  css  js  c++  java
  • tcp ip 草稿。

    查看了个http包后,重要数据画了个图。以便回忆。
     
     
     
    OSI模型有7层结构,每层都可以有几个子层。 OSI的7层从上到下分别是 7应用层6表示层5 会话层 4传输层3网络层2数据链路层1物理层

    应用层

    与其它计算机进行通讯的一个应用,它是对应应用程序的通信服务的。例如,一个没有通信功能的字处理程序就不能执行通信的代码,从事字处理工作的程序员也不关心OSI的第7层。但是,如果添加了一个传输文件的选项,那么字处理器的程序员就需要实现OSI的第7层。示例:telnet,HTTP,FTP,NFS,SMTP等。

    表示层

    这一层的主要功能是定义数据格式及加密。例如,FTP允许你选择以二进制或ASCII格式传输。如果选择二进制,那么发送方和接收方不改变文件的内容。如果选择ASCII格式,发送方将把文本从发送方的字符集转换成标准的ASCII后发送数据。在接收方将标准的ASCII转换成接收方计算机的字符集。示例:加密,ASCII等。

    会话层

    它定义了如何开始、控制和结束一个会话,包括对多个双向消息的控制和管理,以便在只完成连续消息的一部分时可以通知应用,从而使表示层看到的数据是连续的,在某些情况下,如果表示层收到了所有的数据,则用数据代表表示层。示例:RPC,SQL等。

    传输层

    这层的功能包括是否选择差错恢复协议还是无差错恢复协议,及在同一主机上对不同应用的数据流的输入进行复用,还包括对收到的顺序不对的数据包的重新排序功能。示例:TCP,UDP,SPX。

    网络层

    这层对端到端的包传输进行定义,它定义了能够标识所有结点的逻辑地址,还定义了路由实现的方式和学习的方式。为了适应最大传输单元长度小于包长度的传输介质,网络层还定义了如何将一个包分解成更小的包的分段方法。示例:IP,IPX等。

    数据链路层

    它定义了在单个链路上如何传输数据。这些协议与被讨论的各种介质有关。示例:ATM,FDDI等。
    数据链路层:是为了提供功能上和规程上的方法,以便建立、维护和释放网络实体间的数据链路 。
    物理链路(物理线路):是由传输介质与设备组成的。原始的物理传输线路是指没有采用高层差错控制的基本的物理传输介质与设备。
    数据链路(逻辑线路):在一条物理线路之上,通过一些规程或协议来控制这些数据的传输,以保证被传输数据的正确性。实现这些规程或协议的硬件和软件加到物理线路,这样就构成了数据链路。从数据发送点到数据接收点(点到点 point to point)所经过的传输途径。
    当采用复用技术时,一条物理链路上可以有多条数据链路。

    物理层

    OSI的物理层规范是有关传输介质的特性标准,这些规范通常也参考了其他组织制定的标准。连接头、帧、帧的使用、电流、编码及光调制等都属于各种物理层规范中的内容。物理层常用多个规范完成对所有细节的定义。示例:Rj45,802.3等。
     
     
     
     

     

    除下http。来分析下每个字节。

    Ethernet II, Src: Vmware_78:d3:e9 (00:0c:29:78:d3:e9), Dst: Vmware_ee:46:85 (00:50:56:ee:46:85)

    1)每个mac地址是6个字节。目的mac地址:00:50:56:ee:46:85,是。源mac地址:00:0c:29:78:d3:e9是。

    查看虚拟机的mac,正确。

     2)而目的mac是虚拟机的网关。

     3)后面是0800,是ip协议的代码。

    4)Internet Protocol, Src: 192.168.87.128 (192.168.87.128), Dst: 220.181.164.104 (220.181.164.104)

    1)4代表,是ipv4版本。

    2)5代表5字节。

    3)00代表:服务提供类型,第一个0:ecn-capable transport. 第二个0:ecn-ce。

    4)0395是长度。10进制就是917.

    5)3743,10进制是14147.是identifiation.

    6)Fragmentation Flags: 0x4和0x0, 二进制就是01000000.

    reserved bit:     0.

    don't fragment:1

    more fragments :00

    fragment offset:00

    7)0x80,代表 time to live 128.

    8)0x06,上层协议。 0x06是tcp编码。

    9)0x26d9 是hader checksum。

    10)c0 a8 57 80 是原ip。192.168.87.128. 查看确实是本机ip。

    11)dc b5a4 68 是目的ip。220.181.164.104.应该是baidu.comip。

    12)fdfc 是原端口号。

    13)0050是目的端口号。也就是80端口。

    14)b8 45 d1 0d. sequence num 1+ next sequence number 878.+ack number 1+ header length 0d

    15)4b7042aa

    16)header length 0x50. 20bytes.

    18)0x18 :psh,ack

    20)faf0,window size:64240

    21)check num:0xa8cf

    22)0000

    23)4745 54.后面就是http协议包和数据了。

    0x47 ,acsii玛就是 g 45,e。54 .t。就是request method:get。

    正确又简洁的图

    SYN:同步序列编号(Synchronize Sequence Numbers)。

    ACK:确认编号(Acknowledgement Number

    TCP使用三次握手建立一个连接:

    友好记忆:ssaa ,死杀啊

    在吗?     

                          在,在吗?       

    第一次握手:客户端发送SYN包至服务器,并进入SYN_SENT状态,等待服务器确认

    第二次握手:服务器收到客户端的SYN包,发送一个ACK,同时发送自己的SYN,此时服务器进入SYN_RCVD状态

    第三次握手:客户端接收到服务器发送的SYN+ACK后,进入ESTABLISHED状态,并发送服务器SYN包的确认ACK,服务器接收到客户端ACK后,进入ESTABLISHED状态

    当客户端和服务器都进入ESTABLISHED状态后,客户端和服务器之间就可以开始双向传递数据了

     友好记忆:fdafa:服大服啊

    女孩:我要睡了fin
                  男孩:我把剩下的故事讲完,data
                    这下真的讲完了。 ack

                  男孩:好吧我也睡觉了 fin.


    女孩:那88了 ack

    画外音:男孩听到女孩说88后,就睡着了。女孩等了几分钟,确定男孩已经睡熟了也睡了。

    中断连接端可以是Client端,也可以是Server端。

    假设Client端发起中断连接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以你先发送ACK,"告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息"。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文,"告诉Client端,好了,我这边数据发完了,准备好关闭连接了"。Client端收到FIN报文后,"就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。“,Server端收到ACK后,"就知道可以断开连接了"。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。Ok,TCP连接就这样关闭了!

    tcp 包的大小对传输影响确实很大。测试包自身数据为4字节的碎片包。如果一个一个发送。100000个的话,在epoll的局渔环境下。因为称为碎片包来回大概5秒。而如果组合成最小64字节,大概3秒。

    如果是1024,只有2秒。而2048,超过一个包,要分片的情况下要2秒还多点。比64还长点。

    假设服务器3000个连接。这样但就包传送,用最合适的1024~1500,就少了1秒。对于实时游戏差距还是很大的。


  • 相关阅读:
    自学Python5.2-类和对象概念
    自学Python5.1-面向对象与面向过程
    自学Python2.1-基本数据类型-字符串str(object) 上
    自学Python2.10-跳出循环(break、continue)
    自学Python2.9-循环(while、for)
    自学Python2.8-条件(if、if...else)
    自学Python1.8-python input/print用法 格式化输出
    自学Python1.6-Centos内英文语法切换
    自学Python1.7-python变量以及类型
    自学Python1.5-Centos内python2识别中文
  • 原文地址:https://www.cnblogs.com/lsfv/p/6339312.html
Copyright © 2011-2022 走看看