TCP/IP协议算法
Transmission Control Protocol /Internet Protocol 传输控制协议/英特尔互联协议 TCP/IP是一个Protocol Stack,包括TCP、 IP、UDP、ICMP、RIP、TELNET、FTP、 SMTP、ARP等许多协议 最先发源于美国国防部(缩写DOD)的英特尔的前身ARPA网项目1983年1月1日,TCP/IP取代了旧的网络控制协议NCP,成为今天的互联网和局域网的基石和标准,由互联网工程任务组负责维护 共定义了四层 和ISO参考模型的分层有对应关系 TCP/IP 协议和OSI模型 TCP/IP OSI参考模型 应用层 应用层 表示层 会话层 传输层 传输层 internet层 网络层 数据链路层 数据链路层 物理层 物理层
TCP特性编程
工做在传输层 面向链接协议 全双工协议 半关闭 错误检查 将数据打包成端,排序 确认机制 数据恢复重传 流量控制,滑动窗口 拥塞控制,慢启动和拥塞避免算法
TCP缓存
源端口,目标端口:计算机上的进程要是和其余进程通讯是经过计算机端口的,而一个计算机端口某个时刻只能被一个进程占用,因此经过制定源端口和目标端口,就能够知道是那两个进程须要通讯,源端口,目标端口是用16位表示的,可推算计算机端口个数为2^16个 序列号:表示本报文段所发送数据的第一个字节的编号,在TCP连接中所传送的字节节流的每个字节都会按顺序编号,因为序列号有32位表示,因此每2^32个字节,都会出现序列号回绕,再次从0开始 确认号:表示接收方指望收到发送方下一个报文段的第一个字节数据的编号,也就是告诉发送发:我但愿你下一次发送的数据的第一个字节数据的编号是这个确认号 数据偏移: 表示TCP报文段的首部长度,共4位 因为TCP首部包含一个长度可变的选项部分,须要指定这个TCP报文的长度到底有多长,他指出TCP报文段的数据起始处距离TCP报文段的起始处有多远 ,该字段单位是32位,4位二进最大表示15 因此数据飘逸也是TCP首部最大60字节
TCP包头服务器
URG:表示本报文段中发送的数据是否包含紧急数据。后面的紧急指针字段(urgent pointer)只有当URG=1时才有效 ACK:表示是否前面确认号字段是否有效。只有当ACK=1时,前面的确认号字段才有效。 TCP规定,链接创建后,ACK必须为1,带ACK标志的TCP报文段称为确认报文段 PSH:提示接收端应用程序应该当即从TCP接收缓冲区中读走数据,为接收后续数据腾出空 间。若是为1,则表示对方应当当即把数据提交给上层应用,而不是缓存起来,若是应用程序 不将接收到的数据读走,就会一直停留在TCP接收缓冲区中 RST:若是收到一个RST=1的报文,说明与主机的链接出现了严重错误(如主机崩溃),必 须释放链接,而后再从新创建链接。或者说明上次发送给主机的数据有问题,主机拒绝响应, 带RST标志的TCP报文段称为复位报文段 SYN:在创建链接时使用,用来同步序号。当SYN=1,ACK=0时,表示这是一个请求创建连 接的报文段;当SYN=1,ACK=1时,表示对方赞成创建链接。SYN=1,说明这是一个请求 创建链接或赞成创建链接的报文。只有在前两次握手中SYN才置为1,带SYN标志的TCP报文 段称为同步报文段 FIN:表示通知对方本端要关闭链接了,标记数据是否发送完毕。若是FIN=1,即告诉对方: “个人数据已经发送完毕,你能够释放链接了”,带FIN标志的TCP报文段称为结束报文段
序号和确认号和标记为网络
seq:序号:发送者的发的包的序号 ack:确认号:是接收者收到后返回的确认包 标记位: URG:(紧急指针位)只有当URG=1时才有意义 ACK:(确认位)表示是否前面确认号字段是否有效。只有当ACK=1时,前面的确认号字段才有效。 RST:重置位 SYN:同步位 FIN:结束位
TCP包头并发
窗口大小:表示如今容许对方发送的数据量,也就是告诉对方,从本报文段的确认号开始容许对方发送的数据量 校验和:提供额外的可靠性 紧急指针:标记紧急数据在数据字段中的位置 选项部分:其最大长度可根据TCP首部长度进行推算 常见选项: 最大报文段长度:Maxium Segment Size,MSS 窗口扩大:Windows Scaling 时间戳: Timestamps
TCP三次握手ssh
所谓三次握手(Three-way Handshake),是指创建一个TCP链接时,须要客户端和服务器总共发送3个包。 三次握手的目的是链接服务器指定端口,创建TCP链接,并同步链接双方的序列号和确认号并交换 TCP 窗口大小信息.在socket编程中,客户端执行connect()时。将触发三次握手:
三次握手过程socket
第一次握手:创建链接时,客户端发送SYN包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认; 第二次握手:服务器收到SYN包,必须确认客户的SYN(ack=j+1),同时本身也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态; 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手.
TCP四次挥手tcp
TCP的链接的拆除须要发送四个包,所以称为四次挥手(four-way handshake)。 客户端或服务器都可主动发起挥手动做,在socket编程中,任何一方执行close()操做便可产生挥手操做。
四次挥手过程ide
step1:第一次挥手 首先,客户端发送一个FIN,用来关闭客户端到服务器的数据传送,而后等待服务器的确认。其中终止标志位FIN=1,序列号seq=u。 step2:第二次挥手 服务器收到这个FIN,它发送一个ACK,确认ack为收到的序号加一。 step3:第三次挥手 关闭服务器到客户端的链接,发送一个FIN给客户端。 step4:第四次挥手 客户端收到FIN后,并发回一个ACK报文确认,并将确认序号seq设置为收到序号加一。首先进行关闭的一方将执行主动关闭,而另外一方执行被动关闭。 客户端发送FIN后,进入终止等待状态,服务器收到客户端链接释放报文段后,就当即给客户端发送确认,服务器就进入CLOSE_WAIT状态, 此时TCP服务器进程就通知高层应用进程,于是从客户端到服务器的链接就释放了。 此时是“半关闭状态”,即客户端不能够发送给服务器,服务器能够发送给客户端。 此时,若是服务器没有数据报发送给客户端,其应用程序就通知TCP释放链接,而后发送给客户端链接释放数据报,并等待确认。 客户端发送确认后,进入TIME_WAIT状态,可是此时TCP链接尚未释放,而后通过等待计时器设置的2MSL后,才进入到CLOSE状态。
为何创建链接协议是三次握手,而关闭链接倒是四次呢
这是由于服务端的LISTEN状态下的SOCKET当收到SYN报文的链接请求后,它能够把ACK和SYN(ACK起应答做用,而SYN起同步做用)放在一个报文里来发送。 但关闭链接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了; 但未必你全部的数据都所有发送给对方了,因此你可能未必会立刻会关闭SOCKET,也即你可能还须要发送一些数据给对方以后,再发送FIN报文给对方来表示你赞成如今能够关闭链接了, 因此它这里的ACK报文和FIN报文多数状况下都是分开发送的。
为何不能用两次握手进行链接
咱们知道,3次握手完成两个重要的功能,既要双方作好发送数据的准备工做(双方都知道彼此已准备好),也要容许双方就初始序列号进行协商,这个序列号在握手过程当中被发送和确认。 如今把三次握手改为仅须要两次握手,死锁是可能发生的。 做为例子,考虑计算机S和C之间的通讯,假定C给S发送一个链接请求分组,S收到了这个分组,并发 送了确认应答分组。 按照两次握手的协定,S认为链接已经成功地创建了,能够开始发送数据分组。 但是,C在S的应答分组在传输中被丢失的状况下,将不知道S 是否已准备好,不知道S创建什么样的序列号,C甚至怀疑S是否收到本身的链接请求分组。 在这种状况下,C认为链接还未创建成功,将忽略S发来的任何数据分 组,只等待链接确认应答分组。 而S在发出的分组超时后,重复发送一样的分组。这样就造成了死锁。
为何TIME_WAIT状态须要通过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
虽然按道理,四个报文都发送完毕,咱们能够直接进入CLOSE状态了,可是咱们必须假象网络是不可靠的,有能够最后一个ACK丢失。 因此TIME_WAIT状态就是用来重发可能丢失的ACK报文。
TCP超时重传
异常网络状态下(开始出现超时或丢包),TCP控制数据传输以保证其承若的可靠服务 TCP服务必须可以重传超时时间内未收到的TCP报文段 为此,TCP模块为每个TCP报文段都维护一个重传定时器,该定时器在TCP报文段第一次被发送时启动 与TCP超时重传相关的两个内核参数: /proc/sys/net/ipv4/tcp_retries1:最少执行的重传次数 proc/sys/net/ipv4/tcp_retries2:作多执行的重传次数默认值15
TCP协议和UDP协议的区别是什么
TCP协议是有链接的,有链接的意思是开始传输实际数据以前TCP的客户端和服务器端必须经过三次握手创建链接,会话结束以后也要结束链接。 而UDP是无链接的 TCP协议保证数据按序发送,按序到达,提供超时重传来保证可靠性, 可是UDP不保证按序到达,甚至不保证到达,只是努力交付,即使是按序发送的序列,也不保证按序送到。
CP协议PORT
传输层经过port号,确认应用层协议 tcp :传输控制协议,面向链接协议:通讯前须要创建虚拟链路:结束后拆除链路 0-65535 udp:无链接的协议 0-65535 IANA:互联网数字分配机构(负责域名;数字资源;协议分配) 0-1023:系统端口或特权端口(仅管理员可用)总所周知,永久的分配个固定 的系统应用使用 22(ssh)80(http) 443(https) 1024-49125: 用户端口或注册端口但要求不严格 49152-65535:动态端口或私有端口,客户端程序随机使用端口 其范围的定义:/proc/sys/net/ipv4/ip_local_port_range
Internet协议特征
运行与OSI网络层 面向无链接的协议 独立处理数据包 分层编址 尽力而为传输 无数据恢复功能
单播多播广播
处地址类别外,还能够根据传输的信息特征将IP地址分为单播,多播,广播。主机使用IP地址进行一对一(单播),一对多(多播),或一对全部(广播)的通讯 单播:单播地址是IP网络中最多见的。包含单播地址的分组发送给特定主机, 多播:多播地址让原设备可以将元分组发送给一组设备 广播:广播分组的目标IP地址的主机部分全为1 ,这觉得着本地网络(广播域)中的全部主机都将接收并查看该分组
ARP地址解析协议:
IP PDU报头
版本:占4位,指IP协议的版本目前的IP协议版本号为4 首部长度:占4位,可表示的最大数值是15个单位,一个单位为四个字节,所以IP的首部长度的最大数值是60个字节 区分服务:占8位用来得到更好的服务,在旧标准中叫作服务类型,到实际上未被使用过,后更名为区分服务,只有在使用区分服务时,这个字段才起做用,通常的状况下都不使用 总长度:占16位,指首部和数据之和的长度,单位为字节,所以数据报的最大长度为65535字节,总长度不能超过最大传输单元MTU 标识:占16位它是一个计数器,一般,没发送一个只有当报文,该值会加1 ,也用于数据包分片,自同一个包的若干分片中,该值是相同的 标志:占3位,目前只有后两位有意义 DF:中间的一位,只有当DF=1是才容许分片。 MF:最高位,MF=1表示后面还有分片,表示最后一个分片 片偏移:占12位,指较长的分组 在分片后,该分片在原分组中的相对位置,片偏移以8个字节为偏移单位 生存时间:占8位,即为TTL数据报在网络中可经过的路由器的最大值,TTL字段是有发送端初始设置一个8bit字节,推荐的初始值由分配数字RFC指定,当前值为64 发送ICMP回显应答是=时常常把TTL设为最大值255 协议:占8位,指出此数据宝携带数据使用何种协议以便目的主机的IP层将数据部分上交给哪一个处理过程,1表示ICMP协议,2表示为IGMP协议 ,6表示TCP协议,17表示为UDP协议 首部检验和:占16位,只验证数据报的首部不检验数据部分,这里不采用CRC检验码而采用简单的计算方法 原地址和目标地址:都各自占4个字节,分别记录原地址和目的地址
IP地址
他们可惟一标识IP网络中的每一台设备 每台主机(计算机,网络设备,外围设备)必须具备惟一的地址 IP地址有两部分组成: 标识网络 每一个网络分配一个ID 主机ID: 标识单个主机 有组织非配给各设备
IP地址分类
A类: 0 000 0000 - 0111 1111:1-127 网络数:126,127 每一个网络中的主机数:2^24-2 默认子网掩码:255.0.0.0 私网地址:10.0.0.0 B类: 10 00 0000 - 10 11 1111: 128-191 网络数:2^14 每一个网络中的主机数:2^16 -2 默认子网掩码:255.255.0.0 私网地址:172.16.0.0-172.31.0.0 C类: 110 0 0000 -110 1 1111:192-223 网络数:2^21 每一个网络中的主机数:2^8-2 默认子网掩码:255,255,255.0 D类:组播 E类:240-255