瞎聊-TCP/IP协议

2016/09/01 Net

简介

要找工作啦,网络当然是码农的必备技能之一呀,网上对TCP/IP相关原理的讲解有很多, 在各大论坛上,各位前辈的帖子也是群星荟萃,我这里呢,就从TCP的原理到应用,大致分几点来看一下。

说实话,以下内容主要在扯淡,比较乱,我自己想了半天也没想出了这篇文章的主题,就叫为“瞎聊-TCP/IP协议”吧!

下面每一个小节都由2部分组成:我自己的备注+前辈的链接!

2 TCP/IP协议分层

2.1 协议分层

TCP/IP协议分层:应用层、传输层、网络层、链路层

应用层协议:

  • FTP:21
  • Telnet:23
  • SMTP:25
  • DNS:53
  • HTTP:80
  • HTTPS:443
  • POP3:110
  • SNMP:161
  • SSH:22

传输层协议:TCP/UDP

网络层协议:IP/ICMP/IGMP/OSPF/ARP/RARP

链路层协议:WiFi/ATM/令牌环/FDDI/帧中继/GPRS

2.2 分层数据报头概述

  • TCP报头组成:2 1 1 3 2(20B)
  • UDP报头组成:2 2 (8B)
  • IP报头组成: 4 3 3 1 1(20B)(数据报的最大长度为2^16-1=65535字节)

扩展阅读:

TCP/IP协议分析

3 传输层TCP原理分析

3.1 连接建立

状态变迁(主动):SYN_SEND->ESTABLISH

状态变迁(被动):LISTEN->SYN_RCVD->ESTABLISH

Syn攻击:

检测:netstat -np TCP | grep SYN_RECV

策略:SynAttackProtect保护机制、SYN cookies技术、增加最大半连接和缩短超时时间等,但是不能完全防范syn攻击。

3.2 流量控制:

发送窗口=min(拥塞窗口,接收窗口)

扩展阅读:

滑动窗口

3.3 丢包重传:

超时重传(RTO秒)

3.4 拥塞控制

慢启动&拥塞避免:慢启动->拥塞变量->拥塞避免

快重传&快恢复:(配套使用) 连续3个ACK说明丢包但未拥塞,使用重传&重新调用拥塞避免!

扩展阅读:

拥塞控制1

拥塞控制2

3.5 连接关闭

状态变迁(主动):FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT

状态变迁(被动): CLOSE_WAIT->LAST_ACK->CLOSED

扩展阅读:

连接控制

4 编程实例:Linux下Socket通信

4.1 客户端:

socket(AF_INET,SOCK_STREAM,0);
connect(confd,(struct sockaddr * )&seraddr,sizeof (seraddr));
write(confd,sendbuff,strlen(sendbuff))>0);
n=read(confd,recbuff,1024);

4.2 服务器端:

listenfd=socket(AF_INET,SOCK_STREAM,0));
setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt)); //取消TIME_WAIT状态
bind(listenfd,(struct sockaddr *)&seraddr,sizeof(seraddr));
listen(listenfd,500);
confd=accept(listenfd,(struct sockaddr *) &seraddr,&socklen);
write(confd,sendbuff,strlen(sendbuff))>0);
n=read(confd,recbuff,1024);

扩展阅读:

全部代码

Linux下Socket通信

总结

想想以前对计算机网络的理解,那叫一个“渣”!哈哈,虽然现在可能还是这样,不过能有这么大的进步还是满开心的!

在借助各位前辈的基础上,本文把TCP/IP协议简单总结了一下,每一小节的内容都有参考文献吆,已经放到小结内部,方便参阅。

另外还有很多协议的细节并没有谈到,希望后续可以开一个单独的系列,详细说说 ^_^

Search

    Post Directory