转载出处:https://blog.csdn.net/qq_27602093/article/details/51068442
TCP协议
1.头部。出现在每个TCP报文段,用于指定通信的源端端口号,目的端端口号,管理TCP连接,控制两个方向的数据流。
2.TCP状态转移过程。TCP连接的任意一端都是一个状态机。TCP的建立断开状态改变。
3.TCP数据流。交互数据流和成块数据流
4.TCP数据流的控制。保证可靠和质量->超时重传和拥塞控制
TCP服务的特点 (面向连接、字节流、可靠传输)
1.传输层主要的两个协议 、 UDP协议 和 TCP协议
2.TCP协议通信,双方必须建立连接,才开始数据读写。双方要为该链接分配必要的内核资源,用来管理连接的状态和连接上数据的传输。TCP连接是全双工的(双方数据读写可以通过一个连接),完成后,断开连接,释放系统资源。
3.TCP是一对一连接的,广播多播不能使用TCP服务。 UDP适合哦
4.TCP模块发送的TCP报文段个数和应用程序执行写操作没有数量关系》》》》可能发送的数据分片处理啊~~~
5.应用程序读的次数和TCP报文段个数也没关系。读的大小,取决于读缓冲区的大小,TCP按照报文段的序号排好依次放入TCP接受缓冲区中哒。
6.根据第四条和第五条,得出字节流概念》》》》应用程序对数据的发送和接受是没有边界限制的~。UDP发送一次就要读一次,否则要丢包的,没有足够大小的读缓冲区,那UDP数据会被截断//
7.TCP采用发送应答机制,即发送端发送的每个TCP报文段必须得到接收方的应答,才认为TCP报文段传输成功。
8.TCP采用超时重传机制,发送一个TCP报文段后启动定时器,在定时器时间内未收到应答,则再次发送。
9.TCP报文段最终是以IP数据报发送的,而IP数据报到接收端很大可能是无序的重复的,TCP协议将对TCP报文重排,整理,再交给应用层。
1.16位端口号(port number) 源端口号和目的端口号
2.32位序号(sequence number) 第一个、序号值被初始化为某个随机值ISN(initial sequence number) TCP报文是字节流第1025~2048字节,序号值是ISN+1025
3.32位确认号(acknowledgement number) 用作另一方TCP报文段相应。其值是收到TCP报文段序号值加1
4.4位头部长度(header length)标识TCP头部有多少个32bit字,最大为15,所以TCP头部最长60字节。
5.6位标志位
URG标志,表示紧急指针(urgent poinnter)是否有效
ACK标志,表示确认号是否有效
PSH标志,提示接收端应用程序应该立即从TCP接收缓冲区中读走数据,腾冲空间
RST标志,表示要求对方重新建立连接。 带此标志的报文段称为复位报文段
SYN标志,表示请求建立一个连接。带此标志的报文段称为同步报文段
FIN标志,表示通知对方本端要关闭连接了。带此标志的报文段称为结束报文段
6.16位窗口大小(window size) 流量控制 告诉对方还能容纳多少个字节数据
7.16位校验和(TCP checksum)CRC校验头部和数据部分
8.16位紧急指针(urgent pointer) 正偏移量。他和序号字段的值相加表示最后一个紧急数据的下一字节的序号.发送紧急数据的方法。
TCP头部选项
TCP头部最后一个选项字段是可边长的可选信息。 最多包含40字节,因为TCP头部最大60字节,前面已经占20字节
kind说明选项的类型。
kind=0 选项表结束选项
kind=1 空操作(nop)选项,一般用于将TCP选项的总长度填充为4字节整数倍
kind=2 最大报文短长度选项 MSS(最大报文长度)对以太网而言是1460字节(1500-20TCP头部-20IP头部)
kind=3 窗口扩大因子选项,如果窗口扩大因子(移位数)为M,接受窗口大小为N,那么N向左移3位(转为2进制),相当于N×2的M次方
kind=4 选择性确认(selective acknowledgment,SACK) 改善发送情况,原本出现差错要发很多个TCP报文,接受到的也要发,使用这个,可以去除重复
kind=5 SCAK实际工作的选项,告诉对方那些没收到,让对方重新发
kind=8 时间戳选项。计算双方之间的回路时间(Round Trip Time,RTT),/proc/sys/net/ipv4/tcp_timestamps —看了下里头就保存了个1. (这个是启用或关闭时间戳)
前20个字节是IP报的头部,第21个字节开始是TCP头部信息《第2行第3个》
0xb075是源端口号 —– 0x0017是目的端口
0xd058 670c 是序号 —– 0x0000 0000是确认号
0xa 是TCP头部长度为10个32位(40字节) —–0x002 设置SYN标志(同步报文段)
0xaaaa 接受窗口大小(字节) —– 0xfe30 头部校验和(校验头部还有据部分!!!)
0x0000 没设置紧急指针 —- 0x0204 kind 和length(各1字节 8位)
0xffd7 最大报文长度 —- 0x0402 允许SACK(改善~~~)
0x080a 时间戳kind和length —-0x0001 6f0c时间戳
0x0000 0000 回显应答时间戳 —– 0x01空操作
0x0303窗口扩大因子kind和length 0x07 窗口扩大因子为7(左移7位~)
FLAG[S] 表示是SYN标志(同步报文段)
seq是序号值3495454476 因为它是第一个报文段所以也是此次传输的ISN值(随机值)。其他都要加上字节流的值。
win 接受通过窗口大小 mss(max segment size最大报文长度)为65495
sackok同意改善~~SACK~ TS val 发送端的时间戳 93964
ecr时间戳回显应答(因为这是第一次TCP通信的第一个TCP报文段,所以对方时间戳应答为0) nop空操作
wscal 窗口扩大因子7
length为0意思就是数据部分为0 因为应用层数据没发生交换
《IP TCP关于偏移字节的问题》
1.在IP数据报报头中,标识、标志和片偏移3个字段与控制分片和重组有关。其中,片偏移字段指出本片数据在出事IP数据报数据区中的位置,位置偏移量以8个字节为单位
2.强调内容在TCP数据报中,没有偏移字节不过有序号
1. IP
如果有一个3800字节的数据,每个分片最大为1420B;由于头部占20字节,所以数据部分分成了1400 1400 和 1000字节
那么第一个分片中偏移字段为0 第二个分片字段为(1400)/8 =175
第三个分片为 (1400+1400)/8 = 350
就这样
2.TCP
某个TCP报文段传送的字节流中第1025~2048字节,那么该报文段序号值为ISN+1025 .. 偏移为字节~~~
这样做才有序,数据正确嘛~
TCP/IP连接的建立与关闭
第一个TCP报文是同步的(SYN),ernest-laptop向kongming20发送连接请求,ISN为535734930
第二个也是同步报文段,表示kongming20同一和ernest-laptop建立连接,对第一个同步报文进行确认,ISN为2159701207 注意拉~~ack确认值是第一个同步报文段序号值加1
序号值是标识TCP数据流中的每一字节,同步报文段特殊,要占用一个序号值
第三个TCP报文段是ernest-laptop对第二个同步报文段的确认
就这样TCP连接建立好啦, 这三步为 TCP的三次握手
后面4各是TCP报文段的关闭过程。TCP的四次挥手
FIN标志表示通知kongming20本端要关闭了。也就是ernest-laptop要关闭连接,结束报文段和同步报文段一样都要占1个序号值
第5个,确认该结束报文段
第6个,紧接着kongming20发送结束报文短
第6个ernest-lattop给予确认
第5个报文段的出现取决于TCP的延迟确认特性
ernest-lattop执行主动关闭 kongming20执行被动关闭
半关闭状态
通信一端可以发送FIN给对方,告诉对方本端完成数据的发送,但允许接受对方的数据,直到对方发给自己FIN。
服务器和客户端应用程序判断对方是否已经关闭连接的方法:
read系统调用返回0(收到结束报文段后 read就返回0 这样就可以判断拉)
socket通过shutdown函数提供半关闭的支持。
连接超时
如果客户端访问一个距离它很远的服务器,或由于网络繁忙,导致服务器对客户端发出的同步报文段没有应答,对于TCP来说,必然要进行重连。
时间间隔1s,2s,4s,8s ,16s.
由proc/sys/net/ipv4/tcp_syn_retries决定,重连进行5次
- 1
服务器通过listen进入LISTEN状态,等待客户端连接(被动打开),收到请求,将链接放入内核等待队列中,向客户端发SYN标志的确认报文(ACK),此时状态(SYN_RCVD),收到客户端的ACK则状态到ESTABLISHED已建立连接状态。(双方能进行双向数据传输)
客户端主动关闭,服务器收到FIN并发送ACK,进入CLOSE_WAIT状态(等待服务器应用程序关闭连接),通常,服务器检测到客户端关闭连接后,给客户端发送结束报文关闭连接,进入 LAST_ACK,以等待客户端对结束报文段的最后一次确认。确认完成,彻底关闭了。
客户端通过connect系统调用主动与服务器建立连接,给服务器发送同步报文,进入SYN_SENT状态,(失败返回情况:1.目标端口不存在,或端口被TIME_WAIT状态占用,server给client发送一个复位报文段2.connect在超时时间内未收到服务器的确认报文段)
client主动关闭,向服务器发送FIN报文段,进入FIN_WAIT_1状态。收到专门用于确认目的的确认报文段,进入FIN_WAIT_2状态,此时服务器处于CLOSE_WAIT状态,这一对状态可能发生半关闭状态。server关闭client给予确认,server进入TIME_WAIT状态。
TCP建立断开过程,客户端服务器状态转移图如下:
client收到server的结束报文段,并没直接进入CLOSE状态,client要等待一段长2MSL的时间(报文段最大生存时间)
TIME_WAIT状态存在原因:
1.可靠地终止TCP连接(不这样服务器重发报文6时会发送复位报文段给server)
2.保证让迟来的TCP报文段有足够时间被识别并丢弃(防止新连接和旧连接一样)
复位报文段
通知对方关闭连接或者重新建立连接
异常终止连接
一方给另一方发送FIN报文段,收到方发复位报文段,发送端所有等待发送的数据都将被丢弃。
拥塞控制= =