Fork me on GitHub

计算机网络 - 传输层

注意:所有文章除特别说明外,转载请注明出处.

[TOC]

计算机网络 - 传输层

网络层只将 分组 发送到目的主机,但是真正通信的并不是主机而是主机中的进程。传输层提供了进程间的逻辑通信,传输层向高层用户屏蔽了下面网络层的核心细节,使应用程序看起来像是在两个传输层实体之间有一条端到端的逻辑通信通道。

UDP | TCP的特点

用户数据报协议 UDP(User Datagram Protocol)是无连接的,尽最大可能交付,没有拥塞控制,面向报文(对于应用程序传下来的报文不合并也不拆分,只是添加 UDP 首部),支持一对一、一对多、多对一和多对多的交互通信。

特点:1.面向非连接。2.不维护连接状态,支持同时向多个客户端传输相同的消息。3.数据包报头只有8个字节,额外开销小。4.吞吐量只受限于数据生成速率、传输速率以及机器性能。5.尽最大可能交付,不保证可靠交付,不需要维持复杂的链接状态表。6.面向报文,不对应用程序提交的报文信息进行拆分或者合并。

传输控制协议 TCP(Transmission Control Protocol)是面向连接的,提供可靠交付,有流量控制,拥塞控制,提供全双工通信,面向字节流(把应用层传下来的报文看成字节流,把字节流组织成大小不等的数据块),每一条 TCP 连接只能是点对点的(一对一)。

特点:1.基于字节流的传输层通信协议。2.将应用层的数据流分割成报文段并发送给目标节点的TCP层。3.数据包都有序号,对方收到则发送ACK确认,未收到则重传。4.使用奇偶校验来校验数据是否有错。5.数据包报头有20个字节。

TCP FLAGS

URG:紧急指针标志

ACK:确认序号标志

PSH:push标志

RST:重置连接标志

SYN:同步序号,用于建立连接过程

FIN:finish标志,用于释放连接

UDP首部格式

首部字段只有8个字节,然后包括源端口、目的端口、长度、校验和。12字节的伪首部是为了计算校验和临时添加的。

TCP首部格式

1.序号:对字节流进行编号。

2.确认号:期望收到的下一个报文段的序号。

3.数据偏移:表示数据部分距离报文段起始处的偏移量,实际上指首部的长度。

4.确认ACK:当ACK=1时确认号字段有效,否则无效。TCP 规定,在连接建立后所有传送的报文段都必须把 ACK 置 1。

5.同步SYN:在连接建立时用来同步序号。当 SYN=1,ACK=0 时表示这是一个连接请求报文段。若对方同意建立连接,则响应报文中 SYN=1,ACK=1。

6.终止FIN:用来释放一个连接,当 FIN=1 时,表示此报文段的发送方的数据已发送完毕,并要求释放连接。

7.窗口:窗口值作为接收方让发送方设置其发送窗口的依据。之所以要有这个限制,是因为接收方的数据缓存空间是有限的。

TCP三次握手

在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。

    1.第一次握手,建立连接时,客户端发送SYN包(SYN=j)到服务器,并进入SYN_SEND状态,等待服务器确认。

    2.第二次握手,服务器收到SYN包,必须确认客户端的SYN(ACK = j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态。

    3.第三次握手,客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

提示:三次握手的目的是为了初始化Sequence Number的初始值。

首次握手的隐患

这里有一个问题就是在第一次客户端发送连接请求之后掉线,服务器接收到连接请求(SYN)之后,回复SYN-ACK时候没有收到ACK确认,会不断的重试直到超时。

在这个超时等待过程中可能会存在 SYN Flood 恶意攻击

连接建立之后,客户端出现故障

TCP有一个保活机制,在客户端出现故障之后,向对方发送保活探测报文,如果未收到则响应则继续发送。尝试次数达到保活探测数仍未收到响应则中断连接。

TCP四次挥手

TCP采用四次挥手是为了终止连接,流程:

    1.第一次挥手,客户端发送一个FIN,用来关闭客户端到服务器的数据传送,客户端进入FIN_WAIT_1状态。

    2.第二次挥手,服务器收到FIN后,发送一个ACK给客户端,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),服务器进入CLOSE_WAIT状态。

    3.第三次挥手,服务器发送一个FIN,用来关闭服务器到客户端的数据传送,服务器进入LAST_ACK状态。

    4.第四次挥手,客户端收到FIN后,客户端进入TIME_WAIT状态(客户端在经过2*MSL时间后进入CLOSED状态),接着发送一个ACK到服务器,确认序号为收到序号+1,服务器进入CLOSED状态,完成四次挥手。

提示:TCP连接在经过 2*MSL 时间之后才会进入CLOSED状态的原因是:1.确保对方有足够的时间收到ACK包。2.避免有足够时间避免新旧连接混淆。

提示:为什么需要四次握手才能断开连接的原因是:因为全双工,发送方和接收方都需要FIN报文和ACK报文,所以看起来就是四次的挥手。

提示:服务器出现大量CLOSE_WAIT状态的原因是:客户端一直在请求,但是返回给客户端的信息是异常的,服务端没有收到请求

TCP可靠传输

TCP在使用超时重传实现可靠传输,如果一个已经发送的报文段在超时时间内没有收到确认,那么久重传这个报文段。

TCP滑动窗口

RTT:发送一个数据包到收到对应的ACK所花费的时间

RTO:重传时间间隔

TCP使用滑动窗口做流量控制与乱序重排。作用是:1.保证TCP的可靠性。2.保证TCP的流控特性。

滑动窗口的窗口数据计算过程:

window = maxRcvBuffer - (LastByteRcvd - LastByteRead)

TCP流量控制

流量控制是为了控制发送方发送速率,保证接收方来得及接收。接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,而不影响发送方的发送速率。如果窗口字段设置为 0,则发送方不能发送数据。

本文标题:计算机网络 - 传输层

文章作者:Bangjin-Hu

发布时间:2019年10月15日 - 09:22:26

最后更新:2020年03月30日 - 08:19:35

原始链接:http://bangjinhu.github.io/undefined/计算机网络 - 传输层/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

Bangjin-Hu wechat
欢迎扫码关注微信公众号,订阅我的微信公众号.
坚持原创技术分享,您的支持是我创作的动力.