传输层协议——TCP协议

1、TCP服务的特点:面向连接、字节流、

面向连接

使用tcp协议通信的双方必须先建立连接,然后才能开始数据的读写。双方都需要为该连接分配必要的内核资源,以管理连接的状态和连接上数据的传输。tcp连接时全双工的,即双方的数据读写可以通过一个连接进行。完成数据交换之后,通信双方都必须断开连接以释放系统资源。

 tcp协议的这种连接是一对一的,所以基于广播和多播的应用程序不能使用tcp服务。而无连接协议udp则非常适合于广播和多播。

字节流

       当发送端应用程序连续执行多次写操作时,tcp模块先将这些数据放入tcp发送缓冲区中。当tcp模块真正开始发送数据时,发送缓冲区中这些等待发送的数据可能被封装成一个或多个tcp报文段发出。因此,tcp模块发送出的tcp报文段的个数和应用程序执行的写操作次数之间没有固定的数量关系。

       当接收端收到一个或多个tcp报文段后,tcp模块将它们携带的应用程序数据按照tcp报文段的序号依次放入tcp接收缓冲区中,并通知应用程序读取数据。接收端应用程序可以一次性将tcp接收缓冲区中的数据全部读出,也可以分多次读取数据,这取决于用户指定的应用程序读缓冲区的大小。因此,应用程序执行的读操作次数和tcp模块接收到的tcp报文段个数之间也没有固定的数量关系。

       综上所述,发送端执行的写操作次数和接收端执行的读操作次数之间没有任何数量关系,这就是字节流的概念:应用程序对数据的发送和接受是没有边界限制的。


可靠传输

(1)tcp协议采用发送应答机制,即发送端发送的每个tcp报文段都必须得到接收方的应答,才认为这个tcp报文段传输成功。

(2)tcp协议采用超时重传机制,发送端在发送出一个tcp报文段之后启动定时器,如果在定时时间内未收到应答,它将重发该报文段。

(3)因为tcp报文段最终是以ip数据报发送的,而ip数据报到达接收端可能乱序、重复,所以tcp协议还会对接收到的tcp报文段重排、整理,再交付给应用层。

2、TCP头部结构(画出tcp头部结构)


16位端口号:告知主机该报文段是来自哪里(源端口)以及传给哪个上层协议或应用程序(目的端口)的。进行tcp通信时,客户端通常使用系统自动选择的临时端口号,而服务器则使用知名服务器端口号。

32位序号:一次tcp通信(从tcp连接建立到断开)过程中某一个传输方向上的字节流的每个字节的编号。

32位确认号:用作对另一方发送来的tcp报文段的响应。其值是收到的tcp报文段的序号值加1.

4位头部长度:标识该tcp头部有多少个字节。因为4位最大能表示15,所以tcp头部最长是60字节。

6位标志位包含如下几项:

URG标志,表示紧急指针是否有效。

ACK标志,表示确认号是否有效。(确认报文段)

PSH标志,提示接收端应用程序应该立即从TCP接收缓冲区中读走数据,为接受后续数据腾出空间(如果应用程序不将接收到的数据读走,它们就会一直停留在tcp接收缓冲区中)

RST标志,表示要求对方重新建立连接。(复位报文段)

SYN标志,表示请求建立一个连接(同步报文段)

FIN标志,表示通知对方本端要关闭连接了。(结束报文段)

16位窗口大小:是TCP流量控制的一个手段。这里说的窗口,指的是接受通知窗口,它告诉对方本端的TCP接收缓冲区还能容纳多少字节的数据,这样对方就可以控制发送数据的速度。

16位校验和:由发送端填充,接收端对TCP报文段执行CRC算法以检验TCP报文段在传输过程中是否损坏。这个校验和不仅包括TCP头部,也包括数据部分。

16位紧急指针:是一个正的偏移量。它和序号字段的值相加表示最后一个紧急数据的下一字节的序号。TCP的紧急指针是发送端向接收端发送紧急数据的方法。

3、TCP连接的建立和关闭

(1)正常连接和关闭 



三次握手



四次挥手

(2)半连接状态 


服务器收到SYN报文,但是没有收到ACK报文时候的状态为半连接状态。

在三次握手过程中,服务器维护了一个半连接队列,该队列为每一个收到SYN并向客户端发出确认,但是没有收到ACK,正在等待客户端的确认的连接开设一个条目。这些条目里的连接都处于SYN_RCVD状态。当服务收到客户端的ACK确认后,删除该条目,服务器处于ESTABLISHED状态。

(3)半关闭状态 


由于TCP连接是全双工的,它允许两个方向的数据传输被独立的关闭。通信的乙方可以发送结束报文给对方,告诉它本端已经完成了数据的传送,但是可以接收对方的数据,直到对方也发送结束报文关闭连接,这种状态称为半关闭。

(4)半打开连接

服务器或客户端关闭或者异常终止了连接,而对方没有接收到结束报文段,此时,客户端还维持着原来的状态,而服务器即使重启,也已经没有该连接的任何消息了,这种状态称为半打开状态,该连接称为半打开连接。如果客户端或服务器端往半打开连接写入数据,则对方将回应一个复位报文。

4、connect系统调用失败的原因 
<1>connect的目标端口不存在,或者该端口被处于TIME_WAIT状态的连接所占用的时候,服务器给客户端发送一个RST复位报文,connect调用失败; 
<2>目标端口存在,但是connect在超时时间内未收到服务器的确认报文段,则connect失败。


5.产生复位报文段的情况: 
<1>访问不存在的端口; 
<2>异常终止连接; 
<3>处理半打开连接。如果客户端/服务器端向半打开连接写入数据,对方则回应一个复位报文。

6.带外数据 
带外数据比普通数据具有更高的优先级,TCP利用其头部中的紧急指针标识和紧急指针两个字段,给应用程序提供了一种紧急方式。 
TCP接收端只有在接收到紧急指针标识时,才会检查紧急指针,然后根据紧急指针所指的位置确定带外数据的位置,并将它读入一个特殊的缓冲中。这个带外缓存只有1字节,如果上层应用没有及时将带外数据读出,则后面的带外数据将覆盖它。

7.TCP超时重传 
TCP模块为每个TCP报文段都维护了一个重传定时器,该定时器在TCP数据报第一次被发送的时候被启动。如果在超时时间内未收到接收方的应答,TCP模块将重新传TCP报文并重置定时器。

8、拥塞控制:

提高网络利用率,降低丢包率,并保证网络资源对每条数据流的公平性。

拥塞控制有四个部分: 慢启动、拥塞避免、快速重传、快速恢复


这四部分以后会详细讲解→_→



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值