原创 更新于 时间( 2018-03-22 13:04:00) ( 1386) 次浏览 标签 : TCP
导读

TCP三次握手,你握啥呢? ...

TCP 三次握手连接

UPDTCP/IP 协议的区别

从前有一个古老的 负责网络传输 的种族,种族由很多个协议成员 组成,TCP协议 ,IP协议 ,UDP协议 ,HTTP协议 ,TELNET协议 等等

TCP协议和IP协议 是这个协议大家庭的两个大佬,所以就用这两个大佬来命名这个家族 TCP/IP 协议簇

家族主要负责网络传输,覆盖业务涵盖了: 应用层,传输层,网络层,网络访问层

所以改一下问题 问题1: UPD 和 大佬 TCP 协议 的区别 TCP大佬Tansmisson control protocl 传输控制协议 ,是一个传输层协议 基于连接协议,3次握手,对系统资源多,流数据模式,保证数据正确性,顺序性。

UDP小弟User Data Protocol , 用户数据报协议 ,非连接协议,不建立连接,不保证传输成功 ,尽最大努力交付,面向报文

TCP 基本介绍

Tcp 是一种可靠的面向连接的传输协议。为了提供可靠的服务 。

TCP协议 工作在传输层,是一种可靠的面向连接的数据流协议。TCP 之所以可靠,是因为它保证了传送数据包的顺序。顺序是用一个序列号来保证的。响应包内也包括一个序列号,表示接收方准备好这个序列号的包。在 TCP 传送一个数据包时,它会把这个数据包放入重发队列中,同时启动计时器,如果收到了关于这个包的确认信息,便将此数据包从队列中删除,如果在计时器超时的时候仍然没有收到确认信息,则需要重新发送该数据包。另外,TCP 通过数据分段中的序列号来保证所有传输的数据可以按照正常的顺序进行重组,从而保证数据传输的完整。

Tcp 生成 Syn 包的过程

Initial sequence number 的 生成

公式:ISN = M + F(本地主机,本地端口,远程主机,远程端口)

F的函数可以参考使用 MD5

Tcp 三次握手

起初,服务器和客户端都为CLOSED状态。在通信开始前,双方都得创建各自的传输控制块(TCB)。 服务器创建完TCB后遍进入LISTEN状态,此时准备接收客户端发来的连接请求。

第一次握手 客户端向服务端发送连接请求报文段。该报文段的头部中SYN=1,ACK=0,seq=x。请求发送后,客户端便进入SYN-SENT状态。

  • PS1:SYN=1,ACK=0表示该报文段为连接请求报文。
  • PS2:x为本次TCP通信的字节流的初始序号。 TCP规定:SYN=1的报文段不能有数据部分,但要消耗掉一个序号。

第二次握手 服务端收到连接请求报文段后,如果同意连接,则会发送一个应答:SYN=1,ACK=1,seq=y,ack=x+1。 该应答发送完成后便进入SYN-RCVD状态。

  • PS1:SYN=1,ACK=1表示该报文段为连接同意的应答报文。
  • PS2:seq=y表示服务端作为发送者时,发送字节流的初始序号。
  • PS3:ack=x+1表示服务端希望下一个数据报发送序号从x+1开始的字节。

第三次握手 当客户端收到连接同意的应答后,还要向服务端发送一个确认报文段,表示:服务端发来的连接同意应答已经成功收到。 该报文段的头部为:ACK=1,seq=x+1,ack=y+1。 客户端发完这个报文段后便进入ESTABLISHED状态,服务端收到这个应答后也进入ESTABLISHED状态,此时连接的建立完成!

Tcp三次握手流程图

这里写图片描述

更正:

seq序号 是自己的序列号 ack确认号 是 希望对方下一个报文的序号起始

1 第1次握手的报文(连接请求报文)  应该是 SYN=1 ACK=0 seq=x ack =0
2 第2次握手的报文(响应报文)       应该是SYN=1 ACK=1 seq = y ack =x+1
3 第3次握手的报文(确认报文)       应该是 ACK=1  seq =x+1 ack = y+1

其实TCP握手,是对比通信双方数据原点的序列号。

Tcp四次挥手释放

1 客户端进程发出 (1)连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。

P:客户端主动第一次说 :`你给人家出去呀,你出去呀`。

2 服务器收到客户端传过来的 (1)连接释放报文,发出(2)确认报文ACK=1,ack=u+1 ,并且带上自己的序列号 seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个 CLOSE-WAIT 状态持续的时间。

P:收到了她发来的`你出去`的(1)连接释放报文,他嘴上对她说,`好的,我出去了`。但是 他总是先不出去,因为他要通知上面的动作,而且,`下面`可能在继续传输`某些数据`,所以这需要一个时间,他保持这个 close-wait 状态。他之后还需要再发送一个 `我出去了*2的报文`给她。

3 客户端收到服务器的(1)确认请求后,此时,客户端就进入 FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。

p: 她听到了他默默的说,我出去了,但是她知道,她还需要等待一段时间,所以她习惯性的等待他发来第2次确认请求。

4 服务器将最后的数据发送完毕后,就向客户端发送 (3)连接释放报文 FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了 LAST-ACK(最后确认)状态,等待客户端的确认。

p: 终于,服务器精疲力尽的说,我真的没有x x了,这是最后的x x了,最后的数据的序列号为w ,`我真的要出去了`,然后服务器就进入了最后确认的状态 `(3)连接释放报文 `。

5 客户端收到服务器的连接释放报文后,必须发出(4)确认ACK=1,ack=w+1,而自己的序列号是 seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态

P:客户端发出 `(4)确认` ,说:`好的,我收到了你最后的消息,毕竟你已经说了两遍,你已经传输完成数据了,我相信你榨干了,你出去吧`,然后,客户端还需要等待 2个 MSL 的时间。才会完全进入关闭状态,这个时间称为 `她的贤者时间`。

6 服务器只要收到了客户端发出的 (4)确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。

P:服务器收到了`(4)确认`请求,就立刻结束TCP连接 ,所以服务器退出连接状态的时间是早于客户端的,这被人们称为 `拔x无情` 。
Leon0204

打杂后端程序猿~

讨论区

发表评论
昵称:
评论:
验证