谈谈tcp/ip协议

来源:互联网 发布:淘宝特卖怎么删除 编辑:程序博客网 时间:2024/06/08 17:54

对于这个问题我想分3点来谈tcp/ip协议,网络接口api,常见问题和处理方法

说到tcp/ip协议就不得不说tcp建立连接的3次握手和断开连接的4次握手以及tcp状态转换图

客户端发送一个syn带初始序号M请求建立连接并且状态由close转换为syn_send,此时客户端为半连接;服务端收到回复一个syn+ack,其中syn初始序号为N,ack确认序号为M+1;并且状态由close转换为syn_received,此时服务端为半连接;客户端收到后回复ack带确认序号为N+1,状态由syn_send转换为established,服务端收到后状态由syn_received转换为established,至此,tcp3次握手完成;假设客户端发起断开连接,客户端发送fin带初始序号J,状态由established转换为fin_wait_1;服务端收到后回复ack带确认序号J+1,状态由established转换为close_wait状态;客户端收到后发送fin带初始序号K,状态由fin_wait_1转换为fin_wait_2状态;服务端收到后回复ack带确认序号K+1,状态由close_wait状态转换为last_ack状态;客户端收到ack后状态由fin_wait_2转换为time_wait状态,并在等待2MSL(2倍的最大报文段生存时间,msl为30秒,1分钟,2分钟)后进入close状态;服务端收到ack后进入close状态,否则重发fin,因为客户端处在time_wait状态,可以继续收到fin并回复ack。实际上建立连接的第二步讲syn和ack合并了,所以是3次握手,否则也是4次;为什么不是2次呢,因为tcp是全双工,允许数据收发,所以要分别发送与接收,关闭时也要关闭发送和接收,发出fin意味着关闭了这端的数据发送。

tcp为什么可以保证到达和有序,udp为什么不行

tcp包头中由序列号,接收数据包讲根据序号列排序保证数据有序到达,tcp由ack和超时机制,可以在没有收到确认ack时重传数据包,保证数据到达,而udp这没有这些特性

ip分片,tcp分段,udp数据报

ip包有最大长度限制,对于从传输层发送的超过mtu的数据包ip协议栈将会分片处理,对于tcp对于应用层发送的数据,tcp是发送数据流,超过了mss则会分为多个tcp包发送,对于udp则是发送数据报,应用成发送和接收都是根据整体报文大小收发,过大则会引起ip层分片,而udp的网络层并不分包处理。

网络接口api,主要讲listen第二个参数,linger,keepalive,shutdown,useaddr,useport

bsd套接字在实现tcp3次握手的时候分为两个队列,未完成3次握手的连接和完成3次握手的连接,listen的第二个参数就是指完成3次握手队列的长度(linux下实现为两个队列的总和),收到一个syn,内核会放入未完成队列等待握手完成,对于完成握手的连接,则从未完成队列移到完成队列,然后应用程序调用accept接受连接则是从完成队列种取出连接。

设置linger选项,将告诉底层,若有数据发送,将延迟套接字关闭,等待数据完成后在关闭套接字。

设置keepalive选项,将使用tcp自带的心跳机制,周期性发送心跳包。

调用shutdown而不是close,发出fin的意义在于完成了这端的数据发送,关闭发送,但是仍然可以接收数据。

设置useaddr与useport选项,将允许使用本地处于2MSL状态的地址和端口

dos攻击与防御方法

什么是前摄器模式,什么是反应器模式

同步,异步,阻塞,非阻塞的概念区分

iocp原理,epoll原理,什么是边缘触发,什么是水平触发

说说boost的asio和ace的两种模式使用

0 0