TCP/IP协议笔记

参考:http://blog.csdn.net/hankscpp/article/details/8611229

    http://blog.csdn.net/cws1214/article/details/8078629

    http://www.360doc.com/content/12/0704/16/8797027_222229315.shtml

    http://blog.sina.com.cn/s/blog_48ebca64010003t0.html

 

 

   OSI模型,即开放式通信系统互联参考模型(Open System Interconnection Reference Model),是国际标准化组织(ISO)提出的一个试图使各种计算机在世界范围内互连为网络的标准框架,简称OSI

 

                      图一

————————————————————OSI七层模型,每层的部分协议——————————————————————————————————————————

第七层 应用层         协议:DHCP · DNS · FTP · Gopher · HTTP ·  POP3  · SMTP · SNMP · SSH · TELNET · RPC ·TLS · SDP · SOAP · GTP · STUN · NTP 
第六层 表示层         协议:无
第五层 会话层         协议:无
第四层 传输层         协议:TCP · UDP · DCCP · SCTP · RTP · RSVP · PPTP 
第三层 网络层         协议:IP (IPv4 · IPv6) · ARP · RARP · ICMP · ICMPv6 · IGMP · RIP · OSPF · BGP · IS-IS · IPsec 
第二层 数据链路层    协议: 802.11 · 802.16 · Wi-Fi  · 令牌环 · 以太网 · FDDI · 帧中继 · GPRS · EVDO · HSPA · HDLC · PPP · L2TP · ISDN 
第一层 物理层         协议: RS-443 、RS-232C、RS-485 、理-2593

 

OSI

物理层

为数据链路层提供物理连接,在其上串行传送比特流,即所传送数据的单位是比特。此外,该层中还具有确定连接设备的电气特性和物理特性等功能。

数据链路层

负责在网络节点间的线路上通过检测、流量控制和重发等手段,无差错地传送以帧为单位的数据。为做到这一点,在每一帧中必须同时带有同步、地址、差错控制及流量控制等控制信息。

网络层

为了将数据分组从源(源端系统)送到目的地(目标端系统),网络层的任务就是选择合适的路由和交换节点,使源的传输层传下来的分组信息能够正确无误地按照地址找到目的地,并交付给相应的传输层,即完成网络的寻址功能。

传输层

传输层是高低层之间衔接的接口层。数据传输的单位是报文,当报文较长时将它分割成若干分组,然后交给网络层进行传输。传输层是计算机网络协议分层中的最关键一层,该层以上各层将不再管理信息传输问题。

 

会话层

该层对传输的报文提供同步管理服务。在两个不同系统的互相通信的应用进程之间建立、组织和协调交互例如,确定是双工还是半双工工作。

 

表示层

该层的主要任务是把所传送的数据的抽象语法变换为传送语法,即把不同计算机内部的不同表示形式转换成网络通信中的标准表示形式。此外,对传送的数据加密(或解密)、正文压缩(或还原)也是表示层的任务。


应用层

该层直接面向用户,是OSI中的最高层。它的主要任务是为用户提供应用的接口,即提供不同计算机间的文件传送、访问与管理,电子邮件的内容处理,不同计算机通过网络交互访问的虚拟终端功能等。

 

TCP/IP

 

网络接口层 

这是TCP/IP协议的最低一层,包括有多种逻辑链路控制和媒体访问协议。网络接口层的功能是接收IP数据报并通过特定的网络进行传输,或从网络上接收物理帧,抽取出IP数据报并转交给网际层。


网际网层(IP层)  

该层包括以下协议:IP(网际协议)、ICMP(因特网控制报文协议)、ARP(Address Resolution Protocol,地址解析协议)、RARP(反向地址解析协议)。该层负责相同或不同网络中计算机之间的通信,主要处理数据报和路由。在IP层中,ARP协议用于将IP地址转换成物理地址,RARP协议用于将物理地址转换成IP地址,ICMP协议用于报告差错和传送控
制信息。IP协议在TCP/IP协议组中处于核心地位。


传输层  

