Problems 关于 TCP
一个网页图像传输时.TCP将其划分为长度为MSS(Max segment size)的若干块,(最后一块除外,一般小于MSS)
-
16位端口号:标示该段报文来自哪里(源端口)以及要传给哪个上层协议或应用程序(目的端口)。进行tcp通信时,一般client是通过系统自动选择的临时端口号,而服务器一般是使用知名服务端口号或者自己指定的端口号。
-
32位序号(sequenc enumber):一次TCP通信(从TCP连接建立到断开)过程中某一个传输方向上的字节流的每个字节的编号。假设主机A和主机B进行TCP通信,A发送给B的第一个TCP报文段中,序号值被系统初始化为某个随机值ISN(Initial Sequence Number,初始序号值)。那么在该传输方向上(从A到B),后续的TCP报文段中序号值将被系统设置成ISN加上该报文段所携带数据的第一个字节在整个字节流中的偏移。例如,某个TCP报文段传送的数据是字节流中的第1025 ~ 2048 字节,那么该报文段的序号值就是ISN+1025。另外一个传输方向(从B到A)的TCP报文段的序号值也具有相同的含义。
主机开启TCP会话,初始序列号随机在 0~2^32 - 1(4294967295)之间. -
32位确认号(acknowledgement number):用作对另一方发送来的TCP报文段的响应。其值是收到的TCP报文段的序号值加1。假设主机A和主机B进行TCP通信,那么A发送出的TCP报文段不仅携带自己的序号,而且包含对B发送来的TCP报文段的确认号。反之,B发送出的TCP报文段也同时携带自己的序号和对A发送来的报文段的确认号。
例子1
主机A与主机B通信,假设主机A已收到主机B 0~535的所有字节,然后它要发一个报文段给B,那么就会在确认号填上536.
例子2
主机A收到了0~535 和9001000的报文段,还没有收到536899报文段,这时报文段确认字号仍为536.
像例子2中失序报文段的处理
实践中选择接收方保留失序字节,并等待缺少的字节填补间隔这种方式. -
4位头部长度,标识该TCP头部有多少个32bit(4Byte) (一行8字节)(虽然实际传输中没有一行这样的说法),TCP头部最长是60Byte(2^4-1 = 15 15*4 = 60)
-
六位标志位
- URG(urgent pointer)标志,表示紧急指针是否有效。
- ACK(acknowledge)标志,表示确认号是否有效,一般称携带ACK标志的TCP报文段为“确认报
文段”。 - PSH(push)标志,提示接收端应用程序应该立即从TCP接收缓冲区中读走数据,为接收后
续数据腾出空间(如果应用程序不将接收到的数据读走,它们就会一直停留在TCP接收缓冲
区中)。 - RST标志,表示要求对方重新建立连接,一般称携带RST标志的TCP报文段为“复
位报文段"。 - SYN(Synchronize Sequence Numbers)(同步序列编号)标志,表示请求建立一个连接,一般称携带SYN标志的TCP报文段为“同步
报文段”。 - FIN标志,表示通知对方本端要关闭连接了,一般称携带FIN标志的TCP报文段为
“结束报文段”。
-
16位接收窗口字段,用于流量控制.用于指示接收方本端愿意接受的字节数量
-
16位校验和,对TCP的头部和数据部分使用CRC算法进行校验.保证TCP可靠传输.
-
16位紧急指针( urgent pointer): 是-一个正的偏移量。它和序号字段的值相加表示
最后一个紧急数据的下一字节的序号。因此,确切地说,这个字段是紧急指针相对当前序号
的偏移,不妨称之为“紧急偏移”。TCP的紧急指针是发送端向接收端发送紧急数据的方法。
我们将在后面讨论TCP紧急数据。
三次握手和四次挥手
TCP状态流转图
TCP建立连接
在建立连接的时候,通信的双方要互相确认对方的最大报文长度(MSS),以便通信。一般这个SYN长度是MTU减去固定IP首部和TCP首部长度。对于一个以太网,一般可以达到1460 Byte。当然如果对于非本地的IP,这个MSS可能就只有536 Byte,而且,如果中间的传输网络的MSS更加的小的话,这个值还会变得更小。
三次握手 SYN洪泛攻击
SYN cookie[RFC 4987]部署在主流操作系统之中
如何随机选择初始序号
[CERT 2001-09]