Fork me on GitHub
随笔 - 215  文章 - 13  trackbacks - 0
<2017年2月>
2930311234
567891011
12131415161718
19202122232425
2627281234
567891011


专注即时通讯及网游服务端编程
------------------------------------
Openresty 官方模块
Openresty 标准模块(Opm)
Openresty 三方模块
------------------------------------
本博收藏大部分文章为转载,并在文章开头给出了原文出处,如有再转,敬请保留相关信息,这是大家对原创作者劳动成果的自觉尊重!!如为您带来不便,请于本博下留言,谢谢配合。

常用链接

留言簿(1)

随笔分类

随笔档案

相册

Awesome

Blog

Book

GitHub

Link

搜索

  •  

积分与排名

  • 积分 - 210445
  • 排名 - 118

最新评论

阅读排行榜

http://blog.csdn.net/galdys/article/details/6620620
TCP/IP的通讯协议 

这部分简要介绍一下TCP/IP的内部结构,为讨论与互联网有关的安全问题打下基础。TCP/IP协议组之所以流行,部分原因是因为它可以用在各种各样的信道和底层协议(例如T1和X.25、以太网以及RS-232串行接口)之上。确切地说,TCP/IP协议是一组包括TCP协议和IP协议,UDP(User Datagram Protocol)协议、ICMP(Internet Control Message Protocol)协议和其他一些协议的协议组。 

TCP/IP整体构架概述 

TCP/IP协议并不完全符合OSI的七层参考模型。传统的开放式系统互连参考模型,是一种通信协议的7层抽象的参考模型,其中每一层执行某一特定任务。该模型的目的是使各种硬件在相同的层次上相互通信。这7层是:物理层、数据链路层、网路层、传输层、话路层、表示层和应用层。而TCP/IP通讯协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。这4层分别为: 

应用层:应用程序间沟通的层,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。 

传输层:在此层中,它提供了节点间的数据传送服务,如传输控制协议(TCP)、用户数据报协议(UDP)等,TCP和UDP给数据包加入传输数据并把它传输到下一层中,这一层负责传送数据,并且确定数据已被送达并接收。 

互连网络层:负责提供基本的数据封包传送功能,让每一块数据包都能够到达目的主机(但不检查是否被正确接收),如网际协议(IP)。 

网络接口层:对实际的网络媒体的管理,定义如何使用实际网络(如Ethernet、Serial Line等)来传送数据。 

TCP/IP中的协议 

以下简单介绍TCP/IP中的协议都具备什么样的功能,都是如何工作的: 

1. IP 

网际协议IP是TCP/IP的心脏,也是网络层中最重要的协议。 

IP层接收由更低层(网络接口层例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层---TCP或UDP层;相反,IP层也把从TCP或UDP层接收来的数据包传送到更低层。IP数据包是不可靠的,因为IP并没有做任何事情来确认数据包是按顺序发送的或者没有被破坏。IP数据包中含有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址)。 

高层的TCP和UDP服务在接收数据包时,通常假设包中的源地址是有效的。也可以这样说,IP地址形成了许多服务的认证基础,这些服务相信数据包是从一个有效的主机发送来的。IP确认包含一个选项,叫作IP source routing,可以用来指定一条源地址和目的地址之间的直接路径。对于一些TCP和UDP的服务来说,使用了该选项的IP包好象是从路径上的最后一个系统传递过来的,而不是来自于它的真实地点。这个选项是为了测试而存在的,说明了它可以被用来欺骗系统来进行平常是被禁止的连接。那么,许多依靠IP源地址做确认的服务将产生问题并且会被非法入侵。 

2. TCP 

如果IP数据包中有已经封好的TCP数据包,那么IP将把它们向‘上’传送到TCP层。TCP将包排序并进行错误检查,同时实现虚电路间的连接。TCP数据包中包括序号和确认,所以未按照顺序收到的包可以被排序,而损坏的包可以被重传。 

