网络总结二(TCP UDP )

传输层:TCP和UDP

TCP协议

TCP(Transmission Control Protocol ,传输控制协议)是面向连接的传输层协议。TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。
TCP协议采用字节流传输数据。

TCP协议特点

  • 面向连接,通信之前必须建立连接
  • 每一条TCP连接只能是点对点的(一对一)
  • 提供可靠交付的服务,通过TCP连接传输的数据,无差错,不丢失,不重复
  • 提供全双工通信
  • 面向字节流,虽然程序和TCP交互是一次一个数据块,但是把应用程序交下来的数据看成仅仅是一连串的无结构的字节流。
  • TCP首部占20字节

TCP报文格式

首先我们要学习TCP协议,首先当然要了解TCP报文的报文格式,下面就是TCP的报文格式,以及各个字段的意思
在这里插入图片描述

16位的源端口号和目的端口号

端口号就是标识特定主机上的唯一的进程,而IP地址是来表示标识网络中的不同主机的,这两个源(source)和目的(dst)端口号和IP首部中的源和目的IP地址,则标识互联网上的唯一进程,所以套接字的定义说白了就是IP地址和端口号共同组成。

32位的序号

表示在这个报文段中的第一个数据字节序号。如果将字节流看作在两个应用程序间的单向流动,则TCP用序列号对每个字节进行计数。用来保证到达数据顺序的编号,所以这个字段需要比较大的存储。

32位的确认序号

确认序号是下一个期望接收的TCP分段号,相当于是对对方所发送的并且已经被本方所正确接受的分段的确认。仅当ACK标志为1时有效。确认号表示期望收到的下一个字节的序号。
(1) ack表示期望下次接收到的序号。
(2) 那么ack是如何算出来的呢,就是通过收到的序号,和数据长度相加得来。假设A收到B过来的数据(seq = 5,len = 15)。len表示数据长度。那么A就会回复B,“刚才的数据我已经收到了,你接下来就发序号为20的包给我吧”。这样就保证了数据不会乱序。

4位的报头长度

以32位(4字节)字长为单位,需要这个值是因为任选字段的长度是可变的。以4字节为单位是一个字长。2^4=15即最大是60个字节。不存在任选字段正常的报头长度是20字节。其实相当于给出数据在数据段中的开始位置。

保留位

6位,必须为0

标志位

占有6个比特位,他们中可以有多个为置为1,依次为:URG,ACK,PSH,RST,SYN,FIN。
下面具体分析:

  • URG:该位为1说明表示TCP包的紧急指针域有效,用来保证TCP连接不被中断,并督促上层应用敢快处理这些数据。
  • ACK:确认号有效
  • PSH:接收方应尽快将这个报文交给应用层,叫做push。所谓Push操作就是指在数据包到达接收端以后,立即传送给应用程序,而不是在缓冲区中排队。
  • RST:连接复位,复位因主机奔溃或其他原因而出现的错误连接,也可以用于拒绝非法的分段或拒绝连接请求,这个用处还是比较多的
  • SYN:是一个同步序号,通常与ACK合用用来建立连接。也就是常说的三次握手
  • FIN:既然有建立连接那么必然有拆除连接,这个字段表示发送端已经达到数据末尾,也就是说双方的数据传送完成,没有数据可以传送了,发送FIN标志位的TCP数据包后,连接将被断开。这个标志的数据包也经常被用于进行端口扫描。

看到上面,有些人就会有些疑问,URG和PSH都是紧急时使用,那么这两个有什么关系和区别呢?
答:在一般的数据中都会存在PSH,而URG只有在紧急情况下才会触发TCP报文中的紧急指针字段,那么到底什么样的情况才是紧急情况呢?紧急方式是向对方发送紧急数据的一种方式,表示数据需要优先处理。它是一个正的偏移,与TCP首部中序号字段的值相加表示紧急数据后面的字节,紧急指针是数据最后一个字节,TCP首部中只有紧急指针指出紧急数据的位置,它所指的字节为紧急数据,但没有办法指定紧急数据的长度。

紧急指针

只有当URG标志置1时紧急指针才有效。紧急指针是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。TCP的紧急方式是发送端向另一端发送紧急数据的一种方式。

窗口大小

TCP的流量控制由连接的每一端通过声明的窗口大小来提供。窗口大小为字节数,起始于确认序号字段指明的值,这个值是接收端正期望接收的字节。这是一个16 bit字段,因而窗口大小最大为65535字节。

校验和

用于对分段首部和数据进行校验。正常情况下为一定为0
在这里插入图片描述

三次握手

TCP是面向连接的协议、因此每个TCP连接都有3个阶段:连接建立、数据传输和连接释放

在这里插入图片描述
第一次握手:客户机发送连接请求报文段到服务器,并进入SYN_SENT状态,等待服务器确认
(SYN = 1,seq=x)

第二次握手:服务器收到连接请求报文,如果同意连接,向客户机发回确认报文段,并为该TCP连接分配TCP缓存和变量
(SYN=1,ACK=1,seq=y,ack=x+1)。

第三次握手:客户机收到服务器的确认报文段后,向服务器给出确认报文段,并且也要给该连接分配缓存和变量。此包发送完毕,客户端进入ESTABLISHED,然后TCP连接成功,完成三次握手
(ACK=1,seq=x+1,ack=y+1)

四次挥手

在这里插入图片描述
由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。
这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。
这个方向的连接。
收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据
首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

  • TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送
  • 服务器收到这个FIN,发送一个ACK,确认序号为收到的序号+1,和SYN一样,一个FIN将占用一个序号。
  • 服务器关闭客户端的连接,发送一个FIN给客户端
  • 客户端发回ACK报文确认,并将确认序号设置为收到的序号+1。

TCP扩展问题

TCP如何发送数据

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值