TCP协议详解

1.首先看一下在浏览器地址栏中输入了url之后,到显示页面都经历了什么

 

    首先输入url之后需要先经过DNS服务器进行解析,解析成对应的ip地址,然后返回给客户端,接着客户端和服务器之间开始建立请求进行响应,最后进行断开,如图所示:

      

    上述过程中使用到的协议有:

            TCP:与服务器建立连接
            IP: 网络层发送数据
            OPSF:路由选择
            ARP:IP地址转换为MAC地址
            HTTP:访问网页

2.网络分层: 

 

     概念:就是将网络节点所有需要完成的数据的处理工作,分别由不同的硬件和软件模块去完成,可以将通信和网路互联等复杂的问题简单化,常规的模型有四层,五层和七层三种方式

7 应用层 --》为应用程序提供服务。比如最常用的服务就是网页浏览和电子邮件了。这些都是可以通过应用层来实现从而给我们提供一系列的服务
6 表示层 --》数据格式转化,数据的表现形式,特定的功能实现--如数据加密。
5 会话层 --》会话层是实现会话的同步管理。主要的功能是对话管理,数据流同步和重新同步。
4 传输层 --》传输前的检查,建立端到端的安全连接
3 网络层 --》IP选址以及路由的选择
2 数据链路层 --》提供介质访问和链路管理它保证了数据点到点的安全传输。在链路层数据是被封装成帧的格式,每个帧都有长短和顺序且具有检错和纠错功能,所以是用来保证数据点之间的安                             全传输用的
1 物理层 --》物理上的硬件设备,这是实现通信的基础和前提

举一个简单的列子来理解七层协议:
    张三要从北京到上海找李四玩

       物理层 :可以理解成交通工具中硬件设施,比如比如高速公路,铁路,公共汽车,高铁等硬件设施,这些设施是我到北京找你的必要条件,也是基础。
数据链路层 :如果我要北京,那么必须保证我去汽车站或者高铁站这个途中是安全的。那么从我家到汽车站是一个点到另一个点,只要保证每个点按照顺序,准时没差错就能顺利到达下一个                             点。
       网络层 :可以理解层百度地图的导航,给你提供了方向和路径
       传输层 :好比我出门必须要做好充分的准备,带上身份证,钱包等。
       会话层 :好比去之前要先进行沟通,定好时间,不能我去找你了你却不在。
       表示层 :比如两人见面之后说的语言肯定都一样,不能出现语言不同的情况,见面之后会说一些隐私的问题等
       应用层 :比如两人见面之后一起去吃饭逛街等,这就是表现出来的形式

 

 



TCP是如何保证可靠传输的?

   





 

TCP三次握手协议

 

为什么三次握手?SYN,ACK的作用都是什么?

     三次握手的意义:简单的 描述下这三次对话的简单过程:主机A向主机B发出连接请求数据包:“我想给你发数据,可以吗?”,这是第一次对话;主机B向主机A发送同意连接和要求同步 (同步就是两台主机一个在发送,一个在接收,协调工作)的数据包:“可以,你什么时候发?”,这是第二次对话;主机A再发出一个数据包确认主机B的要求同 步:“我现在就发,你接着吧!”,这是第三次对话。三次“对话”的目的是使数据包的发送和接收同步,经过三次“对话”之后,主机A才向主机B正式发送数 据。

建立三次握手主要是因为A发送了再一次的确认,那么A为什么会再确认一次呢,主要是为了防止已失效的连接请求报文段又突然传送给B,从而产生了错误。

   所谓“已失效的连接请求报文”是这样产生的,正常情况下,A发出连接请求,但是因为连接报文请求丢失而未收到确认,于是A再重传一次连接请求,后来收到了请求,并收到了确认,建立了连接,数据传输完毕后,就释放链接,A共发送了两次连接请求报文段,其中第一个丢失,第二个到达了B,没有“已失效的连接请求报文段”,但是还有异常情况下,A发送的请求报文连接段并没有丢失,而是在某个网络节点滞留较长时间,以致延误到请求释放后的某个时间到达B,本来是一个早已失效的报文段,但是B收到了此失效连接请求报文段后,就误以为A又重新发送的连接请求报文段,并发送确认报文段给A,同意建立连接,如果没有三次握手,那么B发送确认后,连接就建立了,而此时A没有发送建立连接的请求报文段,于是不理会B的确认,也不会给B发送数据,而B却一直等待A发送数据,因此B的许多资源就浪费了,采用三次握手的方式就可以防止这种事情发生,例如刚刚,A不理会B,就不会给B发送确认,B收不到A的确认,就知道A不要求建立连接,就不会白白浪费资源,

     ACK:TCP协议规定,只有ACK=1时有效,也规定连接建立后所有发送的报文的ACK必须为1
     SYN:在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文。对方若同意建立连接,则应在响应报文中使SYN=1和ACK=1. 因此,  SYN置1就表示这是一个连接请求或连接接受报文

首先由Client发出请求连接即 SYN=1 ACK=0 ,TCP规定SYN=1时不能携带数据,但要消耗一个序号,因此声明自己的序号是 seq=x,
然后 Server 进行回复确认,即 SYN=1 ACK=1 seq=y, ack=x+1(ack),
再然后 Client 再进行一次确认,但不用SYN 了,这时即为 ACK=1, seq=x+1, ack=y+1

ACK:是确认值(Acknowledgement),为1便是确认连接。
ack:是确认编号(Acknowledgement Number),即接收到的上一次远端主机传来的seq然后+1,再发送给远端主机。提示远端主机已经成功接收上一次所有数据。

 

 

 

 

1.客户端主动向服务器端发送断开请求 FIN=1 seq=u,
 2.服务器端收到客户端发送来的断开连接的请求之后会通知应用程序做好准备工作,服务端告诉客户端 收到了断开连接的请求 ack=u+1,但是此时并没有发送FIN=1的数据,因为此时的服务端        可能正在给客户端传递数据。
 3.服务端发送完数据之后,发送给客户端此时的ack确认编号还是u+1 表示还是响应的是客户端第一次发送的要断开连接的请求,此次的数据重有FIN=1
 4.客户端收到FIN=1的数据之后,会继续服务端发送数据告知收到了,此时服务端就断开链接了,

 

为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。


为什么客户端需要等待?

  1. 保证TCP协议的全双工连接能够可靠关闭
          某些网络原因,如果最后因为网络延迟或者其他原因导致 服务端没有收到客户端最后一次发送的ACK进行确认,那么服务端会在超时之后继续发送FIN,所以不能直接关闭,需要等               待,从而保证收到之后再最后正确关闭链接
  2. 保证这次连接的重复数据段从网络中消失
          如果Client直接CLOSED,然后又再向Server发起一个新连接,我们不能保证这个新连接与刚关闭的连接的端口号是不同的。假设新连接和已经关闭的老连接端口号是一样的,如果前一       次连接的某些数据仍然滞留在网络中,这些延迟数据在建立新连接之后才到达Server,由于新连接和老连接的端口号是一样的,又因为TCP协议判断不同连接的依据是socket pair,于            是,TCP协议就认为那个延迟的数据是属于新连接的,这样就和真正的新连接的数据包发生混淆了。所以TCP连接还要在TIME_WAIT状态等待2倍MSL,这样可以保证本次连接的所有        数据都从网络中消失。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值