TCP将它的信息送到更高层的应用程序,例如Telnet的服务程序和客户程序。应用程序轮流将信息送回TCP层,TCP层便将它们向下传送到IP层,设备驱动程序和物理介质,最后到接收方。 

面向连接的服务(例如Telnet、FTP、rlogin、X Windows和SMTP)需要高度的可靠性,所以它们使用了TCP。DNS在某些情况下使用TCP(发送和接收域名数据库),但使用UDP传送有关单个主机的信息。 

3.UDP 

UDP与TCP位于同一层,但对于数据包的顺序错误或重发。因此,UDP不被应用于那些使用虚电路的面向连接的服务,UDP主要用于那些面向查询---应答的服务,例如NFS。相对于FTP或Telnet,这些服务需要交换的信息量较小。使用UDP的服务包括NTP(网落时间协议)和DNS(DNS也使用TCP)。 

欺骗UDP包比欺骗TCP包更容易,因为UDP没有建立初始化连接(也可以称为握手)(因为在两个系统间没有虚电路),也就是说,与UDP相关的服务面临着更大的危险。 

4.ICMP 

ICMP与IP位于同一层,它被用来传送IP的的控制信息。它主要是用来提供有关通向目的地址的路径信息。ICMP的‘Redirect’信息通知主机通向其他系统的更准确的路径,而‘Unreachable’信息则指出路径有问题。另外,如果路径不可用了,ICMP可以使TCP连接‘体面地’终止。PING是最常用的基于ICMP的服务。 

5. TCP和UDP的端口结构 

TCP和UDP服务通常有一个客户/服务器的关系,例如,一个Telnet服务进程开始在系统上处于空闲状态,等待着连接。用户使用Telnet客户程序与服务进程建立一个连接。客户程序向服务进程写入信息,服务进程读出信息并发出响应,客户程序读出响应并向用户报告。因而,这个连接是双工的,可以用来进行读写。 

两个系统间的多重Telnet连接是如何相互确认并协调一致呢?TCP或UDP连接唯一地使用每个信息中的如下四项进行确认: 

源IP地址 发送包的IP地址。 

目的IP地址 接收包的IP地址。 

源端口 源系统上的连接的端口。 

目的端口 目的系统上的连接的端口。 

端口是一个软件结构,被客户程序或服务进程用来发送和接收信息。一个端口对应一个16比特的数。服务进程通常使用一个固定的端口,例如,SMTP使用25、Xwindows使用6000。这些端口号是‘广为人知’的,因为在建立与特定的主机或服务的连接时,需要这些地址和目的地址进行通讯。