该层提供TCP(传输控制协议)和UDP(User Datagram Protocol,用户数据报协议)两个协议,它们都建立在IP协议的基础上,其中TCP提供可靠的面向连接服务,UDP提供简单的无连接服务。传输层提供端到端,即应用程序之间的通信,主要功能是数据格式化、数据确认和丢失重传等。


应用层 

TCP/IP协议的应用层相当于OSI模型的会话层、表示层和应用层,它向用户提供一组常用的应用层协议,其中包括:Telnet、SMTP、DNS等。此外,在应用层中还包含有用户应用程序,它们均是建立在TCP/IP协议组之上的专用程序。

 ——————————————————————————————————————————————————————————————————————————————

 

TCP/IP协议模型(Transmission Control Protocol/Internet Protocol),包含了一系列构成互联网基础的网络协议,是Internet的核心协议,通过20多年的发展已日渐成熟,并被广泛应用于局域网和广域网中,目前已成为事实上的国际标准。TCP/IP协议簇是一组不同层次上的多个协议的组合,通常被认为是一个四层协议系统,与OSI的七层模型相对应。

 

链路层

 也称作数据链路层(在第一个图中为网络接口层和硬件层),通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。它们一起处理与电缆(或其他任何传输媒介)的物理接口细节。ARP(地址解析协议)和RARP(逆地址解析协议)是某些网络接口(如以太网和令牌环网)使用的特殊协议,用来转换IP层和网络接口层使用的地址。

 

 

网络层

也称作互联网层(在第一个图中为网际层),处理分组在网络中的活动,例如分组的选路。在TCP/IP协议族中,网络层协议包括IP协议(网际协议),ICMP协议(Internet互联网控制报文协议),以及IGMP协议(Internet组管理协议)。

  IP是一种网络层协议,提供的是一种不可靠的服务,它只是尽可能快地把分组从源结点送到目的结点,但是并不提供任何可靠性保证。同时被TCP和UDP使用。TCP和UDP的每组数据都通过端系统和每个中间路由器中的IP层在互联网中进行传输。

  ICMP是用于在IP主机、路由器之间传递控制消息,控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息,这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。

  IGMP是Internet组管理协议。它用来把一个UDP数据报多播到多个主机。

 

 

传输层

主要为两台主机上的应用程序提供端到端的通信。在TCP/IP协议族中,有两个互不相同的传输协议:TCP(传输控制协议)和UDP(用户数据报协议)。

  TCP为两台主机提供高可靠性的数据通信。它所做的工作包括把应用程序交给它的数据分成合适的小块交给下面的网络层,确认接收到的分组,设置发送最后确认分组的超时时钟等。为了提供可靠的服务,TCP采用了超时重传、发送和接收端到端的确认分组等机制。

  UDP则为应用层提供一种非常简单的服务,它只是把称作数据报的分组从一台主机发送到另一台主机,但并不保证该数据报能到达另一端。一个数据报是指从发送方传输到接收方的一个信息单元(例如,发送方指定的一定字节数的信息)。UDP协议任何必需的可靠性必须由应用层来提供。

 

 

应用层

应用层负责处理特定的应用程序细节。

 

 

——————TCP————————————————————————

 

TCP协议通过以下过程来保证端到端数据通信的可靠性:

1、TCP实体把应用程序划分为合适的数据块,加上TCP报文头,生成数据段;

2、当TCP实体发出数据段后,立即启动计时器,如果源设备在计时器清零后仍然没有收到目的设备的确认报文,重发数据段;

3、当目的设备的TCP实体收到数据,发回一个确认。

4、TCP数据段包含一个端到端的校验和字段,目的设备检测数据传输过程的任何变化。如果目的设备收到的数据校验和计算结果有误,则将丢弃数据段,源设备在前面所述的计时器清零后重发数据段。

5、由于TCP数据段承载在IP数据包内,而IP提供了无连接的、不可靠的服务,数据包有可能会失序。TCP协议提供了重新排序机制,目的设备将收到的数据重新排序,交给应用程序。

6、TCP提供流量控制。TCP连接的每一端都有缓冲窗口。目的设备只允许源设备发送自己可以接收的数据,防止缓冲区溢出。

7、TCP支持全双工数据传输。

 

 

注意上图的TCP报文格式,下图的更详细

