tcp三次握手详解

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

 

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

Sequence Number(数据包序号):因为TCP数据包须要带入IP数据包当中,因此若是TCP数据太
大时(大于IP数据包的允许程度),就得要进行分段。这个Sequence Number就是记录每一个数据
包的序号,可让接收端从新将TCP的数据组合起来。服务器

Acknowledge Number(回应序号):为了确认主机端确实有收到咱们Client端所送出的数据包
数据,咱们Client端固然但愿可以收到主机方面的响应,那就是这个Acknowledge Number的用
途。当Client端收到这个确认码时,就可以肯定先前传递的数据包已经被正确的收下了网络

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

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

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字段来加以补齐才行
 
 3d

 


TCP三次握手流程:
 A:数据包发起。当客户端想要对服务器端链接时,就须要送出一个要求链接的数据包,
  此时客户端必须随机取用一个大于1024的端口来做为程序通讯的接口,而后在TCP
  的表头中,须要带有SYN的主动链接(SYN=1),而且记下发送出链接数据包给服务
  器端的序号(Sequence Number=10001)
 B:数据包接收与确认数据包传送。当服务器接收到这个数据包,而且肯定要接收这个
  数据包后,就会开始制做一个同时带有SYN=一、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次
 握手
  blog

 

注:当咱们使用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  E..-ln@.-.#.{}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..(>.@.@.?.....  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...>.@.@.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

相关文章
相关标签/搜索