tcp123.125.70.87tcp点是什么意思思

TCP建立连接和断开连接细节
Https如何保證通信安全
一次Https网络请求通信细节
网络数据包分析工具wireshark的使用
SYN、ACK、FIN具体含义是什么
TCP建立连接超时的表现?

为什么需要证书来下发服务端公钥
客户端是如何验证证书合法性的?
对称秘钥是如何协商出来的
为什么不直接让客户端自己生成一个秘钥发送给服务端使用?
TLS如何避免重放攻击

TCP数据段分为首部+数据两部分。
首部又分为固定首部和可选项首部
通过对TCP数据包格式的分析,就是了解TCP协议定义的过程

來源连接端口(16比特位)-辨识发送连接端口
目的连接端口(16比特位)-辨识接收连接端口
序列号(seq,32比特位)-TCP数据包标识
无惧传输时的乱序或丢包
建立连接时发送和接收方第一次数据段的seq均为随机生成(TCP序号预测攻击),之后是上次序列号加1
发送数据时seq为上一次发送的数据長度加1如果数据长度为0则seq不变
确认号(ack,32比特位)-表示接收方期望下次收到的数据包的序列号的值也是当前收到的数据的字节长度加1
數据偏移(4比特位)-以4字节为单位计算出的数据段开始地址的偏移值,例1111 -> 15 -> 60字节
保留位(3比特位)-需置为0
CWR:Congestion Window Reduced 拥塞窗口减少标志被发送主机设置用来表明它接收到了设置ECE标志的TCP包。拥塞窗口是被TCP维护的一个内部变量用来管理发送窗口大小
ECE:ECN-Echo(显式拥塞通知回显) ECN响应标志被用来茬TCP3次握手时表明一个TCP端是具备ECN功能的,并且表明接收到的TCP包的IP头部的ECN被设置为11 NS/CWR/ECE三个标志组合实现估计网络拥塞情况的功能
URG:为1表示高优先級数据包紧急指针字段有效
ACK:为1表示确认号字段有效
PSH:为1表示是带有PUSH标志的数据,指示接收方应该尽快将这个报文段交给应用层而不用等待缓冲区装满
RST:为1表示出现严重差错可能需要重新创建TCP连接,还可以用于拒绝分发的报文段和拒绝连接请求
SYN:为1表示这是连接请求或昰连接接受请求用于创建连接和使顺序号同步
FIN:为1表示发送方没有数据要传输了,要求释放连接
窗口(WIN 16比特位)-表示从确认号开始本報文的接收方可以接收的字节数,即接收窗口大小用于流量控制
校验和(Checksum 16比特位) -对整个TCP报文段,包括TCP首部和TCP数据计算出来的16位值,這是一个强制字段校验方式为:将TCP报文段的头部和数据部分的和计算出来,再对其求反码
紧急指针(16比特位)-本报文段中的紧急数据的朂后一个字节的序号
选项字段 -最多40字节每个选项的开始是1字节的kind字段,说明选项的类型下面具体说明支持的选项字段类型
0:(1字节)選项表结束
1:无操作(1字节)用于选项字段之间的字节边界对齐和分割不同的选项数据
2:最大报文长度(4字节,Maximum segment sizeMSS) -在握手阶段告知接收方,发送方支持的最大报文数据段的长度以太网一般为1460。只能出现在同步报文段中否则将被忽略。通常将MSS设置为MTU-40字节(Maximum Transmission Unit 最大传输单元)这样携带TCP报文段的IP数据报的长度就不会超过MTU,从而避免本机发生IP分片
3:窗口扩大因子(3字节,wscale)-取值0-14用来把TCP的窗口的值左移的位數。只能出现在同步报文中否则将被忽略。这是因为现在的TCP接收数据缓冲区(接收窗口)的长度通常大于65535字节
5:SACK实际工作的选项存放丟包的边界信息,最多存放4个包的边界信息例如123,丢了2那么SACK存放的就是2号包的开始和结束的字节序列号
用来计算往返时间RTT(Round-Trip Time),发送方在收到确认报文后可以准确计算出RTT。
防止回绕的序列号通过时间戳可以判断出相同序列号的数据报,哪个是最近发送的哪个是以湔发送的。
简单一句话就是接收方可以动态控制发送方下次发送的TCP包数据段的大小
当接收方处理数据较慢时,就可以通过WIN字段在ACK包中告知发送方:“以后的数据段少发一些,我处理不过来了”
在极端情况下,接收方连1字节的数据也不能处理了那么WIN字段就设置为0,发送方就会停止发送后续的TCP包
那么,当接收方缓过气来可以处理更多数据时,发送方是怎么知道的呢答案是Zero Window Probe(零窗口探针)技术。
发送方会在一定时间间隔内重复发送ZWP包这时接收方就有机会告知发送方最新的窗口大小。
又有极端情况接收方一直返回WIN为0,那么发送方茬发送一定次数的ZWP后就会发送RST包来断开连接(不同的系统有不同的实现)。

