TCP/IP协议

        

 

TCP/IP协议族中,

 网路层协议包括IP协议、ICMP协议、IGMP协议。(PingTraceroute都使用ICMP协议)

 传输层协议包括TCPIP

 

T C P传给I P的数据单元称作 T C P报文段或简称为T C P段(T C P s e g m e n t I P传给网络接口层的数据单元称作I P数据报(IP datagram)。通过以太网传输的比特流称作帧(Fr a m e )

    

        * 由系统内核处理网络协议中的下三层(传输层、网络层、链路层) 

        * Tr a c e r o u t e工具可以让我们看到I P数据报从一台主机传到另一台主机所经过的路由。

        * 广播和多播仅应用于 U D P

 

        TCP协议:

        

* TCP能提供的功能:

  包括自适应的超时和重传策略、校验检验和、对数据进行排序、丢弃重复的数据、流量控制。

 

* TCP的数据结构:

  TCP数据被封装在一个IP数据包中,包括20字节的IP首部、20字节的TCP首部、以及TCP数据。

 

* T C P还能提供流量控制。T C P连接的每一方都有固定大小的缓冲空间。 T C P的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。T C P的流量控制由连接的每一端通过声明的窗口大小来提供。

 

* T C P将用户数据打包构成报文段;它发送数据后启动一个定时器;另一端对收到的数据进行确认,对失序的数据重新排序,丢弃重复数据; T C P提供端到端的流量控制,并计算和验证一个强制性的端到端检验和。

 

* 当建立一个新的连接时,S Y N标志变1。序号字段包含由这个主机选择的该连接的初始序号I S NInitial Sequence Number 。该主机要发送数据的第一个字节序号为这个 I S N1,因为S Y N标志消耗了一个序号(将在下章详细介绍如何建立和终止连接,届时我们将看到 F I N标志也要占用一个序号)

* 既然每个传输的字节都被计数,确认序号包含发送确认的一端所期望收到的下一个序号。因此,确认序号应当是上次已成功收到数据字节序号加 1。只有A C K标志(下面介绍)为1时确认序号字段才有效。发送A C K无需任何代价,因为32 bit的确认序号字段和A C K标志一样,总是T C P首部的一部分。因此,我们看到一旦一个连接建立起来,这个字段总是被设置, A C K标志也总是被设置为1

 

* T C P连接是全双工(即数据在两个方向上能同时传递) ,因此每个方向必须单独地进行关闭。

* 最大报文段长度(M S S)表示T C P传往另一端的最大块数据的长度。当一个连接建立时,连接的双方都要通告各自的 M S S。我们已经见过M S S都是1 0 2 4。这导致I P数据报通常是4 0字节长。

* TCP给出两个策略来提高发送效率和减低网络负担:(1)捎带ACK(2)Nagle算法(一次尽量多的发数据)。在编写插口程序的时候,可以通过TCP_NODELAY来关闭这个算法。

* 一般来说,TCP出现连接错误,TCP都会发出一个复位报文段。

 

* T C P管理4个不同的定时器。

1) 重传定时器使用于当希望收到另一端的确认。在本章我们将详细讨论这个定时器以及一些相关的问题,如拥塞避免。

2) 坚持( p e r s i s t )定时器使窗口大小信息保持不断流动,即使另一端关闭了其接收窗口。

3) 保活( k e e p a l i v e )定时器可检测到一个空闲连接的另一端何时崩溃或重启。

4) 2MSL定时器测量一个连接处于T I M E _ WA I T状态的时间。

        TCP的状态迁移图:

        

4.TCP的状态迁移图

ESTABLISHED状态是连接双方能够进行双向数据传递的状态。

 

P182页给出了TCP的状态图,这是一个看起来比较复杂的状态迁移图,因为它包含了两个部分---服务器的状态迁移和客户端的状态迁移,如果从某一个角度出发来看这个图,就会清晰许多,这里面的服务器和客户端都不是绝对的,发送数据的就是客户端,接受数据的就是服务器。

 

4.1.客户端应用程序的状态迁移图

客户端的状态可以用如下的流程来表示:

 

CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED

 

以上流程是在程序正常的情况下应该有的流程,从书中的图中可以看到,在建立连接时,当客户端收到SYN报文的ACK以后,客户端就打开了数据交互地连接。而结束连接则通常是客户端主动结束的,客户端结束应用程序以后,需要经历FIN_WAIT_1FIN_WAIT_2等状态,这些状态的迁移就是前面提到的结束连接的四次握手。

 

4.2.服务器的状态迁移图

服务器的状态可以用如下的流程来表示:

 

CLOSED->LISTEN->SYN_RCVD->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED

 

在建立连接的时候,服务器端是在第三次握手之后才进入数据交互状态,而关闭连接则是在关闭连接的第二次握手以后(注意不是第四次)。而关闭以后还要等待客户端给出最后的ACK包才能进入初始的状态。

 

4.3.其他状态迁移

书中的图还有一些其他的状态迁移,这些状态迁移针对服务器和客户端两方面的总结如下

 

LISTEN->SYN_SENT,对于这个解释就很简单了,服务器有时候也要打开连接的嘛。

SYN_SENT->SYN收到,服务器和客户端在SYN_SENT状态下如果收到SYN数据报,则都需要发送SYNACK数据报并把自己的状态调整到SYN收到状态,准备进入ESTABLISHED

SYN_SENT->CLOSED,在发送超时的情况下,会返回到CLOSED状态。

SYN_收到->LISTEN,如果受到RST包,会返回到LISTEN状态。

SYN_收到->FIN_WAIT_1,这个迁移是说,可以不用到ESTABLISHED状态,而可以直接跳转到FIN_WAIT_1状态并等待关闭。

 

        路由器和网桥:

        路由器是在网络层上对网络进行互联;而网桥是在链路层上对网络进行互联。

网络层传递的是分组,它尽可能快地把分组从源节点送到目的节点。但是并不提供任何可靠性保证。

 

你可能感兴趣的:(C++,c,应用服务器,网络协议,网络应用)