计算机网络 学习笔记-传输层:TCP协议简介

概述:

  • TCP传输前先要建立连接
  • TCP在传输层
  • 点对点,一条TCP只能连接两个端点
  • 可靠传输、无差错、不丢失、不重复、按顺序
  • 全双工
  • 字节流

TCP报文段

TCP报文段的报头前20字节是固定的,后面4n字节是根据需要而添加的。

20字节的固定部分:

  • 源端口和目的端口:分别写入源端口号和目的端口号
  • 序号:0-(2^32-1),本报文段数据的第一个字节的序号,用来解决乱序问题
  • 确认序号:期望收到对方下一个报文段的第一个数据字节的序号,用来解决丢包问题
  • 数据偏移:TCP报头长度,包括固定的20字节和选项字段
  • 保留:均为0
  • 控制位:说明报文的性质,操控TCP的状态机

  • 窗口:指发送者自己的接收窗口大小,流量控制
  • 校验和:
  • 紧急指针:当URG=1时才有效,指出本报文段紧急数据的字节数
  • 选项:

连接的建立与释放

三次握手:

(1)client发出请求连接报文段,SYN=1,Seq=x。client进入SYN-SENT状态。

(2)server收到请求报文后,向client发送确认报文段。确认报文段的首部中SYN =1,ack = x + 1,同时为自己选择一个初始序列号Seq = y.server进入SYN-RCVD(同步收到)状态。

(3)client收到server的确认报文后,还有给server发送一个确认报文。 确认号ack = y + 1,而自己的Seq = x + 1。这个报文段已经可以携带数据,如果不携带数据则不消耗序号,下一个报文段序号仍为Seq = x + 1。

为什么要三次握手呢?

假设握手只有两次,如果某次数据报由于网络延迟,从client到server时,已经断开连接了,而此时server会认为是client想建立一个新的连接,于是发给client一个确认报文(第二次握手)就建立了新的连接了,显然这是错误的。如果是三次握手,client接到这个确认报文时,不予理睬,两者没有完成第三次握手,所以不会建立错误的连接了。

网上有一个比较形象的说法:

第一次对话:

老婆让甲出去打酱油,半路碰到一个朋友乙,甲问了一句:哥们你吃饭了么?
结果乙带着耳机听歌呢,根本没听到,没反应。甲心里想:跟你说话也没个音,不跟你说了,沟通失败。说明乙接受不到甲传过来的信息的情况下沟通肯定是失败的。
如果乙听到了甲说的话,那么第一次对话成功,接下来进行第二次对话。

第二次对话:

乙听到了甲说的话,但是他是老外,中文不好,不知道甲说的啥意思也不知道怎样回答,于是随便回答了一句学过的中文 :我去厕所了。甲一听立刻笑喷了,“去厕所吃饭”?道不同不相为谋,离你远点吧,沟通失败。说明乙无法做出正确应答的情况下沟通失败。
如果乙听到了甲的话,做出了正确的应答,并且还进行了反问:我吃饭了,你呢?那么第二次握手成功。
通过前两次对话证明了乙能够听懂甲说的话,并且能做出正确的应答。接下来进行第三次对话。

第三次对话:

甲刚和乙打了个招呼,突然老婆喊他,“你个死鬼,打个酱油咋这么半天,看我回家咋收拾你”,甲是个妻管严,听完吓得二话不说就跑回家了,把乙自己晾那了。乙心想:这什么人啊,得,我也回家吧,沟通失败。说明甲无法做出应答的情况下沟通失败。
如果甲也做出了正确的应答:我也吃了。那么第三次对话成功,两人已经建立起了顺畅的沟通渠道,接下来开始持续的聊天。
通过第二次和第三次的对话证明了甲能够听懂乙说的话,并且能做出正确的应答。
可见,两个人进行有效的语言沟通,这三次对话的过程是必须的。

来源: <http://www.kaiyuanba.cn/html/1/131/147/7959.htm>

四次挥手

(1)此时TCP两端都还处于ESTABLISHED状态,client不再发送数据,并发送一个FIN报文段,seq = 1,进入FIN-WAIT-1状态。