另外一种极端情况接收方返回的WIN值特别小,相对于TCP的首部來说发送较少的数据时一种浪费。这个时候接收方就会使用David D Clark’s 方案接收方直接返回WIN为0,知道接收方有足够的能力处理新数据时再把WIN打開

如果是由于发送方发送的数据特别少引起的,那么发送方就会使用Nagle’s algorithm将多个小的数据包缓存起来,直到满足发送条件

一个支持ECN的TCP主机在支持ECN的TCP连接上发送设置了IP头部为10或者01的TCP包。支持ECN的路由器在经历拥塞时设置IP头部的ECN域为11当一个TCP接收端发送针对收到的一个设置ECN位為11的TCP包的响应时,它设置TCP包头中的ECE并且在接下来的ACK中也做同样设置。

当发送主机接收到设置了ECE标志的ACK时它就像感知到包丢失一样,开始减少发送窗口运行慢启动过程和拥塞避免算法。在下一个数据包中发送者设置CWR标志。在接收到新的设置CWR标志的包时接受者停止在接下来的ACK中设置ECE标志。

如果发送方在发送一个SYN包后在超时时间内没有收到确认包,则发送方会重新发送称为超时重发。
默认Linux重试次数為5次重试时间间隔由1s开始每次翻倍,即1s,2s,4s,8s,16s如果经过1+2+4+8+16+32=63s后,仍没有收到确认包则发送方认为接收方已掉线,会主动断开当前连接

为了网絡整体的稳定,需要动态的根据往返时间设置数据包的超时时间这里就不展开说具体算法过程了。

三次握手 和 四次挥手

这是简单的三次握手流程示意图三次握手意思是需要在发送方和接收方之间传递三个数据包。通过设置不同的标识位来告知对方当前数据包的意图。

苐一次:C发送一个数据包P1给S并将标识位的SYN置为1,表明“我要和你建立连接”

第二次:S如果可以接受C的请求,会给C回发一个数据包P2并將标识位SYN置为1,表明“我同意和你建立连接”同时将ACK位置为1,表明“确认号ack”字段有效其值为P1数据包序列号+1。

第三次:C接到P2后会再佽向S发送数据包P3,将ACK为置为1其值为P2数据包的序列号+1,表明“我知道了你同意了”

至此,连接就被建立完成了双方就可以任意发送数據了。

但是在三次握手过程中,除了要协商连接的建立还有其他通讯参数的设置。下面以一个真实请求在三次握手过程中发生的数据茭换作说明:

这是TCP连接断开时四次挥手的示意图划重点:

每一侧的连接都单独的被终止。
主动终止连接的一方在接收到ACK后不能再发送數据,但可以接收数据也就是半双工状态。
首先终止连接的一方在给对方响应了ACK后,就会等待2*MSL(Max Segment Lifetime 报文最大生存时间)时间然后关闭连接。RFC793定义了MSL为2分钟Linux设置成了30s。
四次挥手也可以通过三次握手实现即主机A发出FIN,主机B回复FIN&ACK主机A回复ACK。
下面是三次握手实现的连接断开的報文传输细节:

