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三次握手
所谓三次握手(Three-way Handshake),是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。
三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号并交换 TCP 窗口大小信息.在socket编程中,客户端执行connect()时。将触发三次握手:
三次握手过程
第一次握手:建立连接时,客户端发送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的连接的拆除需要发送四个包,因此称为四次挥手(four-way handshake)。
客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作。
四次挥手过程
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
Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx
本文永久更新链接地址:https://www.linuxidc.com/Linux/2018-09/153854.htm