(2)server收到后回复,ack = u + 1,seq = v(v等于服务器传输数据最后一字节的序号加1),然后进入CLOSE-WAIT状态,server如果继续发送数据,client依然接收。

(3)client收到确认报文后,进入FIN-WAIT-2状态。server不再发送数据后,发出FIN,ack = u  + 1,进入LASK-ACK状态。

(4)client收到后回复,seq = u + 1, ack = w + 1(w 等于服务器后来继续发送的最后一个字节的序号加1,与v并不一定相等!),然后进入TIME-WAIT状态

(5)此时连接还没有释放,需要等待(4分钟)两端才会CLOSED。设置时间等待是因为有可能最后一个确认报文丢失而需要重传。

为什么要四次挥手呢?

因为当client发送FIN是,表示client没有要传的数据了,不代表server没有数据要传给client,所以server还需要发送FIN来表示它也没数据传输了。由于TCP是全双工的,所以并不存在谁先FIN的问题。

SYN超时问题:server如果在一定时间内没有收到client的确认报文,会重发。在Linux下,默认重试次数为5次,5次重试的时间分别为1、2、4、8、16、32s。第五次都没有收到,就会断开这个连接。

SYN Flood攻击问题:如果给服务器发送一个SYN后,就下线了,于是服务器就需要等63秒才会断开连接,这样攻击者就可以把服务器的SYN连接队列耗尽。Linux下有一个叫tcp_syncookies的参数来应对这个事。当SYN队列满了以后,TCP会通过源地址端口、目标地址端口和时间戳打造一个特别的Seq Number发回去(又叫cookie),如果是攻击者则不会有相应,如果是正常连接,则会把这个SYN Cookie发回来,然后服务端可以通过cookie建立连接。千万不要用tcp_syncookies来处理正常的大负载的连接的情况。对于正常的请求,应该调整TCP参数,第一个是:tcp_synack_retries可以用他来减少重试次数;第二个是:tcp_max_syn_backlog,可以增大SYN连接数;第三个是:tcp_abort_on_overflow处理不过来感觉直接拒绝连接!

TCP可靠传输的实现

  • TCP报文段的长度可变,根据收发双发缓存、网络状态而调整。
  • TCP收到另一端数据时,会回发确认
  • TCP能够超时重传
  • 数据校验
  • 报文段中有序号,以保证顺序正确
  • TCP提供流量控制

发送者再发送一个报文段后,暂时保存该文段的副本,收到确认后才删除;

确认报文段也需要序号,才能明白是发出去的那个数据得到了确认;

超时计时器比传输往返时间略长,但具体值不确定,根据网络情况而定(使用RTT算法)。

连续ARQ协议

实际中为了提高效率,采用流水线传输:发送方可以连续发送多个报文段(连续发送的数据长度叫做窗口)。接收方也不必对收到的每个报文都做回复,而是采用累积确认方式;

流量控制和拥塞控制

由于接收方缓存限制,发送窗口不能大于接受方接受窗口。

参考资料:《TCP那些事(上)》http://coolshell.cn/articles/11564.html

实验楼 TCP/IP网络协议基础 https://www.shiyanlou.com/courses/98

时间: 2024-10-26 14:48:18

计算机网络 学习笔记-传输层:TCP协议简介的相关文章

计算机网络学习笔记--传输层知识总结

传输层概述: 为什么要划分传输层? 既然网络层已经能把源主机上发出的数据传送给目的主机,那么为什么还需要加上一个传输层呢?这就需要我们理解主机用户应用层通信的主体,位于两台网络主机中真正的数据通信主体并不是这两台主机,而是两台主机中的各种网络应用进程.同一时间一台主机上可能有多个进程同时运行,这时候就需要为应用程序提供一个标识,那就是端口.而传输层就是为了提供这种端到端的服务而存在的.下面以一张图来解释. 同时从图中也可以看出来,IP协议提供了主机之间的逻辑通信.而传输层协议提供的是进程之间的逻

(传输层)TCP协议

