############################# TCP三次握手 ###############################

 

tcp三次握手详解

Source Port&Destination Port(来源端口&目标端口):我们知道IP数据包的传送方式主要是
通过IP地址连接两端,但是到底这个连接的通道是连接到哪里去?没错,就是连接到Port上,
例如一个www.sina.com有开发www服务器,这表示新浪网址的主机需要启动一个可以让Client
端连接的端口,这个端口就是Port,同样的,客户端想要连接到新浪网站时,就需要在Client
主机上面启动一个Port,这样两个主机才能利用这条通道来传递数据包数据,这个目标与来源
Port的记录,可以说是TCP数据包上最重要的参数

Sequence Number(数据包序号):由于TCP数据包需要带入IP数据包当中,所以如果TCP数据太
大时(大于IP数据包的容许程度),就得要进行分段。这个Sequence Number就是记录每个数据
包的序号,可以让接收端重新将TCP的数据组合起来。

Acknowledge Number(回应序号):为了确认主机端确实有收到我们Client端所送出的数据包
数据,我们Client端当然希望能够收到主机方面的响应,那就是这个Acknowledge Number的用
途。当Client端收到这个确认码时,就能够确定先前传递的数据包已经被正确的收下了

Data Offset(信息补偿):在图中倒数第2行有个Options字段,这个Options字段的长度是非
固定的,为了确认整个TCP数据包的大小,就需要这个标志来说明整个数据包区段的起始位置

Reserved(保留):未使用的保留字段

Code(Control Flag),控制标志码):当我们在进行网络连接的时候,需要说明这个连接的
状态,好让接收端了解这个数据包的主要操作,这可是一个非常重要的句柄,这个字段共有
6个bits,分别代表6个句柄,若为1则为启动,分别说明:

1) URG(Urgent):若为1则代表该数据包为紧急数据包,接收端应该紧急处理,且图中的Urgent
 Pointer字段也会被启用
2) ACK(Acknowledge):若为1代表这个数据包为响应数据包,则与上面提到的Acknowledge
Number有关
3) PSH(Push Function):若为1,代表要求对方立即传送缓冲区内的其他对应数据包,而
无须等待缓冲区满了才送
4) RST(Reset):如果RST为1的时候,表示连接会马上结束,而无须等待终止确认手续,
这就是说,这个是强制结束的连接,且发送端已断线
5) SYN(Synchronous):若为1,表示发送端希望双方建立同步处理,也就是要求建立连接。
 通常带有SYN标志的数据包表示主动要连接到对方的意思
6) FIN(Finsh): 若为1,表示传送结束,所以通知对方数据传毕,是否同意断线,只是发
 送者还在等待对方的响应而已
 
其中比较常见的应该是ACK、SYN、FIN等,这3个句柄是务必要记下来的。

Window(滑动窗口):主要是用来控制数据包的流量,可以告知对方目前本身有的缓冲器
 容量(Receive Buffer)还可以接收数据包。当Window=0时,代表缓冲器已经额满,
 应该要暂停传输数据。Windows的单位是Byte
Checksum(确认校验码):当数据要有发送端送出前,会进行一个检验的操作,并将该操作
 的检验值标注在这个字段上,而接收者收到这个数据包之后,会再次的对数据包进行
 验证,并且比对原发送的Checksum值是否相符,如果相符就接受,若不符就会假设该
 数据包已经毁损,进而要求对方重新发送此数据包
Urgent Pointer(紧急信息):当Code字段内的URG=1时,Urgent Pointer才会产生作用
 可以告知紧急数据所在的位置
Options(任意信息):目前此字段仅应用于表示接收端可以接收的最大数据区段容量,若此
 字段不使用,表示可以使用任意数据区段的大小,这个字段较少用
Padding(补足字段):如同ip数据包需要有固定的32bits表头一样,Options由于字段非
 固定,所以也需要Padding字段来加以补齐才行
 
 

 