TCP报文段首部(20个字节)------见↑图

   源端口和目的端口:各占2个字节,16比特的端口号加上32比特的IP地址,共同构成相当于传输层服务访问点的地址,即“插口”;

   这些端口可用来将若干高层协议向下复用;

序号字段和确认序号字段:

   序号:占4个字节,是本报文段所发送的数据部分第一个字节的序号。在TCP传送的数据流中,每一个字节都有一个序号。例如,一报文段的序号为300,而起数据供100字            节,则下一个报文段的序号就是400;

   确认序号:占4字节,是期望收到对方下次发送的数据的第一个字节的序号,也就是期望收到的下一个报文段的首部中的序号;

   由于序号字段有32比特长,可以对4GB的数据进行编号,这样就可保证当序号重复使用时,旧序号的数据早已在网络中消失了;

数据偏移字段

   数据偏移:占4比特,表示数据开始的地方离TCP报文段的起始处有多远。这实际上就是TCP报文段首部的长度。由于首部长度不固定,因此数据偏移字段是必要的。

   保留字段: 6比特,供今后使用,目前置为0。

6个比特的控制字段

   紧急比特URGent:当URG=1时,表明此报文应尽快传送,而不要按原来的排队顺序来传送。与“紧急指针”字段配合使用,紧急指针指出在本报文段中的紧急数据的最后一           个字节的序号,使接收方可以知道紧急数据共有多长;

   确认比特ACK:只有当ACK=1时,确认序号字段才有意义;

   急迫比特PSH:当PSH=1时,表明请求远地TCP将本报文段立即传送给其应用层,而不要等到整个缓存都填满了之后再向上交付。

   复位比特ReSeT:当RST=1时,表明出现严重差错,必须释放连接,然后再重建传输连接。复位比特还用来拒绝一个非法的报文段或拒绝打开一个连接;

   同步比特SYN:在建立连接时使用,当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,在发回的报文段中使SYN=1和ACK=1。因此,SYN=1          表示这是一个连接请求或连接接受报文,而ACK的值用来区分是哪一种报文;

   终止比特FINal:用来释放一个连接,当FIN=1时,表明欲发送的字节串已经发完,并要求释放传输连接;

窗口字段

   窗口Window:占2字节,表示报文段发送方的接收窗口,单位为字节。此窗口告诉对方,“在未收到我的确认时,你能够发送的数据的字节数至多是此窗口的大小。”

   通知窗口advertised window:接收端根据其接收能力许诺的窗口值,是来自接收端的流量控制。接收端将通知窗口的值放在TCP报文的首部中,传送给对方。

   拥塞窗口congestion window:是发送端根据网络拥塞情况得出的窗口值,是来自发送端的流量控制。

   检验和覆盖了整个的TCP报文段:TCP首部和TCP数据。这是一个强制性的字段,由发端计算和存储,由收端进行验证。

  选项字段允许每台主机设定能够接受的最大TCP载荷能力(缺省536字节) 。

 

 

其中ACK、SYN、FIN、序号这四个部分在下面会用到。

ACK : TCP协议规定,只有ACK=1时有效,也规定连接建立后所有发送的报文的ACK必须为1

SYN(SYNchronization) : 在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文。对方若同意建立连接,则应在响应报文中使SYN=1和ACK=1. 因此,  SYN置1就表示这是一个连接请求或连接接受报文。

FIN (finis):终结的意思, 用来释放一个连接。当 FIN = 1 时,表明此报文段的发送方的数据已经发送完毕,并要求释放连接。

序号:TCP是面向字节流的,在一个TCP连接中传送的字节流中的每一个字节流都按顺序编号,整个要传送的字节流的起始序号必须在连接建立时设置。例如,报文段的序号字段值是301,而携带的数据共有100字节,这就表示这个报文段的最后一个字节的序号是400。下一个报文段的数据传送序号要从401开始。

 

三次握手的过程:

 

准备阶段:服务器的应用进程会先创建TCB(传输控制块),用以准备接受客户端的连接请求。此时服务器处于LISTEN(监听)状态。

