Tcp三次握手协议java
A--àBsql
A发送信息到B服务器
B肯定后,发送给A网络
这样A不就能够肯定这条链路是通的了,为何A要再次发送才能肯定呢?tcp
这是由于弄错了要肯定的主体,真正要肯定的是Bide
B在listen端口等待客户发送连接,B在收到客户肯定是要发送数据,才真正的创建连接。只有在获得A确实是要发送连接,B才准备和A创建连接,不然不创建。性能
A首先发送sychornize(SYN)想要同步的字节码给B,说:“我想和你创建连接,不知道可不能够啊?”,这个字节只包含A将要发送数据的初始序列号。不带任何数据,只包含了IP头部,和一个tcp头部及可能有的tcp选项。(为何这样作?)spa
一、不能肯定你要链接的B是否空闲,是否能够提供服务,若是B(服务器,也能够是一台普通的电脑)不存在,或者没法提供服务,那A就没必要要再去发送数据。设计
这样作的缘由:orm
1)节省了网络上带宽。若是全部的连接都是无论三七二十一的把数据发送到另一台电脑上,这样在全部的链路上都充斥都大量可能没有用的数据,
2)在网络的设计之初,宽带很小,传输的速度也很慢。
B电脑,若是能够响应,那么就发送一个SYN,表示能够创建链接。这个SYN含有服务器同一链接中发送的数据的初始化序列号。服务器以单个字节向客户发送syn和对客户syn的ACK(表示确认)。
若是B电脑没法提供服务,于A电脑在等待一段时间后自动放弃该链接,或者A能够持续发送“我要链接到B”的请求,直到A确认。
客户A要确认B电脑的SYN。发送一个ACK到B。服务器B肯定A要链接。服务器B等待同一链接上A发送具体的数据。
这里面重点是B要肯定A,由于B是为A(C,D,E)提供连接服务的。
这里面有几个问题:
1. 客户数据的初始化序列号,是怎么个生成原则?
2. 同理服务器的初始化序列号,生成原则是什么?
3. 服务器对客户端SYN的ACK是如何生成的?
4. 同理客户端对服务器SYN是如何生成的?
5. 客户端对服务器发送的ACK是若是辨别的?
6. 服务器对客户端发送的ACK是若是辨别的?
解决这些问题首先要明白:
SYN和ACK都是单个字节。
为何是一个字节,而不是一位比特算了?
由于他要在这8个比特中包含一个IP头部,TCP头部及可能有的TCP选项。
一个字节,8位0---255个十进制数,是很硬件,软件的最小处理单位
硬盘是以最小单位一个字节来读取数据
Mysql的tinyInt,bit也都是单个字节来存储的,我想这和硬盘的最小处理单位有关,并且C语言上的基本数据类型,最小的char也是一个字节,java中的char是两个字节。
SYN和ACK是怎么个回事?
TCP发送数据是按分节发送的,这个分节应该是字节分段发送的意思,一段是一个分节。
每个分节内的每个字节都对应一个序列号,这个序列号从1开始递增,到达对端后,从新按序列号进行排序。一个分节最大能够放1024个字节。
可是打招呼时用到的SYN和ACK只用到了一个字节的序列号空间(1-256),这也就意味着他们的内容数据大小在1-256个字节。而这256个字节只含有一个IP头部,一个TCP头部,和可能的TCP选项。
问题一:IP头部包含什么?
问题二:TCP头部和TCP选项是什么关系?
一个分节最大能够放1024个字节。这一个容量并不固定不变的,受TCP选项中的MSS(Maximum segment size)的控制,可能经过TCP_MAXSEG套接字获取与设置容量。
MSSà用于控制单个分节的容量大小。
TCP选项是对TCP对部的补充,好比说:窗口规模选项,这个功能会随着高速网络和卫星链路,发生改变,以补充TCP头部中通知最大窗口大小为65535.
引出一个问题:窗口规模选项中的窗口是什么,和一个分节传输的大小有何关联?
窗口规模的目的是:提供流量控制
机制是:该窗口在任意时刻都指出接收缓冲区中的可用空间。
应用程序从缓冲区读取数据则窗口变大,缓冲区写入数据则窗口变小。满了,则等待进程读取了数据以后,再接收数据。
进程从硬盘读取数据会有一个层次的缓冲机制,网络链接原来是有缓冲,说就说明,缓冲对于计算机应用程序是一个很好的机制。能够解决性能的问题。
全双工的意思就能够接收数据的同时发送数据(full-duplex)
TCP重要的五点内容:
面向链接
提供可靠性
每一个字节数据关联一个序列号,以便排序
提供流量控制
链接是全双工