身份认证防止中间人攻击
系统或浏览器正确的实现了Https并安装了正确的证书颁发机构

两个秘钥,公钥公开私钥不公开
公鑰加密的数据,私钥可以解密私钥加密的数据,公钥可以解密

非对称加密算法除了可以直接将隐私数据加密外还可以实现对非隐私数據的防篡改校验功能,也就是数字签名

以任意长度的数据为输入,输出固定长度的数字“指纹”
MAC,消息认证码是带秘钥的Hash算法,即茬对数据计算散列值时将秘钥和数据同时作为输入并采用二次散列迭代的方式。

一些坏人可以在明文的传输过程中对数据进行更改。

當两人见面后发现对方误会了自己,就想到这个世界还是有坏人然后双方约定将通信内容加密后再发送给对方。约定的加密算法为AES秘钥为“Alice/Bob”。
加密后就会出现两种情况:

坏人虽然不能窃听内容但是仍能篡改。
对称加密的秘钥只能Alice和Bob两个人知道如果想再和更多的囚加密通信的话,就无能为力了
Alice和Bob必须在通信之前就约定好秘钥(在互联网世界中办不到),中途无法更新
所以,我们要解决这些问題需要做到:

为了过滤掉被篡改的数据,通信过程需要有内容校验机制
为了可以和无限多人通信需要能动态生成和更新秘钥
Alice和Bob非常聪奣,他们想到了非对称加密算法RSABob拿着私钥,然后把公钥给Alice当Alice想要和Bob通信时,利用手中的公钥将对称加密算法的秘钥加密后发送给BobBob拿著自己的私钥将对称加密的秘钥解密后,双方就可以继续用对称加密算法将数据加密后通信了当然,其他人也可以拿到Bob的公钥与Bob通信。

上述第二个过程是无懈可击的但是第一个过程中,如果存在坏人的话就变成下面的情形

完犊子了,对称加密的秘钥被坏人窃取了通信数据又相当于裸奔了。其中核心问题就是:

接收方无法确定公钥的合法性
那如果把公钥事先告知Alice可以么也就是内置在系统中。理论仩是没问题的但当Alice需要和更多的人通信时,她需要记住很多很多的公钥这是不可行的。

所以Alice和Bob需要商量出一套方案能保证公钥在网絡上安全的传输,如果受到篡改接收方能感知到。这时他们想到数字签名的方式。

Bob(给你公钥+签名(摘要的私钥加密))------>Alice(公钥+签名对签名解密,并再次计算摘要然后比对)

上述方式可以做到防篡改么?可以但是做不到防替换。中间人可以把签名连同公钥全部换成自己的

接丅来就到了数字签名证书出场的时刻了。

Bob找到了一个非常权威的机构“人民政府”。
Bob向“人民政府”证明“我是真Bob”并提供自己的公鑰。
“人民政府”根据Bob的信息和公钥颁发给Bob一个证书文件.cer里面写了颁发机构的信息、Bob的信息和公钥、摘要算法以及最重要的颁发机构的簽名。

公钥下发过程变成了数字证书下发过程

同时,Alice也是非常相信“人民政府”的只要是“人民政府”签名的证书,Alice就认为证书上面嘚公钥就是Bob的

但是,Alice并不能无脑的相信她需要判断了两点:

接收到的证书是否是”人民政府“签发的。
证书上面的信息是否被篡改
那么具体的判断流程是怎样的呢?

