分享

TCP/IP的传输层协议(3)

 wangxuqin 2010-10-10
TCP
在上文中已经提到UDP为应用程序提供的是一种不可靠的、非连接的分组的交付服务。当网络硬件失效
或者负担太重时,数据段可能会产生丢失、重复、时延、乱序等现象,这些都会导致通信不正常。如果
让应用程序来负担差错检测和恢复的工作,将给程序员带来很多复杂的工作,所以使用独立的通信协议
来保证通信的可靠性是非常必要的。
 
传输控制协议TCP是在RFC793中定义的,它是一个面向连接的可靠的通信协议。总的来说,TCP主要提
供主要提供一下服务。
 
面向连接的虚电路:这有些和打电话相似,在开始传输之前,通信双方要进行三次握手来建立连接,以保
证连接的可靠性。在传输过程中,通信双方的协议模块继续进行通信,以确保正确到达(例如,接收会用
ACK应答发送方的报文段,发送方对未被应答的报文段提供重传)。如果在传输过程中通信失败了(例如传
输路径上的某个网络接口失效),通信双方都会收到错误报告。在通信结束时,通信双方会使用改进的三次
握手来关闭连接。
 
面向流:当通信双方传输大量数据时,TCP将数据流看作可分为字节的流,进行分段(分组),接收方将收到
的报文段按原有顺序复原。
流量控制,避免拥塞;为了提高传输效率和减少网络通信量(协议之间的通信),TCP会尽量一次传输足够多
的数据。
 
多路分解技术(多路复用技术):用端口号来实现。
全双工连接:TCP提供全双工连接,可以在一条连接上同时传输两个独立的、流向相反的数据流。
 
TCP头格式
TCP头共占用了20个字节
名称
描述
源端口
调用的端口号
目的端口
被调用的端口号
序号
确保数据到达的序列正确的编号
应答号
期望下一个TCP数据段
数据偏移(头长度)
以32位为单位的报头长度
保留
置为0
编码号
开始、终止会话之类的控制功能
窗口
用来控制流量
校验和
头标和数据域计算的校验和
紧急
指示紧急数据的末端
可选项
当前定义项:TCP端的最大值
数据
上层协议的数据

建立TCP连接:三次握手
TCP是面向连接的,在面向连接的环境中,开始传输数据之前,在两个终端之间必须先建立一个连接。建立
连接的过程可以却确保通信双方在发送应用数据包之前静静准备好了传送和接收数据。对于一个要建立的连
接,通信双方必须用彼此的初始化序列号seq和来自对方成功传输确认的应答号ack来同步。(ack号致命希望收
到的下一个八位组的编号)习惯上将同步信号写为SYN,应答信号为ACK。整个同步的过程称为三次握手。
 
 
1)主机A发送SYN给主机B:我的序列号seq是X。
2)主机B发送SYN、ACK给主机A:我的序列号seq是X+1,应答号是X+1(等待接收第X+1号八位组)。
3)主机B发送SYN、ACK给主机B:我的序列号seq是X+1,应答号是Y+1.
   通过以上3个步骤(三次握手),TCP连接连接建立,开始传输数据。任何机器上的TCP都能被动地
   等待握手或主动地发起握手。一旦连接建立,数据可以对等地双向流动。
 
如果TCP使用1作为每次建立连接的初始化序列号,当本地系统重启后,远程系统会认为以前的连接依然存
在。所以每次连接时,主机都会随机选择一个初始化序列号,用它来辨别所传输的八位组在数据流中的位
置。然后双方要对各自的序列号进行协商,因为接收收到第一个SYN时,他并不知道这是否一个被延迟的
旧信号。所以它必须要求发送验证这个SYN。
 
一般情况下,TCP使用最少信息的报文段来实现三次握手,这对减少网络通信流量是有效的。总之,三次握
手使通信双方做好了传输数据的准备,并且使通信通信双方统一了初始化序列号。
 
关闭TCP连接:改进的三次握手
对于一个已经建立的连接,TCP使用改进的三次握手来结束通话(使用一个带有FIN附加标记的报文段)。
1)当主机A的应用程序通知TCP数据已经完毕时,TCP向主机B发送一个带有FIN附加标记的报文段(FIN理解为
   finish)。
2)主机B收到这个FIN报文段之后,并不立即用FIN报文段回复主机A,而是向主机A发送一个确认ACK,同时
   同时通知自己相应的应用程序:对方要求关闭连接(先发送ACK为了防止在这段时间内,对方重传FIN报文段)。
3)主机B的应用程序告诉TCP:我要彻底的关闭的关闭连接,TCP向主机A送第二个FIN报文段。
4)主机A收到第二个FIN报文段后,向主机B发送一个ACK表示连接彻底关闭。 
 
 
TCP的可靠性
TCP是面向流的,即数据段被当作字节的序列化进行传输。
在通过三次握手建立连接时,序列号被初始化。在传输过程中,TCP继续使用这个序列号来标记每一个发送的数据段
没发送一个数据段,序列号加1.接收站点一句序列号重新组装缩所收到数据段。为什么要依靠序列号来重组数据段呢?
例如,在一个告诉高速链路与低速链路并存的网络上,可能会出现高速链路比低速链路上的数据段提前到达的情况,
此时就必须依靠序列号来重组数据段,这就是序列号的作用之一。
 
在传输过程中,确认号ACK的作用是告诉发送端那些数据包已经成功接收,并且确认号会向发送端指出了接收端希望
收到的下一个数据段的序列号,这种机制称为预期确认,即确认号等于下一个预期的位元组。
 
在TCP/IP网络中,存在超时与重传两种现象。如果在传输过程中丢失了某个序列号的数据段,导致发送端在给定时间
间隔内得不到那个数据段的应答,那么那个丢失数据段就会被要求重发。数据段会被保存在发送端的缓冲区中,直
到发送端接收到应答号,它才会释放这个缓冲区。这种机制被称为肯定确认与重新传输(Positive Acknowledgement and
Retransimission,PAR),他是虚脱通信协议用来确保可信度的一种技术。
 
序列号的第二个作用就是消除网络中的重复包(同步复制)。例如在网络拥塞时,发送端迟迟没有收到接收端某个数据段
的ACK包,它可能会认为这个序列号的数据段丢失了,于是它会重新发送,这种情况可能会导致接收端在网络恢复正
常后收到两个同样序列号的数据段,此时接收端会自动丢弃第二个一样数据段。
 
序列号和应答号为TCP提供了一种纠错机制,提高了TCP的可靠性。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多