①客户端发出请求连接即 SYN=1 ACK=0 seq=x(TCP规定SYN=1时不能携带数据,但要消耗一个序号,因此声明自己的序号是seq = x)【客户端进入SYN-SNET(同步已发送)状态】

②服务器端进行确认,向客户端发送SYN=1 ACK=1 seq=y, ack=x+1。【服务器进入SYN-RCVD(同步收到)状态】

③客户端收到服务器的确认信息后,再次向服务器发送ACK=1,seq=x+1,ack=y+1【客户端进入ESTABLISHED状态,当服务器收到客户端的确认信息后也会进入ESTABLISHED状态】

 

四次挥手的过程:

  

①客户端没有数据要向服务器发送时,先向TCP发出连接释放报文段,并停止发送数据,主动关闭TCP连接。客户端把连接释放报文段首部的终止控制位FIN置1,其序号seq=u(u等于前面已传送过的数据的最后一个字节的序号加1)

【客户端进入FIN-WAIT1(终止等待1)状态】

②服务器收到连接释放报文段后即发出确认,确认号是ack=u+1,报文段本身的序号seq=v(v等于前面已传送过的数据的最后一个字节的序号加1)

【服务器进入CLOSE-WAIT(关闭等待)状态,客户端收到服务器的确认后进   入FIN-WAIT2(终止等待2)状态】

【客户端的写通道关闭,服务器的读通道关闭】

③服务器没有数据向客户端发送时,应用进程就通知TCP释放连接,服务器发出的连接释放报文段必须使FIN=1。现在假定服务器的序号为w(在半关闭状态服务器可能发送了一些数据),B还必须重复上次已发送过的确认序号ack=u+1。

【服务器进入LAST-ACK(最后确认)状态】

④客户端收到服务器的连接释放报文段后,发出确认报文段,将报文段中的ACK=1,  ack=w+1, seq=u+1。

【客户端进入TIME-WAIT(时间等待)状态,此时TCP连接还没有释放,必须经过时间等待计时器设置的时间2MSL(约4min)后,客户端才进入到CLOSED状态,服务器只要收到客户端的确认就进入CLOSED状态,撤销TCB(传输控制块)后结束TCP连接】

 

 

-------------------------------------------------------------------------------------------------------------------------------

tcp的拥塞控制机制

问题解释:↓

例如:我们有四台主机ABCD连接路由器R,所有链路带宽都是1Gbps,如果A和B同时向C以1Gbps的速率发送数据,则路由器R的输入速率为2Gbps,而输出速率只能为1Gbps,从而产生拥塞。避免拥塞的方法只能是控制AB的速率,例如,都是0.5Gbps,但是,这只是一种情况,倘若D也向R发送数据,且速率为1Gbps,那么,我们先前的修正又是不成立的,可见,拥塞其实是一个动态问题,我们没有办法用一个静态方案去解决,从这个意义上来说,拥塞是不可避免的

 

早期的TCP协议只有基于窗口的流控制(flow control)机制。

在TCP中,为了实现可靠性,发送方发出一个数据段之后要等待接受方相应的确认信息,而不是直接发送下一个分组。

具体的技术是采用滑动窗口,以便通信双方能够充分利用带宽。滑动窗口允许发送方在收到接收方的确认之前发送多个数据段。窗口大小决定了在收到目的地确认之前,一次可以传送的数据段的最大数目。窗口大小越大,主机一次可以传输的数据段就越多。当发送方传输窗口大小的数据段后,就必须等收到确认,才可以再传下面的数据段。

例如,若视窗的大小为 1,则传完数据段后,都必须经过确认,才可以再传下一个数据段;当窗口大小等于3时,发送方可以一次传输3个数据段,等待对方确认后,再传输下面三个数据段。

窗口的大小在通信双方连接期间是可变的,通信双方可以通过协商动态地修改窗口大小。在TCP的每个确认中,除了指出希望收到的下一个数据段的序列号之外,还包括一个窗口通告,通告中指出了接收方还能再收多少数据段(我们可以把通告看成接收缓冲区大小)。如果通告值增大,窗口大小也相应增大;通告值减小,窗口大小也相应减小。但是我们可以发现,接收端并没有特别合适的方法来判断当前网络是否拥塞,因为它只是被动得接收,不像发送端,当发出一个数据段后,会等待对方得确认信息,如果超时,就可以认为网络已经拥塞了。所以,改变窗口大小的唯一根据,就是接收端缓冲区的大小了。