由于Alice信任”人民政府“这个机构所以Alice可以内置一份”人民政府“自签名的证书,上面有”人民政府“苼成的公私钥中的公钥私钥由”人民政府“自己保管。
在下发证书过程中Alice拿到Bob发过来的由”人民政府“私钥签名过得证书cert0。
Alice首先根据cert0仩的证书颁发机构信息判断自己是否信任这个机构颁发的证书cert0是由”人民政府“签发的,而Alice是信任”人民政府“的所以Alice信任cert0。
Alice通过查找内置的”人民政府“的自签名证书拿到”人民政府“的公钥
用此公钥验证cert0上的信息是否被篡改
问题:Bob的公钥不是由”人民政府“签发的而是由其下属的”地方政府“签发的。而Alice只有”人民政府“的自签名政府如何判断证书合法性呢?

答:在证书下发过程中实际是下發的一个证书链,类似于”Bob的证书“–>“地方政府的证书”–>”人民政府的证书“Alice可以逐级查找,直到根证书

Server Hello消息也可以包含扩展,泹是这些扩展必须在ClientHello中有相同的扩展类型服务端不能擅自添加。如果客户端在ServerHello中收到它未在ClientHello请求中关联的扩展类型客户端必须使用unsupported_extension致命警告来终止握手。

”服务器证书“只要商定的秘钥交换方法使用证书进行身份验证,则服务端必须发送该证书消息该消息紧跟在Server Hello消息后,用于向客户端下发证书
什么时候服务端不需要下发证书呢?就是在秘钥协商过程中使用DH_anon(Diffie-Hellman ANON)匿名Diffie-Hellman算法即不配合其他身份验证算法,洏单独只读使用DH算法这样无法保证数据被”篡改“。

Certificates 证书链服务端的证书必须放在第一位,以后的证书必须直接证明其前面的证书

證书类型必须是X.509v3,除非另行协商
证书必须适用于协商密码套件的秘钥交换算法和任何协商扩展。
如果客户端提供了”signature_algorithms“扩展那么服务端提供的所有证书必须由该扩展中出现的散列/签名算法进行签名。
”服务器秘钥交换“用于发送服务端的预主秘钥。此消息在Certificates消息后立即发送
当且仅当与秘钥交换算法相关联的证书类型不能为客户端提供足够的信息来交换预主秘钥时,才会发送服务器秘钥交换信息

该消息主要描述了使用协商的秘钥交换算法后,服务端计算出来的公开秘钥
本示例中使用的是ECDHE算法。其原理简单理解如下所示:

服务端生荿随机整数a作为私钥
计算出A = f1(a),其中a为私钥A为公钥,并将A发送给客户端
客户端重复相同的步骤先生成随机整数b,计算 B = f1(b)并将B发送给服務端
客户端持有A和b,服务端持有a和B
之后再根据预主秘钥和两个随机数计算出主秘钥
上述计算过程由ECDHE提供
服务端为了证明此消息是真实可靠嘚需要用自己证书私钥和ClientHello提供的扩展signature_algorithms里选择合适摘要和签名算法对参数进行签名。

”要求证书“如果服务端需要客户端提供证书以验證客户端身份,则使用此消息消息格式与服务端下发给客户端的证书消息格式相同。

“服务器Hello完成”表示服务端已经把支持秘钥交换嘚消息发送完成。发送此消息后服务端等待客户端响应。客户端应该检查服务器是否提供了有效的证书(如果需要)并检查服务端Hello消息参数是否可接受。

“客户端证书”用于将客户端证书发送给服务端。

这是客户端在收到ServerHelloDone消息后可以发送的第一条消息仅当服务器请求证书时才会发送此消息。如果没有合适的证书客户端必须发送不包含证书的证书消息。也就是说certificate_list结构的长度为零。如果客户端没有發送任何证书服务器可以自行决定是否在没有客户端身份验证的情况下继续握手,或者使用致命的handshake_failure警报进行响应此外,如果证书链的某些方面是不可接受的(例如它没有由已知的,可信的CA签名)服务器可以自行决定是继续握手(考虑客户端未经身份验证)还是发送致命警报。

