简介
要找工作啦,网络当然是码农的必备技能之一呀,网上对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字节)
扩展阅读:
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说明丢包但未拥塞,使用重传&重新调用拥塞避免!
扩展阅读:
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);
扩展阅读:
总结
想想以前对计算机网络的理解,那叫一个“渣”!哈哈,虽然现在可能还是这样,不过能有这么大的进步还是满开心的!
在借助各位前辈的基础上,本文把TCP/IP协议简单总结了一下,每一小节的内容都有参考文献吆,已经放到小结内部,方便参阅。
另外还有很多协议的细节并没有谈到,希望后续可以开一个单独的系列,详细说说 ^_^