废话
1.TCP报文的定义格式:
2.TCP报文的电/光/波信号形式
通过电话线传输就电信号咯(找个电子打火机打一下,估计里面的蓝光类似)
途径一段路由器有光缆,就变成了光信号咯(就跟激光灯差不多吧)
途经无线电,就变成无线电波形式咯(就跟声音差不多)
3.TCP报文的二进制形式
把2里面的形式变成二进制数据存在了存储设备里面,大概可能长这样:
1101010111011111 0010001010111000 ......
太多了只显示两个端口号的数据好了
4.TCP报文的十六进制形式
操作系统把二进制形式转化成十六进制方便理解计算啥的,长这样(图侵删)
5.然后根据上面的就知道数据表达的意思了
源端口号2字节: d5 df (54751)
目的端口2字节: 22 b8 (8888)
TCP报头中的源端口号和目的端口号同IP数据报中的源IP与目的IP唯一确定一条TCP连接
序号(seq4字节) 37 59 56 75
确认序号(ack 4字节)00 00 00 00
由于该报文为SYN报文,ACK标志为0,故没有确认序号(ACK标志为1时确认序号才有效)
一旦连接建立,该值将始终发送(同ACK标志)
首部长度(4 位) 1000,(转化为10进制是8 8×32/8 = 32,该报文头部长度为32个字节)
存在该字段是因为TCP报头中任选字段长度可变报头不包含任何任选字段则长度为20字节;4位所能表示的最大值为1111,转化为10进制为15,15×32/8 = 60,故报头最大长度为60字节
标志位(12位)0000 0000 0010
Reserved保留3位:000 必须置为0
ENC 3位:000 显示拥塞通告。
控制位6位
URG:0 Ugent(16位紧急指针有效标志)
ACK:0 确认序号有效标志(一旦一个连接建立起来,该标志总被置为1即除了请求建立连接报文(仅设置Syn标志位为1),其它所有报文的该标志总为1)
PSH:0 推送标志
RST:0 重置连接标志
SYN:1 同步序号标志
FIN:0 传送数据结束标志
窗口大小(2字节):TCP流量控制通过连接的每一端声明窗口大小进行控制(接收缓冲区大小)
20 00(00100000 00000000)= 8192 最大65535
检验和(2字节):检验和覆盖整个TCP报文段;强制字段,由发送端计算存储,由接收端进行验证
2e 2f
紧急指针(2字节):当Urgent标志置1时,紧急指针才有效
00 00
任选字段(0 - 40字节):不想写,参考文件www.networksorcery.com/enp/protocol/tcp.htm
正题
1.三次握手
概念
TCP握手协议:在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接
第一次握手
建立连接时,客户端发送SYN包,例如seq = 200 ,SYN = 1 (200是随机产生的一个值,TCP规定SYN = 1的时候不能携带数据)给服务器,然后Socket进入SYN_SENT状态
第二次握手
服务器收到SYN报文段进行确认,发一个将SYN=1,ACK = 1,seq = 300,ack = 201(ack确认号为收到的序列号+1,ACK=1表示确认号有效,建立成功全程都是1,300是随机生成的)
第三次握手
客户端再进行一次确认,发一个ACK = 1,seq = 201,SYN = 0,ack = 301,ACK = 1(seq为第一次发送的seq+1,SYN从此都是0,ack为服务器确认的seq+1,ACK从此都是1)
建立成功
四次挥手
tcp四次挥手,由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。
由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
第一次挥手:
主机1向主机2发送FIN报文段,表示关闭数据传送,并主机1进入FIN_WAIT_1状态,表示没有数据要传输了
第二次挥手
主机2接受到FIN报文后进入CLOSE_WAIT状态(被动关闭),然后发送ACK确认,表示同意了主机1的关闭请求
第三次挥手
主机2等待主机1发送完数据,发送FIN到主机1请求关闭,主机2进入LAST_ACK状态,
第四次挥手
主机1收到主机2发送的FIN后,回复ACK确认到主机2,主机1进入TIME_WAIT状态,主机2收到主机1的ACK后就关闭连接了,状态为CLOSED,主机1等待2MSL,仍然没有收到主机2的回复,说明主机2已经正常关闭了,主机1关闭连接
MSL(Maximum Segment Lifetime):报文最大生存时间,是任何报文段被丢弃前在网络内的最长时间。当主机1回复主机2的FIN后,等待(2-4分钟),即使两端的应用程序结束。