流量控制作为接受方管理发送方发送数据的方式,用来防止接受方可用的数据缓存空间的溢出。

流控制是一种局部控制机制,其参与者仅仅是发送方和接收方,它只考虑了接收端的接收能力,而没有考虑到网络的传输能力;

而拥塞控制则注重于整体,其考虑的是整个网络的传输能力,是一种全局控制机制。正因为流控制的这种局限性,从而导致了拥塞崩溃现象的发生。

 

关于超时重传
1、一旦收到确认,发送方关闭重发定时器并且将数据片的备份从重发队列中删除。发送方如果在规定的时间内没有收到数据确认,就重传该数据。
2、当TCP超时并重传时,它不一定要重传同样的报文段,相反,TCP允许进行重新分组而发送一个较大的报文段,这将有助于提高性能(当然,这个较大的报文段不能够超过接收方声明的MSS)。在协议中这是允许的,因为TCP是使用字节序号而不是报文段序号来进行识别它所要发送的数据和进行确认。
3、重发定时器
(1)  每一次一个包含数据的包被发送(包括重发),如果该定时器没有运行则启动它,使得它在RTO秒之后超时(按照当前的RTO值)。
(2)  当所有的发出数据都被确认之后,关闭该重发定时器。
(3)  当接收到一个ACK确认一个新的数据,重新启动该重发定时器,使得它在RTO秒之后超时(按照当前的RTO值)

 

TCP拥塞控制机制
  TCP的拥塞控制由4个核心算法组成:“慢启动”(Slow Start)、“拥塞避免”(Congestion voidance)、“快速重传 ”(Fast Retransmit)、“快速恢复”(Fast Recovery)。

为了方便起见,把发送端叫做client,接收端为server,每个segment长度为512字节,阻塞窗口长度为cwnd(简化起见,下面以segment为单位),sequence number为seq_num,acknowledges number为ack_num。通常情况下,TCP每接收到两个segment,发送一个ack。

 慢启动
  早期开发的TCP应用在启动一个连接时会向网络中发送大量的数据包,这样很容易导致路由器缓存空间耗尽,网络发生拥塞,使得TCP连接的吞吐量急剧下降。由于TCP源端一开始并不知道网络资源当前的利用状况,因此新建立的TCP连接不能一开始就发送大量数据,而只能逐步增加每次发送的数据量,以避免上述现象的发生,这里有一个“学习”的过程。
  假设client要发送5120字节到server,慢启动过程如下:
  1.初始状态,cwnd=1,seq_num=1;client发送第一个segment;
  2.server接收到512字节(一个segment),回应ack_num=513;
  3.client接收ack(513),cwnd=1+1=2;现在可以一次发送2个数据段而不必等待ack
  4.server接收到2个segment,回应ack_num=513+512*2=1537
  5.client接收ack(1537),cwnd=2+1;一次发送3个数据段
  6.server接收到3个segment,回应2个ack,分别为ack_num=1537+1024=2561和ack_num=2561+512=3073
  7.client接收ack(2561)和ack(3073),cwnd=3+2=5;一次可以发送5个数据段,但是只用4个就满足要求了
  8.server接收到4个segment,回应2个ack,分别为4097,5121
  9.已经发送5120字节,任务完成!

 

拥塞避免
  可以想象,如果按上述慢启动的逻辑继续下去而不加任何控制的话,必然会发生拥塞,引入一个慢启动阈值ssthresh的概念,当cwnd<ssthresh的时候,tcp处于慢启动状态,否则,进入拥塞避免阶段。通常,ssthresh初始化为
64 Kbytes。
  当cwnd = 64947 + 512 = 65459,进入拥塞避免阶段,假设此时seq_num = _101024:
  1.client一次发送cwnd,但是先考虑头两个segment
  2.server回应ack_num = 102048
  3.client接收到ack(102048),cwnd = 65459 + [(512 * 512) /65459] = 65459 + 4 = 65463,也就是说,每接到一个ack,cwnd只增加4个字节。
  4.client发送一个segment,并开启ack timer,等待server对这个segment的ack,如果超时,则认为网络已经处于拥塞状态,则重设慢启动阀值ssthresh=当前cwnd/2=65463/2=32731,并且,立刻把cwnd设为1,很极端的处理!
  5.此时,cwnd<ssthresh,所以,恢复到慢启动状态。

 

