TCP/IP

1.TCP三次握手:

(1)服务端调用socket创建套接字,bind绑定端口,listen被动打开,再调用accpet阻塞,等待客户端连接。客户端调用socket创建套接字,connect主动打开发起连接。
(2)客户端发送连接请求报文段给服务端,将SYN位置为1,sequence number为x,客户端进入SYN_SEND状态,等待服务端的确认;
(3)服务端收到syn包后,需要对这个SYN报文段进行确认,设置ACK Num为x+1,同时自己还要发送SYN请求信息,将SYN位置1,sequence number为y,此时服务器进入SYN_RECV状态;
(4)客户端收到SYN+ACK报文段,将ACK Num设置为y+1,向服务器发送ACK报文段,此时客户端和服务器都进入ESTABLISHED状态,完成三次握手。

2.为什么需要三次握手?

是为了防止已经失效的报文段突然又到了服务器。假如客户端第一次发出的连接请求并没有丢失,而是在网络中的某个节点长时间滞留了,以致延误到连接释放以后的某个时间才到达服务器。本来这是一个已经失效的报文段,但服务器认为这是一个新的连接请求,会创建资源并回复ACK建立连接。如果只有两次握手,此时就已经建立起连接,资源白白浪费。

3.四次挥手

(1)主机1(客户端或服务器)主动调用close发起断开连接请求,将FIN位置1,设置sequence number x,此时主机1进入FIN_WAIT_1状态;
(2)主机2收到了主机1的FIN报文段,向主机1回一个ACK报文段,ACK Num为x+1,主机2进入CLOSE_WAIT状态,主机1收到后进入FIN_WAIT_2状态;
(3)主机2把数据传输完后,调用close主动发起断开,向主机1发送FIN报文段,主机2进入LAST_ACK状态;
(4)主机1收到主机2发送的FIN报文段后,向主机2发送ACK报文段,主机1进入TIME_WAIT状态,主机2收到主机1的ACK报文段以后就关闭连接;此时主机1等待2MSL后依然没有收到回复,证明主机2已经正常关闭,主机1也可以关闭连接。

如何解决CLOSE_WAIT过多?
基本的思想就是要检测出对方已经关闭的socket,然后关闭它。

如何减少TIME_WAIT?
修改配置, /etc/sysctl.conf
net.ipv4.tcp_syncookies=1 --开启syn cookies
net.ipv4.tcp_tw_reuse = 1 --开启重用
net.ipv4.tcp_tw_recycle = 1 --快速回收
net.ipv4.tcp_fin_timeout = 30 --缩短默认timeout时间

/sbin/sysctl -p让内核参数生效

4.为什么要四次分手?

TCP协议是一种面向连接的,可靠的基于字节流的传输控制协议。全双工模式,这意味着当主机1发出FIN报文段时,只是代表主机1没有数据要发送了,但是主机1还是可以接受主机2的数据,当主机2返回ACK报文段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的。当主机2也发送了FIN报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,之后彼此就会愉快的中断这次TCP连接。

5.为什么要等到2MSL?

MSL:最大段生存时间,是任何报文段在网络中的最长生存时间。
(1)保证TCP协议的全双工连接能够可靠关闭:如果主机1回复的ACK丢失,没有顺利到达主机2,主机2会重发FIN报文段,若主机1已经close,会回复RST,主机2会抛出错误。
(2)保证上一个连接旧的数据段在网络中消失:当主机1close,这个ip+port可能会被复用,如果前一个连接的数据仍然滞留在网络中,就会认为是属于新连接的。

6.syn攻击:

TCP需要通过三次握手建立连接。SYN攻击通过故意不完成建立连接所需的三次握手过程,造成连接一方的资源耗尽。
SYN攻击利用TCP协议三次握手的原理,大量发送伪造源IP的SYN包,服务器每收到一个SYN包就会为这个连接分配资源并放入半连接队列,当攻击的SYN包超过半连接队列最大值时,正常的客户发送的SYN请求就会被丢弃。

检测SYN攻击非常的方便,当在服务器上看到大量的半连接状态时,特别是源IP地址是随机的,基本上可以断定这是一次SYN攻击.在Linux下可以如下命令检测是否被Syn攻击
netstat -n -p TCP | grep SYN_RECV

关于SYN攻击防范技术.归纳起来,主要有两大类,一类是通过防火墙、路由器等过滤网关防护,另一类是通过加固TCP/IP协议栈防范.(增加最大半连接数,缩短超时时间)

7.TCP和UDP区别:

TCP是面向连接的,可靠的,基于字节流的传输控制协议,提供超时重发,丢弃重复数据,检验数据,流量控制等功能。
UDP是面向数据报的传输层协议,UDP不提供可靠性,不面向连接,不保证数据能到达目的主机,没有重发机制,传输速度快。
TCP最大优点是可靠,一般网页http,邮件SMTP,远程连接telnet,文件FTP传送用TCP;
UDP一般用于多点通信和实时数据业务,比如语音广播,视频,QQ,TFTP,SNMP,DNS,RIP注重速度流畅。

8.面向字节流和面向报文:

创建一个TCP的socket,会在网络中同时创建一个发送缓冲区和接收缓冲区。刚开始会将数据写入发送缓冲区,若数据太短,则在发送缓冲区等待,等到合适时机会将合适大小的数据以字节流的形式发送出去,若数据太长,会进行拆分,然后发送。由于TCP是全双工的,所以读写数据时没有限制,可以一次性接受所有数据;也可以每次接收一点,分多次接收。

