TCP报文段首部格式
大部分TCP报文头部都是20个字节,有的数据包要加上选项。
上面一行代表4个字节,源端口和目的端口都是2个字节。
TCP协议是面向字节流的协议
TCP是一段一段分块的发送数据的
序号指的就是你当前分段的数据块的第一个字节在整个文件中的位置,就是对应的序号。对端收到数据之后,按照序号的从小到大重新组装起来,得到的就是我们要发送的文件。所以TCP是面向字节流的协议。
确认号:
如果被叫收到了序号是1的数据段,该数据段的长度是4个字节,最后一个字节的是4,那么下次我想收到的数据段的序号应该是5开始的,所以这里的确认号就是5.
如果收到的数据段的最后一个字节是180,那么确认号就是181
字段数据偏移:
该字段用来指定TCP首部的大小,如果这里的值是40,减去固定的20个字节,tcp首部那么偏移的大小就是20.
用来表示TCP的报文段。
例如数据偏移的值占4位,如果是1111,对应的值是15,此时还要剩4,表示TCP的头部是60个字节,偏移就是40个字节。
所以TCP的头部最小是20个字节,最大是60个字节。
上面就是web客户端向web服务器申请网易数据,xp向web发送一个数据,第一个包序号是1,确认号也是1(希望web服务器发送序号是1的数据包),数据的长度是203个字节
web服务收到请求之后,连续发送了两个数据包,确认号都是是204表示收到了客户端序号是1长度是203个字节的数据,希望下次发送的数据的序号从204开始
标记为URG标记位如果是1表示不管发送缓存中最后还有多少数据需要发送,该数据段都优先传输。
Ack和syn主要用在TCP握手的三次连接中使用
syn是tcp的请求建立连接的标志位:
第一包数据:序号是0,发送数据的长度是0,因为没有收到对端的数据,所以确认号是0,
Syn的标志位设置成1,这里没有发送的数据,只发送TCP的20个字节的头部
第二包数据:序号是0,因为收到了对端的数据(数据的长度是0,序列号是0),那么确认号是1,发送数据的长度也是0,同时标志位syn和ack 都是1
第三包:发送写序列号是1,确认号也是1,同时将ack标志位设置成1
syn的攻击:
我们可以弄很多假的客户端去和服务器建立TCP连接,导致服务器瘫痪
第二种情况就是:让服务器和服务器自己建立大量的TCP连接,导致服务器资源耗尽。
Psh字段的作用:
接受端接受数据是按照缓存中的数据依队列依次交给上层应该程序去处理,如果收到的数据中带有psh标志位,表示直接将数据放在缓存的头部,优先立刻可以提交给应该程序。
RST标志位:
表示会话过程中TCP连接异常终端,RST标志位是1.
FIN表示正常结束连接,比如网页传输完成了,web服务器给客户端回复一个FIN数据包,正常断开TCP连接。
TCP的窗口字段:占2个字节
在TCP三次握手的时候,A计算机会告诉B计算机字节接受缓存的大小是65535,那么A计算机最大的发送缓存就是65535.
同理B计算机也会告诉A计算机自己的最大接受缓存是64034自己,A计算机最大的发送缓存就是64034字节。
依据对方的接受窗口大小来设置自己的发送窗口大小。
校验和字段:
校验的TCP的首部和数据字段再加上12个字节的伪首部三个部分组成
我们来看下udp的校验:
TCP校验和计算方法同上,只需要将版本号17换成6就可以了。TCP的协议号是6
紧急指针只有在URG标志位是1的时候才有用,如果紧急指针的值是50,表示TCP数据部分的前50个字节的数据需要紧急发送。
选项字段:
选项指针:
在tcp三次握手的时候可以通过选项告诉对端自己tcp包最大传输的字节MSS是1460字节
还可以告诉对端选择性确认功能:
还可以告诉对端支持SACK选择性确认功能。
2 TCP如何实现可靠性传输
网络层是主要是实现数据的传输,不保证数据的可靠传输,数据的可靠传输是在传输层实现的。
A发了M1,在规定的时间内如果没有收到对端M1的确认,就重新发送M1.
B收到了两个M1,丢弃第二次重复的M1数据
停止等待协议的缺点就是信道利用太低
我们来看看下面这种方式
现在发送12个数据包
窗口的大小是5
先发送 1 2 3 4 5这五个数据包
当收到第一个数据包的回复之后,窗口向右移动,第一个数据包可以从缓存中删除掉。
发送窗口中的数据包只有收到确认之后才能够从滑动窗口中删除。
累计确认
B计算机说收到了第三个数据包,表示前三个数据包都都收到了,第一个数据包和第二个数据包就不用再回确认信息了
B收到了第一个数据包,第二个数据包,第四个数据包,第三个数据包在传输的过程中丢失了,这个时候B给A回复的确认标识是2,A要重新传输第三个数据包和第四个数据包。