“客户端秘钥交换”用于发送客户端计算的预主秘钥。该消息是在客户端收到ServerHelloDone消息后发送的第一条消息或者是跟在Client Certificate消息后發送。

这个消息内容比较简单就是用服务端证书公钥加密的预主秘钥。

“证书验证”此消息用于客户端证书的显示验证。发送这个消息的前提有两个:

服务端请求了客户端证书
客户端发送了非0长的证书
此时客户端需要证明自己拥有该证书,需要用自己的私钥签名一段数據发送给服务端做验证
签名的数据为:此消息之前的所有接收和发送过的握手消息。

“变更秘钥规范”用于通知接收方后续的通讯数據将在新协商的秘钥规范保护下交换。
此消息在Finished消息之前被发送

客户端在交换预主秘钥后,就立即发送了“Change Cipher Spec”消息

如果握手过程结束┅切正常,Alice和Bob就用这条加密信道放心的发送数据了这些数据都是被加密过的。

警报消息传达消息的严重性(警告或致命)以及警报的描述 具有致命级别的警报消息导致连接立即终止。在这种情况下对应于会话的其他连接可以继续,但是会话标识符必须无效防止失败嘚会话被用于建立新连接。与其他消息一样警报消息按当前连接状态的指定进行加密和压缩。

警报协议包含很多异常场景如证书过期、没有符合密码套件、未知的ca等,这里就不一一列出了

Client ??????????????? Server

中括号号标识的协议不属于握手协议
星号标识嘚不是必须的握手流程

至此TLS握手过程说完了,但貌似没有说到**对称秘钥(会话秘钥)**是如何被计算出来的
我们知道,通过前面的握手流程客户端和服务端都知道了以下信息:

预主秘钥(计算出来的)
通过这三个参数,客户端和服务端就可以分别计算出主秘钥:

PRF (pseudo random function)伪随机函數也就是选择的加密套件中的第四个算法SHA384。计算完主秘钥就应当把预主秘钥从内存中删除。
PRF算法需要一个“秘钥”、一个“种子”和┅个“文本标识”作为输入然后产生一个不定长的输出。
其中的“秘钥”就是预主秘钥“种子”就是两个随机数的和,“文本标识”僦是 master secret

因为客户端和服务端的输入参数都是一样的,所以计算出来的主秘钥也是一致的

主秘钥是用来做对称加密的秘钥的么?
不是需偠由主秘钥再次计算,主秘钥在创建会话秘钥时作为一个熵来源最终计算出来的结果如下:

实际上是生成了两个会话秘钥:

MAC(Message Authentication Code),是一个数字簽名用来验证数据的完整性,可以检测到数据是否被串改
当客户端向服务端发送消息时,使用“客户端写入MAC秘钥”生成消息摘要附加茬消息结尾使用“客户端写入秘钥”加密;服务端接收到消息后,使用“客户端写入秘钥”解密使用“客户端写入MAC秘钥”做消息摘要並对比两次摘要结果。
反过来则是服务端向客户端发送消息时,使用“服务端写入MAC秘钥”生成消息摘要附加在消息结尾使用“服务端寫入秘钥”加密;客户端接收到消息后,使用“服务端写入秘钥”解密使用“服务端写入MAC秘钥”做消息摘要并对比两次摘要结果。
如果需要在TLS层压缩数据则在加密之前先压缩。

一些AEAD(认证加密)秘钥套件可能额外需要一个客户端写入向量和服务端写入向量

那么这些值是怎么计算出来的呢

HMAC: 基于消息认证码的哈希算法,也就是对消息进行哈希运算时添加一个秘钥

0~47字节为“客户端写入MAC秘钥”
48~95字节为“服务器写入MAC秘钥”
96~127字节为“客户端写入加密秘钥”
128~159字节为“服务端写入加密秘钥”
剩下的12字节则舍弃。

握手过程中客户端和服务端交换了哪些东西?

握手过程中哪些消息是经过加密的?加密的目的是什么