所谓的“流模式”,是指TCP发送端发送几次数据和接收端接收几次数据是没有必然联系的,比如你通过 TCP连接给另一端发送数据,你只调用了一次 write,发送了100个字节,但是对方可以分10次收完,每次10个字节;你也可以调用10次write,每次10个字节,但是对方可以一次就收完。
原因:这是因为TCP是面向连接的,一个 socket 中收到的数据都是由同一台主机发出,且有序地到达,所以每次读取多少数据都可以。

面向报文的传输方式是应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。

9.粘包问题?

TCP传输的数据在发送缓冲区或接收缓冲区中堆积,因为TCP收发的灵活性,可能导致多条数据被当做一条数据接收。简单来说,就是两条数据的黏连。
本质原因:TCP在传输层对数据的格式并不关心,所以每条数据之间没有明显的边界区分,这样会造成粘包问题。
解决方案:需要用户在应用层对数据进行边界管理:
(1)格式化数据:每条数据有固定的格式(开始符、结束符)
(2)发送长度:发送每条数据的时候,将数据的长度一并发送。

9.TCP如何保证可靠性?

(1)校验和:
校验范围包括TCP首部和数据部分。在发送方将整个报文段分为多个16位的段,然后将所有段进行反码相加,将结果存放在校验和字段中,接收方用相同的方法计算。
(2)确认应答和序列号:
TCP将每个字节的数据进行了编号,这就是序列号。序列号的作用:保证可靠性;保证按序到达;去除重复数据;提高效率,多次发送,一次确认。
(3)超时重传:
(4)拥塞控制
(5)流量控制
(6)连接管理(三次握手,四次挥手)

10.拥塞控制:

某段时间内对网络中某一资源的需求超过了该资源所能提供的可用部分,网络性能就会变坏。
理想的拥塞控制,随着输入负荷增大,网络的吞吐量线性增大然后保持不变,但是实际场景中,网络吞吐量到达某一值后会随着输入负荷骤降,甚至为0.
检测拥塞控制的指标:由于缺少缓存空间而被丢弃的分组的百分数,超时重传的分组数,分组时延等。
发送方维持一个拥塞窗口CWND,根据网络状况动态调整大小。TCP发送方最初使用慢开始算法(一开始向网络中注入报文少,并不是增长速度慢),让拥塞窗口从1开始以指数增长,当增加到慢开始门限初始值时,停止使用慢开始算法,转而执行拥塞避免算法,让拥塞窗口值按线性加一的规律增大。当发生超时重传时,判断网络可能发生拥塞,将慢开始门限值更新为发生拥塞时拥塞窗口的一半,同时将拥塞窗口减小为1,重新开始执行慢开始算法。
但有时,个别报文段在网络中丢失,并未发生拥塞。这将导致超时重传,降低传输效率。快重传就是使发送方尽快进行重传,而不是等超时重传计时器超时再重传。快恢复要求接收方不要等到自己发送数据时再进行捎带确认,而是立即发送确认,即使收到了失序的报文段也要立即发出对已收到的报文段的重复确认。当发送方收到3个重复确认时,进行快重传和快恢复。更新慢开始门限值和拥塞窗口均为发生拥塞时拥塞窗口的一半,转而执行拥塞避免算法。

11.流量控制:

TCP提供一种基于滑动窗口协议的流量控制机制来实现流量控制,在通信过程中,接收方根据自己接收缓存的大小,动态的调整发送方发送窗口的大小,以限制发送方向网络注入报文的速率。
在TCP报文段首部有一个16位窗口长度,当接收端接收到发送方的数据后,在应答报文ACK中就将自身缓冲区的剩余大小放入16位窗口大小中。如果缓冲区满,就将窗口设为0,发送方收到后就不再发送数据,但需要定时发送窗口探测数据段,使接收端将窗口大小告诉发送端。

12.命令:

(1)ping: IP/域名:用来测试网络速度和目标主机的连通性。原理是用类型码为0的ICMP发请 求,受到请求的主机则用类型码为8的ICMP回应。
(2)netstat:显示网络状况 netstat -nap | grep pid/port
(3)traceroute IP/域名:查看本机到该IP的路径中经过的路由器。利用ICMP和TTL
(4)telnet IP Port:查看某个机器上的某个端口是否可以访问
(5)route:查看路由表
(6)top:性能分析工具,实时显示系统中各个进程的资源占用状况
(7)tcpdump:截获数据包
(8)ipcs:检查共享内存

13.OSI七层:

(1)物理层:为数据端设备提供原始比特流的传输通路。比特,中继器,集线器,网线,HUB
(2)数据链路层:在通信的实体间建立数据链路连接。帧,网卡,网桥,交换机。
(3)网络层:为数据在结点之间传输创建逻辑链路,并分组转发数据。分组(数据包),路由器,多层交换机,防火墙。
(4)传输层:提供应用进程之间的逻辑通信,数据段,TCP/UDP
(5)会话层:建立端连接并提供访问验证和会话管理。
(6)表示层:提供数据格式转换服务,解密加密,编解码
(7)应用层:访问网络服务的接口:Telnet,ftp,http,snmp,dns等

14.

DNS协议运行在UDP协议之上,使用端口号53。
FTP:21
SSH:22
Telnet:远程登陆服务:23
SMTP(简单邮件传输协议):25
HTTP:80
HTTPS:443
Sockets:1080
mysql:3306

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值