TCP/IP-TCP
作者:Danbo 2015-8-23
TCP通过以下方式来提供可靠性:
-应用数据被分割成TCP认为最合适发送的数据块。
-当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
-当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒。
-TCP将保持它首部和数据的校验和。注意IP只覆盖头部,上层比如UDP、ICMP等都有覆盖自己头部和数据的校验和,这单IP没有必要再次校验了。
-既然T C P报文段作为I P数据报来传输,而I P数据报的到达可能会失序,因此T C P报文段的到达也可能会失序。如果必要, T C P将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。
-既然I P数据报会发生重复, T C P的接收端必须丢弃重复的数据。
-T C P还能提供流量控制。T C P连接的每一方都有固定大小的缓冲空间。T C P的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。
-两个应用程序通过T C P连接交换8 bit字节构成的字节流。T C P不在字节流中插入记录标识符。我们将这称为字节流服务( byte stream service)。
TCP的首部:
注意序列号字段指成功传输一个字节序列号加1。
SYN/FIN标志消耗一个序号。其他的标志位都不算。
对于攻击者可以利用TCP保留的6bit传输控制信令对目标主机进行攻击。
序列号应当是上次成功收到数据字节序号加1。只有ACK标志位置1时确认序号字段才有效。
发送ACK无需任何代。ACK除了第一个SYN包没有外,其他任何包的ACK位都被置为1。
TCP是全双工,两个方向都有字节流,都有序列号。
TCP是没有选择确认或选择否认的滑动窗口协议,不能选择确认:即收到的数据包中中间某个包没收到,不能确认每收到包的后一个包;没有选择否认,即收到的包中某个包CRC校验失败,那么TCP不能够告诉发送端,这个包是错的,他只能还发送错误报之前的包的序列号+1的ACK Sequence包。
TCP最常见的选项字段是MSS(Maximum Segment Size),每个连接方向通常都在通信的第一个报文段(为建立连接而设置SYN标志的那个段)中指明这个选项。它指明本端所能接收的最大长度的报文段,因为发包之前会协商这个参数,这点导致一般情况下TCP数据包不会分片。
TCP报文段中的数据部分是可选的,我们知道在一个连接建立和一个连接终止时,双方交换的报文段仅有TCP首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段。
当建立一个连接时,每一方都有用于通告它期望接收的M S S选项(M S S选项只能出现在S Y N报文段中)。如果一方不接收来自另一方的M S S值,则M S S就定为默认值5 3 6字节(这个默认值允许2 0字节的I P首部和2 0字节的T C P首部以适合5 7 6字节I P数据报)。Telnet直连设备为1460,非直连链路为536。一般都小于1500。这个就是TCP一般不会分片的原因,除非中间路由器故意调小MTU值。
客户端发送SYN包,包含序列号,不过这个序列号是乱的。你要截获一个TCP连接还是很困难的,你要知道源目IP,源目端口号,还要知道序列号,而这个初始序列号是随机出现的,以后数据包的序列号就跟本端所传输的数据多少有关系了。而为什么防火墙要扰乱序列号呢,因为这个序列号在操作系统看来是有一定算法实现的,这样就能大概才做序列号范围(1024-5000之间),这样防火墙就去扰乱初始化序列号。
TCP建立连接是有超时时间的,第一次大概为6s,第二次
我们在路由器上想要清某个TCP连接可以先:show tcp brief 找到TCP的号,然后:clear tcp tcb +号就可以清掉该连接。
复位报文段:
一般来说,无论何时一个报文段发往基准的连接(Referenced Connection)出现错误,TCP都会发出一个复位报文段(这里的基准连接指的是一个四元组确定的连接。)来终止这个连接。
同时打开:
即通过四次握手,要注意的是我们没有将任何一端称为客户或服务器,因为每一端既是客户又是服务器。还有一点要注意,同时打开其端口号的问题:一段端口号为8000连接另一端的80端口,而另一端的80端口连接本段的8000端口,这个端口号与三次握手时一样,这个不能误解了。
同时关闭:
两边同时发FIN,两边都会进入Time_Wait状态。
TCP的交互数据流
TCP分为交互数据流和成块数据流,交互数据流我们举个例子:Rlogin应用,当我们在本端输入数据的时候,数据是先发送到对端,然后对端接收后返回,然后本端应用程序再打印出之前输入的数据,这个就是在网络卡的时候出现输入和显示出现延迟的原因。
其步骤如下图所示:
(1)来自客户的交互按键;
(2)来自服务器的按键确认;
(3)来自服务器的按键回显;(注意密码是不会回显的,仅会回复确认。)
(4)来自客户的按键回显确认。
通常T C P在接收到数据时并不立即发送A C K;相反,它推迟发送,以便将A C K与需要沿该方向发送的数据一起发送(有时称这种现象为数据捎带A C K)。绝大多数实现采用的时延为200 ms,也就是说,T C P将以最大200 ms 的时延等待是否有数据一起发送。
纳格算法要求一个TCP连接上最多只能有一个未被确认的分组,这样TCP在发送这些小分组前就会在有线时间内收集这些小分组,然后一起发送出去。这种一般用在低速链路上,高速链路用不到。
路由器启用命令为:service nagle
Telnet和tftp都是明文传输的。