第8章传输控制协议(TCP)TCP协议在协议栈中的位置TCP/IP协议栈应用层HTTP,FTP,SMTP,DNS,Telnet,…传输层TCP,UDP网际(网络)层IP,ICMP,IGMP,ARP,RARP网络接口层(数据链路层+物理层)PPP,Ethernet,Tokenring,ATMTCP协议提供的服务流交付服务TCPTCP发送进程接收进程字节流流交付服务TCPTCP下一个要接收的字节下一个要交付的字节下一个要发送的字节下一个要接收的字节发送缓存和接收缓存送方和接收方的进程产生和消耗数据的速度不一样,需要用缓存来平滑这种差别发送进程接收进程发送缓存接收缓存流交付服务报文段在运输层,TCP把若干字节构成一个分组,叫报文段TCPTCP发送进程接收进程HH…报文段N报文段1发送缓存接收缓存全双工通信服务数据在同一时间双向流动,每个TCP都有发送缓存和接收缓存,两个方向都可以发送报文段面向连接服务进程A与进程B要通信时,就发生下列事件:1)A的TCP通知B的TCP,并得到B的TCP的同意2)A的TCP和B的TCP互相交换数据(两个方向)3)在两个进程都没有数据要发送而缓存变空以后,这两个TCP清除它们的缓存两个TCP之间的连接是一种虚连接,而不是物理连接面向连接服务端口…发送TCP报文段TCP…TCP接收缓存发送缓存报文段…报文段报文段端口发送端接收端应用进程应用进程TCP协议服务的性质TCP协议服务是可靠的,为了达到可靠性,采用了以下技术:1)通信前建立连接2)确认机制3)应用程序被分成TCP最为合适的数据块传输4)超时重传5)差错检测6)流量与拥塞控制通信前建立连接一般情况下,总是其中的一台主动提出通信的请求(客户机),另一台被动地响应(服务器)。如果传输层使用TCP协议,则在通信之前要求通信的双方首先要建立一条连接。TCP使用“3次握手”(3-wayHandshake)法来建立一条连接。所谓3次握手,就是指在建立一条连接时通信双方要交换3次报文。通信前建立连接(三次握手)11TCP协议建立连接三次握手的过程TCP报文首部释放连接(四次握手)TCP协议释放连接四次握手的过程TCP报文首部确认机制接收端向源端返回确认号,以确定报文已收到确认机制-给字节编号(序号)字节号TCP协议是面向字节的。TCP将所要传送的报文看成是字节组成的数据流,并使每一个字节对应于一个序号,编号在缓存中进行,在0到232-1之间产生一个随机数作为第一个字节的编号。确认机制-给字节编号(序号)序号在连接建立时,双方要商定初始序号。TCP每次发送的报文段的序号值表示该报文段中的数据部分的第一个字节的序号。确认机制-返回确认确认号TCP的确认是对接收到的数据的最高序号表示确认。接收端返回的确认号是已收到的数据的最高序号加1。因此确认号表示接收端期望下一次收到的数据中的第一个数据字节的序号(编号)。发送方和接收方的缓冲区决定数据分成多大的块传输传输数据前协商块大小参数(MSS),由接收端决定数据分成合适的数据块传输超时重传当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。TCP将保持它首部和数据的检验和。差错检测报文本身出错采用端到端的校验和,目的是检测数据在传输过程中的任何变化,如果收到校验和有错,TCP将丢弃这个报文段和不确认收到此报文,希望发送端超时并重新发送差错检测其它错误被分片传输的报文,分片丢失;报文本身丢失;收到重复的报文流量与拥塞控制发送窗口技术发送数据前协商一个合理的发送窗口,由接收端的接收能力决定例题讲练一个TCP连接要传输6000字节的文件,第一个字节的编号是10010,如果数据用五个报文段来发送,前四个报文段各携带1000字节的数据,最后一个报文段携带2000字节的数据,试给出每个报文段的序号TCP首部20字节的固定首部目的端口数据偏移检验和选项(长度可变)源端口序号紧急指针窗口确认号保留FIN32bitSYNRSTPSHACKURG比特08162431填充TCP数据部分TCP首部TCP报文段IP数据部分IP首部发送在前TCP报文格式TCP首部20字节固定首部目的端口数据偏移检验和选项(长度可变)源端口序号紧急指针窗口确认号保留FINSYNRSTPSHACKURG比特08162431填充源端口和目的端口字段——各占2字节。端口是运输层与应用层的服务接口。运输层的复用和分用功能都要通过端口才能实现。TCP报文格式TCP首部20字节固定首部目的端口数据偏移检验和选项(长度可变)源端口序号紧急指针窗口确认号保留FINSYNRSTPSHACKURG比特08162431填充序号字段——占4字节。TCP连接中传送的数据流中的每一个字节都编上一个编号。序号字段的值则指的是本报文段所发送的数据的第一个字节的编号。TCP报文格式TCP首部20字节固定首部目的端口数据偏移检验和选项(长度可变)源端口序号紧急指针窗口确认号保留FINSYNRSTPSHACKURG比特08162431填充确认号字段——占4字节,是期望收到对方的下一个报文段的数据的第一个字节的编号。TCP报文格式TCP首部20字节固定首部目的端口数据偏移检验和选项(长度可变)源端口序号紧急指针窗口确认号保留FINSYNRSTPSHACKURG比特08162431填充数据偏移——占4bit,它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。“数据偏移”的单位不是字节而是32bit字(4字节为计算单位)。TCP报文格式TCP首部20字节固定首部目的端口数据偏移检验和选项(长度可变)源端口序号紧急指针窗口确认号保留FINSYNRSTPSHACKURG比特08162431填充保留字段——占6bit,保留为今后使用,但目前应置为0。TCP报文格式TCP首部20字节固定首部目的端口数据偏移检验和选项(长度可变)源端口序号紧急指针窗口确认号保留FINSYNRSTPSHACKURG比特08162431填充紧急比特URG——当URG1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。TCP报文格式TCP首部20字节固定首部目的端口数据偏移检验和选项(长度可变)源端口序号紧急指针窗口确认号保留FINSYNRSTPSHACKURG比特08162431填充确认比特ACK——只有当ACK1时确认号字段才有效。当ACK0时,确认号无效。TCP报文格式TCP首部20字节固定首部目的端口数据偏移检验和选项(长度可变)源端口序号紧急指针窗口确认号保留FINSYNRSTPSHACKURG比特08162431填充推送比特PSH(PUSH)——接收TCP收到推送比特置1的报文段,就尽快地交付给接收应用进程,而不再等到整个缓存都填满了后再向上交付。TCP报文格式TCP首部20字节固定首部目的端口数据偏移检验和选项(长度可变)源端口序号紧急指针窗口确认号保留FINSYNRSTPSHACKURG比特08162431填充复位比特RST(ReSeT)——当RST1时,表明TCP连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。TCP报文格式TCP首部20字节固定首部目的端口数据偏移检验和选项(长度可变)源端口序号紧急指针窗口确认号保留FINSYNRSTPSHACKURG比特08162431填充同步比特SYN——同步比特SYN置为1,就表示这是一个连接请求或连接接受报文。TCP报文格式TCP首部20字节固定首部目的端口数据偏移检验和选项(长度可变)源端口序号紧急指针窗口确认号保留FINSYNRSTPSHACKURG比特08162431填充终止比特FIN(FINal)——用来释放一个连接。当FIN1时,表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。TCP报文格式TCP首部20字节固定首部目的端口数据偏移检验和选项(长度可变)源端口序号紧急指针窗口确认号保留FINSYNRSTPSHACKURG比特08162431填充窗口字段——占2字节。窗口字段用来控制对方发送的数据量,单位为字节。TCP连接的一端根据设置的缓存空间大小确定自己的接收窗口大小,然后通知对方以确定对方的发送窗口的上限。TCP报文格式TCP首部20字节固定首部目的端口数据偏移检验和选项(长度可变)源端口序号紧急指针窗口确认号保留FINSYNRSTPSHACKURG比特08162431填充检验和——占2字节。检验和字段检验的范围包括首部和数据这两部分。在计算检验和时,要在TCP报文段的前面加上12字节的伪首部。TCP报文格式TCP首部20字节固定首部目的端口数据偏移检验和选项(长度可变)源端口序号紧急指针窗口确认号保留FINSYNRSTPSHACKURG比特08162431填充紧急指针字段——占16bit。紧急指针指出:在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)。TCP报文格式TCP首部20字节固定首部目的端口数据偏移检验和选项(长度可变)源端口序号紧急指针窗口确认号保留FINSYNRSTPSHACKURG比特08162431填充选项字段——长度可变。TCP只规定了一种选项,即最大报文段长度MSS(MaximumSegmentSize)。MSS告诉对方TCP:“我的缓存所能接收的报文段的数据字段的最大长度是MSS个字节。”MSS是TCP报文段中的数据字段的最大长度。数据字段加上TCP首部才等于整个的TCP报文段。TCP报文格式TCP首部20字节固定首部目的端口数据偏移检验和选项(长度可变)源端口序号紧急指针窗口确认号保留FINSYNRSTPSHACKURG比特08162431填充填充字段——这是为了使整个首部长度是4字节的整数倍。TCP报文格式校验和在UDP中校验和是可选的,在TCP中校验和是强制性的,计算校验和时,要加上伪首部,伪首部中的协议字段的值为6,计算方法与UDP的检验和计算相同TCP首部20字节固定首部目的端口数据偏移检验和选项(长度可变)源端口序号紧急指针窗口确认号保留FINSYNRSTPSHACKURG填充全06TCP总长度IP目的地址IP源地址数据和选项(必须进行填充数据为2字节的倍数)校验和例题选讲下面是打印出的TCP首部,以十六进制表示:0532001700000001500207FF0002010000000100000000001)源端口号是什么?2)目的端口号是什么?3)序号是什么?4)确认号是什么?5)首部长度是什么?6)报文段的类型是什么?7)窗口值是多少?