TCP实现可靠传输的方式1、编号 2、确认机制 3、超时重传
TCP采用内核缓冲区,就是发送缓存和接收缓存,而UDP没有。
流量控制、拥塞控制
传输层的协议数据单元叫做报文段,TCP报文段、UDP报文段
网络层的协议数据单元叫做IP数据报
TCP面向字节流,只能实现点对点通信。
TCP提供可供交付、按序、不重复、不丢失、无差错。
TCP提供全双工通信。两端都设有发送缓存和接收缓存。
应用程序把数据发到发送缓存,TCP从发送缓存中取数据,构造TCP数据报。
TCP收到数据后把数据放到接收缓存中,然后应用程序从中来取数据。
。TCP对应用层的数据只看成是字节流,也即是一个一个字节,看不出其他类型或结构。
接收方的应用层数据必须有能力识别这种字节流,把它还原为有意义的应用层数据。
一个TCP数据报中的数据长度是由:1、对方的窗口值 2、网络的拥塞程度决定的。3、MSS最大报文段大小
而UDP报文的数据部分长度是应用程序给出的,也就是应用程序交给UDP多少数据,UDP一次性就发多少数据。
每一个TCP连接的两个端点是套接字Socket:IP+端口号,这个Socket和网络编程接口socket不一样。
超时重传的时间设置的过长会导致通信效率低下,设置的太短会导致不必要的重传,浪费网络资源.(网络资源主要是指带宽资源)
假如说A给B发送的确认报文丢失了,那么B会给A重传,那么A收到重传报文应该做什么呢?
答:1、丢弃这个重复的重传报文
2、对B发送确认,仍要发送确认,因为B重传就是因为没收到确认报文。
自动重传请求,滑动窗口协议(TCP协议的精髓所在),累计确认.
序号字段指的是本报文段发送的数据部分的第一个字节的序号,每一个字节都有序号,字节流的起始序号在连接建立时设置,通常是随机生成的,不是从0开始。
虽然序号会出现重复,但是实际上重复序号之间相差较大,当再次使用到这个序号时,上一个该序号早就通过网络到达终点了。
确认序号:表示希望对方下一个TCP报文段第一个字节的序号,如果确认序号是N,表示N-1之前所有序号都收到了。
数据偏移 4位,单位是4字节,就是TCP报文段的首部长度。
保留 6位 现在全部置为0
URG:紧急位,当该位为1,表示TCP报文段中有紧急数据,紧急指针有效,发送方就把紧急数据插入到本报文段数据的最前面。比如说突然要取消远程主机上某个程序的运行,用户在键盘上发出中断命令Control + C,如果不使用紧急数据,那么这两个数据存在接收缓存的末尾,那么得浪费好长时间,才会终止程序的运行。
ACK位:当ACK为1,确认序号才有效,事实上应该是除了三次握手的第一次之外,其他情况下TCP数据报的ACK字段都为1
PSH字段:表示尽快把这个报文段的数据交给应用程序。
RST位,TCP连接出现重大错误,需要先释放连接,再建立连接
SYN 位即同步位,三次握手的前两次,SYN置为1.
窗口值:2字节。指的是自己的接收窗口大小。因为每一端都有一个接收缓存和发送缓存,那么它就是告诉对方,自己的接收缓存还能接收多少数据。每一端有接收缓存和接收窗口、发送缓存和发送窗口。但是这个窗口值指的是自己的接收窗口。
检验和:TCP的检验和和UDP的检验和是一样:检测全部报文段(不像IP数据报只检查首部),在计算检验和时,要加上12字节的伪首部,采用的检验方式是:二进制反码求和。先把检验和全置为0,每16位作为一行,每两行求和,如果最高位进1,则加到末位,然后最后取反作为检验和。到了接收端也是一样,加上伪首部,也使用二进制反码求和,如果数据无误,则会全部为1.
伪首部:4B源IP+4B目标IP+1B全0填充+2B协议字段(TCP是6,UDP是17)+2B数据报长度
紧急指针: 2B,仅当紧急位为1的时候,紧急指针才有效。紧急指针指出了紧急数据的末尾在报文段中的位置,TCP会把紧急数据放到数据部分的最前面。当所有紧急数据处理完毕,TCP就告诉应用程序恢复到正常操作。值的注意的是:即使是窗口值为0,也可发送紧急数据。
MSS(maximum segment size) TCP报文段数据字段的最大长度。 MTU,数据帧的数据部分的最大长度。
选项部分有时间戳选项:10B 最主要的是时间戳字段 4B 和时间戳回送回答字段 4B
目的1:计算往返时间RTT。自己发送TCP报文段的时候,把时间戳写入时间戳字段,接收方在确认报文中将当前时间戳写入时间戳回送回答字段,然后发送方接收到确认报文后,相减即可获得RTT.
目的2:防止序号绕回,使用1Gb/s的速率发送报文段,不到35秒序号就会重复,为了让接收方把新的报文段和迟到的报文段区分开,可以加上这种时间戳。
TCP的精髓:滑动窗口协议。
TCP连接的每一端都有接收缓存和发送缓存,以及接收窗口和发送窗口。
发送窗口大小由确认报文的窗口值和网络拥塞程度确定。
比如说确认报文的确认序号是501,表示序号500之前的字节全部收到了,然后窗口值是200,则发送窗口值就是200,暂不考虑网络拥堵程度。发送窗口的第一个字节的序号就是501。
1、发送窗口中的字节可以在未收到任何确认的情况下,全部发出去
2、没有收到任何确认,发送窗口不移动,收到确认后,发送窗口就向后移动。
接收窗口也会接收未按序到达的字节,等到之前序号的字节到达后,再一起交给应用程序。
滑动窗口协议可以起到流量控制的作用:窗口值的作用
但是有时候接收窗口为0,那么B主机向A主机发送的报文显示窗口值为0,称为零窗口报文。那么假如说A主机收到零窗口报文,就会停止发送数据,如果B主机又有了空余窗口,向A主机发送了一个新的窗口值不为0的报文,但是这个报文丢失了。那么就尴尬了。双方陷入死锁。那么此时需要一个持续计时器。一旦某个主机收到了一个零窗口报文,就开启持续计时器。等到持续计时器结束还没有收到非零窗口报文,就发送一个零窗口探测报文段,只携带一个字节的数据。如果B主机仍发的零窗口报文,说明就是零窗口,否则的话就解除死锁。
流量控制是端与端之间的(只是为了接收方来得及接收)。拥塞控制是整个网络有关的。
拥塞控制是为了防止过多数据注入网络,导致路由器和链路过载。
TCP拥塞控制的四种算法:慢开始、拥塞避免、快重传、快恢复。
发送端维持一个拥塞窗口。拥塞窗口的大小取决于网络拥堵程度,并且在动态变化着。
所以发送窗口的大小取决于拥塞窗口和窗口值。
慢开始:
拥塞窗口一开始是1个MSS,就相当于一个报文段,收到确认后拥塞窗口变为两个报文段,收到一个确认,就加1,如果第二轮全部收到确认,那么下一轮就是4个报文段。
慢开始门限ssthresh
拥塞窗口小于门限值,慢开始算法
拥塞窗口大于门限值,拥塞避免算法
拥塞窗口=门限值,两者都可以用。
无论是慢开始阶段还是在拥塞避免阶段,只要网络中出现阻塞(只要没有及时收到确认,那么就认为是网络出现阻塞)就把慢开始门限设置为当前发送窗口的一半,但是不能小于2,然后拥塞窗口变为1,然后重新开始慢开始(这样做的目的是使得迅速减少主机发送到网络中的分组数。使得发生拥塞的主机能够迅速把累积的分组处理完。
拥塞避免算法:由指数增长变为线性增长,每个轮次增长1个报文段。
快重传:当接收端收到失序报文,会对最后一个按序收到的字节进行三次重复确认。发送端收到三次重复确认报文会对后面的字节进行立即重传,而不是等到超时。
快恢复:发送方收到三次重复确认,把慢开始门限减半(预防网络发生拥塞),拥塞窗口设为门限值(能收到三次重复确认,说明网络很有可能没有阻塞),然后开始拥塞避免算法。
传输控制块TCB存储了每个连接中一些重要的信息、如TCP连接表、发送和接收缓存的指针1.
SYN = 1的报文段不能携带数据,但是要消耗一个序号。
为什么要三次握手?两次不行吗?
答:这是为了防止失效的TCP连接请求报文.
考虑这种情况:如果A主机先向B发送了一个连接请求报文,丢失了。B主机没有确认,那么A主机就会再发一个请求报文。
这次B收到了,发了一个确认报文。如果两次就建立连接,假如某个时候,原来那个请求报文到了B主机,那么B会认为是一个新的请求,直接返回一个确认确认,如果两次握手,此时就建立连接了,并会等待A传输数据,B主机的资源被白白浪费。
而采用三次握手,A主机不会对B的确认进行确认,这样连接就不会建立
假如TCP连接的过程中,主机突然挂了,怎么办?
服务器中设有保活计时器(keepalive timer),通常是2小时,当服务器每次重新接收到主机发来的数据,就重置保活计时器.若两小时内没有收到客户的数据,服务器就发送一个探测报文段,以后每隔75min发送一次,如果发了10个客户还没有响应。服务器就认为客户机除了故障,关闭这个连接。
为什么要三次握手?
答:问这个就是问为什么不是两次。主要还是为了防止失效的连接请求报文。
0-1023熟知端口号,1024-49151登记端口号 49152-65535客户端使用的端口号。
UDP是面向报文的。
IP数据报的最大长度是65535,减去IP头部和TCP头部就是TCP数据部分的最大值。
在连接释放的过程中,如果在收到客户机的FIN报文后,服务器主机也恰好没有数据要发送了,可以只发送一个FIN+ACK报文。
一些问题:
1、传输层的作用
答:提供应用程序端与端之间的逻辑通信。
2、哪些应用程序使用UDP
答:对时延要求高但是对质量要求不高、一对多通信(组播)(因为TCP只提供一对一通信)
3、如何使用UDP来实现可靠传输
答:在应用程序中提供与TCP相同的功能。UDP的主要问题在于它会存在部分数据报的丢失。因为UDP也有校验功能,所以我们认为只要是被接收了的,数据是没有差错的。
4、端口的作用:
答:端口的作用是标志应用进程、寻址应用进程
5、伪首部的作用:
答:计算校验和
6、应用程序包装成UDP数据报,再包装为IP数据报,能不能直接交付IP层,不经过UDP
答:不能。IP数据报提供的是主机寻址、报头检错。而UDP提供应用进程寻址和数据检错。
7、一个IP数据报将一个TCP数据报分成4片,第一个前两片丢失,第二次重传后后两个丢失,问:重传的前两片能不能和第一次传的后两片组合起来。
答:不能。IP数据报有标志字段,这个字段它不像TCP的序号字段起序号的作用,它唯一的作用就是用于分片,就判断哪些分片是属于同一个IP数据报。重传的IP数据报和原先的IP数据报的标志是不一样,它们的分片不能合并。
8、语音传输可以使用UDP吗?
答:如果不是实时语音服务可以使用TCP,但是实时的话,必须使用UDP.
9、A使用TCP给B发数据,某个TCP报文段到了B,B发出的确认报文丢失了,结果A并没有重传该报文,为什么?
答:因为A收到了B更高序号的确认。
10、不是因为网络拥塞导致的分组丢失
答:1、IP数据报进行了分片,最后一个分片没有及时到达终点、组装IP数据报超时、则只能丢弃该数据报。2、终点主机的缓存空间不够,丢弃该数据报