尽管TCP 和UDP 都使用相同的网络层(IP),TCP 却向应用层提供与UDP完全不同的服务。TCP 提供一种面向连接的、可靠的字节流服务。TCP 数据被封装在一个IP 数据报中,如图3-24 所示,TCP 报文段包含TCP 首部和TCP 数据。TCP 头部如图3-25 所示,如果不计任选字段,它通常是20 个字节;TCP数据段内容为来自上层的封装数据。
图3-23 TCP/IP 协议族中不同层次的协议
图3-24 TCP 数据在IP 数据报中的封装
图3-25 TCP 包首部
每个TCP 段都包含源端和目的端的端口号,用于寻找发端和收端应用进程。这两个值加上IP 首部中的源端IP 地址和目的端IP 地址唯一确定一个TCP 连接。通常将一个IP 地址和一个端口号也称为一个插口(Socket)。这个术语出现在最早的TCP 规范(RFC793)中,后来它也作为表示伯克利版的编程接口(见1.15节)。插口对(Socketpair)(包含客户IP 地址、客户端口号、服务器IP 地址和服务器端口号的四元组)可唯一确定互联网络中每个TCP 连接的双方。
序号用来标识从TCP 发端向TCP 收端发送的数据字节流,它表示在这个报文段中的第一个数据字节。如果将字节流看作在两个应用程序间的单向流动,则TCP 用序号对每个字节进行计数。序号是32bit 的无符号数,序号到达232-1后又从0 开始。(www.xing528.com)
TCP 连接建立需要进行3 次握手,而关闭连接需要4 次握手,如图3-26 所示,具体步骤如下:
图3-26 连接建立与终止的时间系列
(1)请求端(通常称为客户)发送一个SYN 段指明客户打算连接的服务器的端口,以及初始序号(ISN,在这个例子中为1415531521),这个SYN 段为报文段1。
(2)服务器发回包含服务器的初始序号的SYN 报文段(报文段2)作为应答。同时,将确认序号设置为客户的ISN 加1 以对客户的SYN 报文段进行确认。一个SYN 将占用一个序号。
(3)客户必须将确认序号设置为服务器的ISN 加1 以对服务器的SYN 报文段进行确认(报文段3)。
(4)TCP 客户端发送一个FIN,用来关闭从客户到服务器的数据传送。当服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。
(5)和SYN 一样,一个FIN 将占用一个序号。同时TCP 服务器还向应用程序(即丢弃服务器)传送一个文件结束符。接着这个服务器程序就关闭它的连接,导致它的TCP 端发送一个FIN(报文段6),客户必须发回一个确认,并将确认序号设置为收到序号加1(报文段7)。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。