38、Internet传输协议之TCP之一(传输层)

本文详细介绍了TCP传输协议,包括TCP概述、服务模型、协议特点、TCP段结构、连接建立与释放、连接管理模型以及滑动窗口机制,强调了TCP在不可靠的网络上提供可靠传输的能力,同时探讨了TCP的确认、窗口管理和紧急数据处理机制。
摘要由CSDN通过智能技术生成

引言

  • 对于大多数Internet应用来说,它们需要可靠的、按序递交的传输特性。UDP不能提供这样的功能,所以Internet还需要另一个协议。这就是TCP,它是Internet上的主力军。
1、TCP概述
  • 传输控制协议(TCP)是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输协议。因为互联网络的不同部分可能有不同的拓扑结构、带宽、延迟、数据包大小和其他参数。TCP的设计目的是能够动态地适应互联网络的这些特性,而且具备面对各种故障时的健壮性。
  • 每台支持TCP的机器都有一个TCP传输实体。TCP实体可以是一个库过程、一个用户进程,或者内核的一部分。在所有这些情形下,它管理TCP流,以及与IP层之间的接口。TCP传输实体接收本地进程的用户数据流,将它们分割成不超过64KB(实际上丢掉IP和TCP头,通常不超过1460数据字节)的分段,每个分段以单独的IP数据报形式发送。当包含TCP数据的数据报到达一台机器时,它们被递交给TCP传输实体,TCP传输实体重构出原始的字节流。为简化起见,我们有时候仅仅用“TCP”来代表TCP传输实体(一段软件)或者TCP协议(一组规则),例如,用户将数据交给TCP这句话中,很显然这里指的是TCP传输实体。
  • IP层并不保证数据报一定被正确地递交到接收方,也不指示数据报的发送速度有多快。正是TCP负责既要足够快地发送数据报,以便使用网络容量,但又不能引起网络拥塞;而且TCP超时后,要重传没有递交的数据报。即使被正确递交的数据报,也可能存在错序的问题,这也是TCP的责任,它必须把接收到的数据报重新装配成正确的顺序。简而言之,TCP必须提供可靠性的良好性能,这正是大多数用户所期望的而IP又没有提供的功能。
2、TCP服务模型
  • TCP服务由发送端和接收端创建一种称为套接字的端点来获得。每个套接字有一个套接字编号(地址),该编号由主机的IP地址以及一个本地主机的16位数值组成。这个16位数值称为端口,端口是TCP的TSAP名字。为了获得TCP服务,必须显式地在一台机器的套接字和另一台机器的套接字之间建立一个连接。一个套接字可能同时被用于多个连接。换句话说,两个或者多个连接可能终止于同一个套接字。每个连接可以用两端的套接字标识符来标识,即(socket1,socket2)。TCP不使用虚电路号或者其他的标识符。
  • 1024下的端口号被保留,只能用作由特权用户(比如UNIX系统的root)启动的标准服务。这些端口称为知名端口。例如一台机器上的任何一个进程希望检索邮件,那么它可以连接到目标主机的143端口与IMAP守护进程联系。可以在www.iana.org上找到所有知名端口的链表。目前已经分配了700多个(本书2010年出版)。表中列出了一些尤为知名的端口。
端口 协议 用途
20,21 FTP 文件传输
22 SSH 远程登录,Telnet的替代品
25 SMTP 电子邮件
80 HTTP 万维网
110 POP-3 访问远程邮件
143 IMAP 访问远程邮件
443 HTTPS 安全的Web(SSL/TLS之上的HTTP)
543 RTSP 媒体控制播放
631 IPP 打印共享
  • 1024~49151之间的其他端口可以通过IANA注册,由非特权用户使用,但是应用程序可以选择自己的端口号。例如,BitTorrent对等文件共享应用(非正式的)使用了6881~6887端口号,但也可以运行在其他端口号上。
  • 让FTP守护进程在系统启动时关联到21号端口,让SSH守护进程在系统启动时关联到22号端口等类似的做法是完全可能的。然而,这样做将会使内存散落在这些守护进程中,而且大多数时间这些进程都是空闲的。因此,一般的做法是让一个守护进程同时关联到多个端口上,然后等待针对这些端口的第一个入境连接请求,inetd就派生出一个新的进程,在这个进程中调用适当的守护程序,然后由这个守护程序来处理连接请求。按照这种方式,处理inetd,其他所有守护程序都只在确实有需要的时候才被激活。inetd通过一个配置文件知道哪个端口应该使用哪个守护程序。因此,系统管理员可以这样配置系统使得比较忙的端口(比如80端口)使用永久守护程序,而其他端口则让inetd处理。
  • 所有的TCP连接都是全双工的,并且是点到点的。所谓全双工,意味着同时可在两个方向传输数据;而点到点则意味着每个连接恰好有两个端点。TCP不支持组播或者广播传输模式。一个TCP连接就是一个字节流,而不是消息流。端到端之间不保留消息的边界。例如,如果发送进程将4个512字节的数据块写到一个TCP流中,那么这些数据有可能按4个512字节块、2个1024字节块、1个2048字节块或者其他的方式被递交给接收进程。接收端无法获知这些数据被写入字节流时的单元大小。
  • UNIX系统中的文件也具有这样的特性。读文件的程序无法判断该文件是一次写入一块,还是一次写入一个字节,或者整个文件被一次性写入。如同UNIX文件一样,TCP软件不理解字节流的含义。当一个应用将数据传递给TCP时,TCP可能立即将数据发送出去,也可能将它缓存起来(为了收集更多的数据一次发送出去),这完全由TCP软件自己来决定。然而,有时候应用程序确实希望数据立即被发送出去。例如一个交互式游戏的用户希望发送一个更新流,至关重要的是这个流应该被立即发送出去,而不是缓存起来。为了强制将数据发送出去,TCP有个PUSH标志位的概念,由数据包携带的PUSH标志位原意是让应用告诉TCP不要延迟传输。然而,应用程序在发送数据时不能从字面上设置PUSH标志,不同的操作系统已经演化出了不同的方案来加速传输(例如在Windows和Linux的TCP_NODELAY)。
  • TCP而一个有趣特性是紧急数据的处理。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值