http://blog.sina.com.cn/s/blog_60e96a410100mz6o.html
    在掌握计算机网络时,学的时候应该从最底层开始结束于应用层,但等学完之后,融会贯通的时候,应该从最高层向最底层开始
    1 现代计算机网络中,都采用存储转发分组交换技术,分组交换又采用数据报和虚电路两种形式,实际上数据报方式就是我们通常所说的面向无连接的,也就是UDP方式,而虚电路实际上就是我们通常所说的面向连接的,也就是TCP采用的方式
    采用存储转发的优点
  1. 通信子网中的路由器可以存储报文,所以多个报文可以共享通信信道,线路的利用率高。
  2. 路由器具有路由选择功能,可以动态选择报文通过通信子网的最佳路径。
    采用分组的优点
  1.     由于分组的长度比较短,在传输出错时发现错误容易,并且重发需要花费的时间少,这样就有利于提高存储转发节点的存储空间利用率与传输效率。
  •     数据报方式特点是,每个分组可能经过的路由不一样,而且到达目的节点的次序也不一定,而且每个 分组都必须带有目的地址和源地址信息。
  •     虚电路方式特点是,每个分组经过相同的路由,而且不加任何目的地址和源地址的信息,到达目的节点时是有序到达
    2.无论TCP还是UDP传递给网络层的时候都要进行分组。
    3.ICMP协议时网络层非常重要的一个协议。它负责网络层的差错和控制,
      ICMP的差错控制功能表现如下:
  •    目的站不可达,当路由器不能为数据包找到路由器或者主机交付时,就丢弃该数据报,然后该路由器会向源主机发出ICMP差错报告报文。
  1. 不能交付数据报,有可能是,目的主机没有开机或者机器故障,
  2. 或者是目的主机号不存在,
  3. 还有可能是路由器找不到去往目的主机的路径。 
  4. 路由器知道目的网络存在,但是无法到达。
  5. 如果找到了目的网络和目的主机,但是到达目的主机后发现自己IP数据报携带的是TCP协议而对方采用的UDP协议。
  6. 如果目的网络,目的主机,协议,都相同,但是目的主机的端口号不对。
  •    源站抑制,每个发送端都向路由器和目的节点发送数据分组,这样导致路由器和目的节点缓冲区队列溢出,或者路由器和目的节点的处理速度远远小于源节点的发送速度。这样路由器和目的节点就会丢弃数据报,而且给源节点发送ICMP数据。
  •    超时,路由表出现问题,整个网络的转发会出现错误,极端的情况是造成数据包在某些路由器之间循环,使得数据包在网络中无休止的传输。为了对付这些问题,IP协议会在数据包头中设置生存时间(TTL),二是设置定时时间,只对这两种情况ICMP这是了超时报文。针对第一种情况,当路由器转发数据报时,讲TTL-1后等于0时,就丢掉数据报,而且向源主机发送超时报文。第二种情况,当组成一个数据报的所有分组未能在某一限定时间内到达目的主机,目的主机就不能将接受的分片重新组装成数据报,而一个数据的部分分片将长期占用主机的缓冲区,如果多个数据包都出现这种情况,就会造成目的主机既不能接受新的数据报,又已接受的数据分片不能组装成数据报而出现死锁。因此当某一个数据包的第一个数据分片到达时,目的主机就启动计时器,当计时器时间到了,目的主机还没有接收到一个数据包的所有分片,他会将接受的分片丢弃,并向源主机发送超时报文
  • 改变路由,发送数据包的源主机和路由器都有一张路由表。主机的路由表采用静态的,主机通过ICMP获得正确的路由信息(例如A向B通信,正确的是路由器2但却发给了路由器1,路由器1知道正确的路由应当是路由器2,于是路由器1将正确的路信息),当网络的拓扑结构发生变化时,各个路由器间通过ICMP交换动态路由信息。
  1. 传输层中的两个重要协议TCP和UDP
  • QoS,服务质量,衡量传输层QoS的参数有:(1)建立连接的延迟(2)建立连接失败的概率(3)吞吐率(吞吐率是指每秒钟传输的用户数据的字节数,他是在某个时间间隔内测量的到的数据)(4)传输延迟(5)恢复功能
  • UDP,UDP采用面向无连接的,并且只提供有限的差错控制,因此协议简单,在一些特定的应用中协议运行效率高。如:IP电话,视频会议,FTP,DNS,SNMP,他们要求源主机以恒定的速度发送数据,而且在网络出现拥塞时,可以丢弃一些数据,但是希望延迟不大。
  • TCP,TCP,采用面向连接的,高可靠,全双工(因此释放链接的时候,要四次挥手),提供流量控制与拥塞控制。
  1. 窗口(用来实现流量控制),大小可变的窗口是TCP协议进行流量与拥塞控制的重要方法,当一个传输链接建立时,连接的每段都要分配一块缓冲区来存储接收到的数据,并将缓冲区的大小发送给另外一段,窗口大小的单位是BYTE(这样编程起来是很方便的),发送窗口在连接建立时由双方商定,TCP报文头部的窗口域写入的数值就是当前双方设置的窗口数值,但是在通信的过程中,接受端可以根据自己的资源情况,随时动态调整对方发送窗口的增大或减小,这种有接收端控制发送端的做法在网络经常使用,当数据到达时,接收端发送确认,其中包括自己剩余的缓冲区大小,接收端发送的每个确认都包含一个窗口通告。实现流量控制并非仅仅为了使接收端来的及接受,如果发送端发出的报文过多,会使网络通信负荷过重,由此引起报文段的延时增大,报文延时增大,将使主机不能及时的收到确认,就会重传更多的报文,而这又会进一步加剧网络的拥塞,为了避免发生拥塞,主机应当降低发送速率。因此发送端的主机在发送数据时,既要考虑到接收端的接收能力,又要使网络不要发生拥塞。通知窗口由接收端根据其接受能力确定的窗口值,是来自接收端的流量控制,拥塞窗口是发送端根据网络拥塞情况确定的窗口值,它由发送端的流量控制算法决定(如果发送端在重传计时器到期前,没有收到对报文段的确认,就可以认为出现拥塞)。在没有发生拥塞的稳定工作状态下,接收端的通知窗口和发送方的拥塞窗口应该保持一致。如果网络中出现传输错误,报文丢失的可能性比传输过程中误码的可能性大(目前的通信信道质量已经明显改善,由于通信线路带来的的误码,而造成分组丢失的概率很低)。  
  2. TCP差错控制,
    • 传输出错报文段(TCP通过报头的检验和来判断是否发生传输错误,传输错误也叫受损报文段,TCP接受端采用丢弃不给予确认的机制),
    • 丢失的报文段(被中间某一个节点丢失的),
    • 重复报文段(TCP接收端将重复的分组丢弃一个即可),
    • 确认丢失(TCP发送端发了3个报文段,TCP接受方成功接收后,发送确认,发送确认报文1,2,3,但是确认报文2没有收到,但是确认报文段3收到了,发送发TCP就忽略没有收到确认报文2,后面的收到了前面的你肯定也受到了)。由于TCP采用全双工通信,也就是说发送方给接收方发送数据的同时,接收方也可能给发送方发送数据,但是无论谁给谁发,都要有确认信息。TCP采用捎带技术发送确认信息,就是说,接收方成功接受数据后,这时候接收方也有数据发给发送方,那么接收方就把确认信息附加在发送给发送方的数据里面。
  3. TCP计时器,
    • 重传计时器(由于全双工,收发双发都有计时器),
    • 坚持计时器(当接收端的处理速度小于发送端的发送速率时,接收端TCP发送一个0窗口,于是发送端TCP就停止发送,等待一个非0窗口的到来,但是接受方TCP发送一个非0窗口确认,然而这个确认丢失。接收端TCP发送完确认数据报后,就等待发送端发送数据,但是他不知道确认数据报已经丢失了。发送端TCP由于没有收到确认,就等待接收方发送确认来通知窗口大小,这样双方TCP处于死锁。为了避免出现死锁,TCP为每个连接使用一个坚持计时器,当发送端收到一个窗口大小为0的确认时,就需要启动坚持计时器。当时间到,发送端的TCP就发送一个特殊的探测报文,该报文只有1B大小,探测数据报提醒接受方的TCP:确认窗口报文已丢失,必须重传),
    • 保持计时器(如果客户建立到服务器的连接,发送一些数据,然后停止传送,可能这个客户端出现故障,这种情况下,这个连接将永远处于打开状态。为了避免此类事件,服务器端设置一个激活计时器。服务器已接受到客户的信息后就将计时器复位,如果服务器超过激活计时器规定的时间还没有收到客户的信息,就每隔一个时间发送一个探测报文,如果发送10个探测报文后还没有响应,就判断客户端出现故障,服务器终止连接),
    • 时间等待计时器(当TCP释放一次连接时,例如四次挥手中,第四次的报文丢失,TCP规定被动释放链接的一方,在同意释放链接报文发出后,启动时间等待计时器,如果时间到达前收到了应答,则释放链接,如果规定时间内没有收到应答,则重新传送允许释放链接的报文)
  4. TCP,谁发送数据在谁的一方就有个重发定时器等待确认。
posted on 2017-01-14 10:11 思月行云 阅读(408) 评论(0)  编辑 收藏 引用 所属分类: C\C++

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理