您好,欢迎来到12图资源库!分享精神,快乐你我!我们只是素材的搬运工!!
  • 首 页
  • 当前位置:首页 > 开发 > WEB开发 >
    从零构建TCP/IP协议(3)
    时间:2017-08-16 12:49 来源:网络整理 作者:网络 浏览:收藏 挑错 推荐 打印

    还有一个细节成绩,不知道大家发现了么,刚才我们说过,MAC地址是相邻两个节点 通讯誉的,外面有来源地址和目的地址,假设我们向下面这样传输的话,每个节点都 只是把外面的信息传过去,但是来源地址却改要改写成本人的MAC地址,要不然的话, B就不知道信息是A发来的还是C发来的呀,对不对?那成绩就来了,E要怎样知道信息 其实是从A发过去的呢?

    没办法了,我们只好在传输的信息里把真正的来源地址写出来,所以我们又定了一个 协议,我们管它叫做ip:

    MAC携带的信息的末尾,是来源的ip地址,32个bit表示

    然后是目的的ip地址,32个bit表示

    然后是我要带的信息

    那和下面的数据链路层的协议合一下起来,假定来源地址是 192.168.1.1 ,目的地址是 192.168.1.2 ,发送的信息还是 "hello",整个包就像这样:

    111(末尾) 

    00000000 11001000(长度) 

    01110010 01101111 01110101 01110100 01100101 01110010(来源MAC地址) 

    01110000 01101000 01101111 01101110 01100101 01110010(目的MAC地址) 

    11000000 10101000 00000001 00000001(来源ip地址) 

    11000000 10101000 00000001 00000010(目的ip地址) 

    01101000 01100101 01101100 01101100 01101111(字符串"hello"

    000(完毕) 

    这样是不是就很迷信?那必须的。哎呀,终于可以跨节点发送音讯了,小开心~

    可是还是有成绩,假设我想确定A发的信息一定送达了E怎样办?怎样提供牢靠性?IP这一层 并不提供牢靠性,只是说尽量送达。看来有必要再来一层!

    传输层

    我们知道,一台计算机上能够有很多个顺序在运转,那怎样区分不同的顺序呢?所以我们 给顺序加上了id,叫做pid。那计算机网络通讯的时分怎样区分呢?又假定n个进程想和另外 一台机器上的某一个进程通讯呢?怎样办?

    不如我们再分配一个id吧,他们共同持有这个id就好了。我们把这个id叫做端口(port)。 这样子的话,经过ip地址我们可以确定计算机,经过端口我们可以确定一个或多个进程。

    我们继续造协议,不过这一次我们想要这个协议贼牢靠,所以要多做一些任务。其实要是 按照七层协议来完成的话,完全不必在这一层干这么多事情,不同的层干不同的事情嘛, 对不对。不过为了了解TCP协议,我们呀,也跟着来本人捏造一个协议,不如叫PCT好了。

    继续,我们要在ip带的信息里规则好我们这样发:

    首先是来源地址的端口号,8个bit来表示,由于ip外面曾经待了ip地址,我这里就不重复带了

    然后是目的地址的端口号,8个bit来表示

    这样,复杂的PCT协议就做好了。

    还有一个成绩,就是我们要保证收回去的信息是有序的,由于能够有的信息走光纤, 有的信息走Wi-Fi,他们传输速率不一样嘛。

    所以我们在协议里这样写:

    首先是来源地址的端口号,8个bit来表示,由于ip外面曾经待了ip地址,我这里就不重复带了

    然后是目的地址的端口号,8个bit来表示

    然后是这个包的序号,8个bit来表示

    但是我们说好了要把这个协议打形成一个牢靠的协议,可不能食言。我想想,怎样让他 牢靠呢,无非就是我发一个信息,你通知我你收到了,要是你不通知我,我就发到你通知我 为止。差不多就是这么个意思。但是呢,又不想结构多个不同的协议,你知道,编程的时分 要是写一堆的if-else树那可就很蛋疼了。再改改协议:

    首先是来源地址的端口号,8个bit来表示,由于ip外面曾经待了ip地址,我这里就不重复带了

    然后是目的地址的端口号,8个bit来表示

    然后是这个包的序号,8个bit来表示

    然后是想确认的包的序号,8个bit来表示

    咦,点睛之笔耶,这个确认的包的序号,由于我们是双向通讯,我发他信息的时分还可以特地 确认我收到了他的包啊,真是一箭双雕。

    TCP是一个面向流的协议,什么叫流?车流,水流,车流比较笼统。车和车之间是分开的, 但是速度一快起来,就可以把它们看成连起来的。TCP也是这样,单个包之间是分开的, 但是却可以看作是连起来,为什么呢?由于每个包里都带了ip地址和端口号,ip地址和端口 号一样的,就可以看作是连起来的 :)

    所以我们可以想象一下,我们的ip地址是 192.168.1.1 , 端口号是 1, 目的的ip地址是 192.168.1.2 , 端口号是 2。那我们发送这样的包:

    111(末尾) 

    00000000 11101000(长度) 

    01110010 01101111 01110101 01110100 01100101 01110010(来源MAC地址) 

    01110000 01101000 01101111 01101110 01100101 01110010(目的MAC地址) 

    11000000 10101000 00000001 00000001(来源ip地址) 

    11000000 10101000 00000001 00000010(目的ip地址) 

    00000001(来源的端口号) 

    00000010(目的的端口号) 

    00000001(发送的包的序号是1) 

    00000000(曾经确认的包的序号是0,表示啥都没有嘛) 

    01101000 01100101 01101100 01101100 01101111(字符串"hello"

    000(完毕) 

    duang,就这样,我们构建起了属于本人的牢靠的基于流的双工的协议 :)

    特地我们还完成了下面的TODO,经过序号我们就可以判别这个包是不是重复了,哈哈哈, 一箭n雕~

    TCP三次握手四次挥手滑动窗口拥塞控制等就不讲了,还是去看《TCP/IP协议详解卷一》吧 :)

    运用层

    这下我们终于可以担忧大胆的发送音讯了,PCT协议是个担任任的协议,假设能送到,他就一定 会送到,并且是有序的,要是网络坏掉了,真实连不上,他就会通知我网络连不上。

    这样子来编程方便多了呀。

    如今我想知道阅读器和效劳器是怎样通讯的。我们来看看百度。

    $ telnet  80 

    Trying 183.232.231.173... 

    Connected to  

    Escape character is '^]'

    GET / HTTP/1.1 

     

    HTTP/1.1 302 Moved Temporarily 

    Date: Sat, 12 Aug 2017 10:45:14 GMT 

    Content-Type: text/html 

    Content-Length: 215 

    Connection: Keep-Alive 

    Location:  

    Server: BWS/1.1 

    X-UA-Compatible: IE=Edge,chrome=1 

    BDPAGETYPE: 3 

    Set-Cookie: BDSVRTM=0; path=/ 

     

    <html> 

    <head><title>302 Found</title></head> 

    <body bgcolor="white"

    <center><h1>302 Found</h1></center> 

    <hr><center>pr-nginx_1-0-350_BRANCH Branch 

    Time : Tue Aug  8 20:41:04 CST 2017</center> 

    </body> 

    </html> 

    ^] 

    telnet>  

    Connection closed. 

    输入 GET / HTTP/1.1 之后回车,百度就给我前往了下面的一长串,然后阅读器再依据 前往的内容停止渲染,这又是一个大话题了,不讲了不讲了,收工 :)

    【编辑引荐】

    10个JavaScript难点

    从指向看JavaScript中的难点

    在Node.js中运用MySQL&MySQL JavaScript客户端

    JavaScript进阶之深化了解数据双向绑定

    测试JavaScript函数的功用

    (责任编辑:admin)