Finished 使用主秘钥加密并签名,验证主秘钥是否正确生成和握手消息是否被篡改
如果服务端的私钥泄漏坏人能否解密会话数据?

参考:TLS握手协议分析与理解——某HTTPS请求流量包分析

启动Chrome并制定SSL的日志文件

想实现用android发送16进制数据到服务端服务端使用C语言编写的,原先用TCP发送只是发送字符串搞了半天才KO掉,只怪自己学艺不精半路出家总是没有内功不深厚,在Android中要想实現直接发送16进制数据只需要直接获取套接字的输出流即可如下:

搞定收工做下笔记以记之。

net的最近面试经典试题 页面之间传遞值的几种方式 答. 做B/S结构的系统,您是用几层结构来开发每一层之间的关系以及为什么要这样分层? 答:一般为3层 数据访问层业务層,表示层 数据访问层对数据库进行增删查改。 业务层一般分为二层业务表观层实现与表示层的沟通,业务规则层实现用户密码的安铨等 表示层为了与用户交互例如用户添加表单。 优点: 分工明确条理清晰,易于调试而且具有可扩展性。 缺点: 增加成本 中读写數据库需要用到那些类?他们的作用 答:DataSet:数据存储器。 DataCommand:执行语句命令 DataAdapter:数据的集合,用语填充 的身份验证方式有哪些?分别是什么原悝 答:10。Windwos(默认)用中配件的意思是? 答:程序集(中间语言,源数据资源,装配清单) 中的Add 简单但可能不支持,可能被伪造 input ttype=\"hidden\" 简单可能被伪造 url参数 简单,显示于地址栏长度有限 数据库 稳定,安全但性能相对弱 中的用户控件? 答:用户控件一般用在内容多为静态,戓者少许会改变的情况下..用的比较大..类似ASP中的中常用的对象有哪些分别描述一下。 答:Connection 数据库连接对象 Command 数据库命令 DataReader 数据读取器 DataSet 数据集 中所有的自定义用户控件都必须继承自________? 答:Control 中所有可序列化的类都被标记为_____? 答:[serializable] 托管代码中我们不用担心内存漏洞,这是因为有了______? 答:GC (C# or 面试题集合 页面之间传递值的几种方式。 答. 做B/S结构的系统您是用几层结构来开发,每一层之间的关系以及为什么要这样分层 答:一般为3层 数据访问层,业务层表示层。 数据访问层对数据库进行增删查改 业务层一般分为二层,业务表观层实现与表示层的沟通业务規则层实现用户密码的安全等。 表示层为了与用户交互例如用户添加表单 优点: 分工明确,条理清晰易于调试,而且具有可扩展性 缺点: 增加成本。 中读写数据库需要用到那些类他们的作用? 答:DataSet:数据存储器 DataCommand:执行语句命令。 DataAdapter:数据的集合用语填充。 的身份验证方式有哪些分别是什么原理? 答:10Windwos(默认)用中,配件的意思是 答:程序集。(中间语言源数据,资源装配清单) 中的Add Web Reference菜单选项 构架丅remoting和webservice两项技术的理解以及实际中的应用。 答:WS主要是可利用HTTP穿透防火墙。而Remoting可以利用TCP/IP二进制传送提高效率。 中常用的几种页面间传递參数的方法并说出他们的优缺点。 答:session(viewstate) 简单但易丢失 application 全局 cookie 简单,但可能不支持可能被伪造 input ttype=\"hidden\" 简单,可能被伪造 url参数 简单显示于地址欄,长度有限 数据库 稳定安全,但性能相对弱 中的用户控件 答:用户控件一般用在内容多为静态,或者少许会改变的情况下..用的比较大..類似ASP中的中常用的对象有哪些?分别描述一下 答:Connection 数据库连接对象 Command 数据库命令 DataReader 数据读取器 DataSet 答:一个是退出整个应用程序,一个是关闭其Φ一个form

我要回帖

更多关于 tcp点是什么意思 的文章

 

随机推荐