tcp三次握手详解


TCP三次握手流程:
 A:数据包发起。当客户端想要对服务器端连接时,就需要送出一个要求连接的数据包,
  此时客户端必须随机取用一个大于1024的端口来作为程序通信的接口,然后在TCP
  的表头中,需要带有SYN的主动连接(SYN=1),并且记下发送出连接数据包给服务
  器端的序号(Sequence Number=10001)
 B:数据包接收与确认数据包传送。当服务器接收到这个数据包,并且确定要接收这个
  数据包后,就会开始制作一个同时带有SYN=1、ACK=1的数据包,其中那个Acknowledge
  的号码是要给Client端确认用的,所以该数字会比(A步骤)里面的Sequence号码多
  一号(ack=10001+1=10002),服务器也需要确认客户端确实可以接收我们的数据包
  才行,所有也会发送出一个Sequence(seq=20001)给客户端,并且开始等待客户
  端给我们服务器端的响应
 C:回送确认数据包。当客户端收到来自服务器端的ACK数字后(10002)就能够确认
  之前那个要求数据包被正确地接收,接下来如果客户端也同意与服务器端建立
  连接,就会再次发送一个确认数据包(ACK=1)给服务器,即Acknowledge=20001+1=20002
 D:取得最后确认。若一切顺利,在服务器端收到带有ACK=1且ack=20002序号的数据包后
  ,就能够建立起这次的连接了
  
 不论是服务器还是客户端,都需要通过一次SYN与ACK来建立连接,所以总共会进行3次
 握手
  

 

注:当我们使用tcpdump在Router上面监听明文的传输数据时,例如FTP传输协议,你觉得会
 发生什么问题?我们先在主机端执行“tcpdump -i lo port 21 -nn -X",然后登陆并输入
 密码,结果你会发现可以监听到FTP的用户名和密码
 
 例:#   tcpdump -nn -X 'port 80'
   17:53:02.241489 IP 123.125.71.77.16161 > 10.156.239.0.80: P 1:262(261) ack 1 win 1460
 0x0000:  4500 012d 6c6e 4000 2d06 23f6 7b7d 474d  [email protected]#.{}GM
 0x0010:  0a9c ef00 3f21 0050 b348 d746 b075 6c65  ....?!.P.H.F.ule
 0x0020:  5018 05b4 8606 0000 4745 5420 2f66 6f72  P.......GET./for
 0x0030:  756d 2e70 6870 3f6d 6f64 3d66 6f72 756d  um.php?mod=forum
 0x0040:  6469 7370 6c61 7926 6669 643d 3226 7061  display&fid=2&pa
 0x0050:  6765                                     ge
17:53:02.241565 IP 10.156.239.0.80 > 123.125.71.77.16161: . ack 262 win 14
 0x0000:  4500 0028 3ee5 4000 4006 3f84 0a9c ef00  E..(>[email protected]@.?.....
 0x0010:  7b7d 474d 0050 3f21 b075 6c65 b348 d84b  {}GM.P?!.ule.H.K
 0x0020:  5010 000e 0b7f 0000                      P.......
17:53:02.283377 IP 10.156.239.0.80 > 123.125.71.77.16161: . 1:2921(2920) ack 262 win 14
 0x0000:  4500 0b90 3ee6 4000 4006 341b 0a9c ef00  E...>[email protected]@.4.....
 0x0010:  7b7d 474d 0050 3f21 b075 6c65 b348 d84b  {}GM.P?!.ule.H.K
 0x0020:  5010 000e c7e9 0000 4854 5450 2f31 2e31  P.......HTTP/1.1
 0x0030:  2032 3030 204f 4b0d 0a53 6572 7665 723a  .200.OK..Server:
 0x0040:  206e 6769 6e78 0d0a 4461 7465 3a20 5375  .nginx..Date:.Su
 0x0050:  6e2c