快速重传和快速恢复
  前面讲过标准的重传,client会等待RTO时间再重传,但有时候,不必等这么久也可以判断需要重传,例如:client一次发送8个segment,seq_num起始值为100000,但是由于网络原因,100512丢失,其他的正常,则server会响应4个ack(100512)(为什么呢,tcp会把接收到的其他segment缓存起来,ack_num必须是连续的),这时候,client接收到四个重复的ack,它完全有理由判断100512丢失,进而重传,而不必傻等RTO时间了。这就是快速重传。
  那么,什么是快速恢复呢?我们通常认为client接收到3个重复的ack后,就会开始快速重传,但是,如果还有更多的重复ack呢,如何处理?这就是快速恢复要做的,事实上,我们可以把快速恢复看作是快速重传的后续处理,它不是一种单独存在的形态。
  以下是具体的流程:
  假设此时cwnd=70000,client发送4096字节到server,也就是8个segment,起始seq_num = _100000:
  1.client发送seq_num = _100000
  2.seq_num =100512的segment丢失
  3.client发送seq_num = _101024
  4.server接收到两个segment,它意识到100512丢失,先把收到的这两个segment缓存起来
  5.server回应一个ack(100512),表示它还期待这个segment
  6.client发送seq_num = _101536
  7.server接收到一个segment,它判断不是100512,依旧把收到的这个segment缓存起来,并回应ack(100512)
  。
  。
  。
  8.以下同6、7,直到client收到3个ack(100512),进入快速重发阶段:
  9.重设慢启动阀值ssthresh=当前cwnd/2=70000/2=35000
  10.client发送seq_num = 100512
 
  以下,进入快速恢复阶段:
  11.重设cwnd = ssthresh + 3 segments =35000 + 3*512 = 36536,之所以要加3,是因为我们已经接收到3个ack(100512)了,根据前面说的,每接收到一个ack,cwnd加1
  12.client接收到第四个、第五个ack(100512),cwnd=36536+2*512=37560
  13.server接收到100512,响应ack_num = _104096
  14.此时,cwnd>ssthresh,进入拥塞避免阶段。

 

 

后退N帧ARQ协议

当接收方检测出失序的信息帧后,要求发送方重发最后一个正确接收的信息帧之后的所有未被确认的帧;或者当发送方发送了N个帧后,若发现该N帧的前一个帧在计时器超时后仍未返回其确认信息,则该帧被判为出错或丢失,此时发送方就不得不重新发送出错帧及其后的N帧。这就是GO-DACK-N(退回N)法名称的由来。因为,对接收方来说,由于这一帧出错, 就不能以正常的序号向它的高层递交数据,对其后发送来的N帧也可能都不能接收而丢弃。
后退N帧的工作情况

GO-DACK-N法操作过程如下图。图中假定发送完8号帧后,发现2号帧的确认返回在计时器超时后还未收到,则发送方只能退回从2号帧开始重发。

选择重传ARQ协议

为了进一步提高信道的利用率,可设法只重传出现差错的数据帧或者是定时器超时的数据帧。但这时必须加大接收窗口,以便先收下发送序号不连续但仍处在接收窗口中的那些数据帧。等到所缺序号的数据帧收到后再一并送交主机。这就是选择重传ARQ协议。

使用选择重传ARQ协议可以避免重复传送那些本来已经正确到达接收端的数据帧。但我们付出的代价是在接收端要设置具有相当容量的缓存空间,这在许多情况下是不够经济的。

正因如此,选择重传ARQ协议在目前就远没有连续则协议使用得那么广泛。今后存储器芯片的价格会更加便宜,选择重传ARQ协议还是有可能受到更多的重视。
posted @ 2015-09-27 16:32  heshengbang  阅读(793)  评论(0编辑  收藏  举报