目录 首部格式数据单位特定注意自动重传请求ARQ具体实现发送缓存接收缓存滑动窗口确认丢失和确认迟到超时重传时间选择报文段的发送时机运输连接发送TCP请求客户端拥塞处理相关概念避免拥塞具体实现TCP 的有限状态机 首部格式 图释: 各个段位说明: 源端口和目的端口: 各占 2 字节.端口是传输层与应用层的服务接口.传输层的复用和分用功能都要通过端口才能实现 序号: 占 4 字节.TCP 连接中传送的数据流中的每一个字节都编上一个序号.序号字段的值则指的是本报文段所发送的数据的第一个字节的序号 确认

笔记 传输层TCP/UDP

OSI 7 层 1 - 物理层 2 - 数据链路层 3 - 网络层 编址和路由 4 - 传输层 提供端到端的数据连接(端,就是端口的端) TCP UDP 5 - 会话层(系统内部实现机制,数据包中无法体现出来) 6 - 表示层(系统内部实现机制,数据包中无法体现出来) 7 - 应用层 ================================================== seq: sequence number , 序列号: acknowledge :确定号: mask : 掩码:

OSI模型第四层传输层--TCP协议

1.传输层2个协议tcp和udp 2.tcp的可靠性(挂号信). 面向链接的:类似寄挂号信,对方收到了并且能够确认.所以也是可靠的传输. 最大报文传输:两端可以协商传输报文大小.(协商一个报文的大小) 传输确认机制:传输收到报文会有确认.(每一个数据报文都有确认) 首部和数据检验和:确认数据报文中途不被修改. 流量控制:确定发送速度(协商一次发送多少报文) 3.tcp数据报文头部 4.tcp的建立和结束(3次握手和四次挥手)

传输层TCP协议

Tcp协议概念 TCP(传输控制协议 Transmission Control Protocol)是一种传输层通信协议.它在应用程序间建立了一条虚拟链路.在TCP/IP协议中传输层具有四个主要任务:组包.通过滑动窗口实现连接控制.寻址和通过序号确认来提供可靠性.TCP具有6个特点:面向连接的传输:端到端的通信:高可靠性,确保传输数据的正确性,不出现丢失或乱序:全双工方式传输:采用字节流方式,即以字节为单位传输字节序列:紧急数据传送功能. TCP报文和TCP首部结构 TCP数据被封装在一个IP数据

计算机网络7:传输层TCP和UDP以及TCP的工作方式

UDP:无连接:不保证可靠:面向报文的: TCP:面向连接:提供可靠交付:面向字节流(把应用层的数据分包,每个包装一些字节:不关心应用层给的包多大,而是根据网络状况,窗口大小决定) TCP报文: 序号:原数据中的第几个字节 确认号(ack):到第几个字节都收到 窗口:我的窗口(接受窗口)有多大 ACK:1用于一般的数据包,0用于握手确认 选项:MSS(最大数据报文)+ 首部=数据包,MSS可以尽量大,但是在IP层不被分片 滑动窗口——以字节为单位 超时重传时间的选择 TCP流量控制 零窗口探测报

抓包分析传输层TCP协议通信(2)

body { font-family: 微软雅黑,"Microsoft YaHei", Georgia,Helvetica,Arial,sans-serif,宋体, PMingLiU,serif; font-size: 10.5pt; line-height: 1.5; } html, body { } h1 { font-size:1.5em; font-weight:bold; } h2 { font-size:1.4em; font-weight:bold; } h3 { fon

抓包分析传输层TCP协议通信(1)

body { font-family: 微软雅黑,"Microsoft YaHei", Georgia,Helvetica,Arial,sans-serif,宋体, PMingLiU,serif; font-size: 10.5pt; line-height: 1.5; } html, body { } h1 { font-size:1.5em; font-weight:bold; } h2 { font-size:1.4em; font-weight:bold; } h3 { fon

Java学习笔记之基于TCP协议的socket

可以一直输入,而不是一问一答: 开两个线程,一个负责收,一个负责发. 1.先运行: package com.zr.javase0825; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.Server