您的位置:首页 > 理论基础 > 计算机网络

TCP及socket通信原理

2015-07-10 16:04 489 查看
一、TCP协议: 如图,TCP (Transmission Control Protocol) 传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层协议。TCP协议完成第四层传输层所指定的功能,TCP层位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,只是提供IP报文的不可靠的包交换 应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,然后TCP把数据流分区成适当长度的报文段(通常受该计算机连接的网络的数据链路层的最大传输单元( MTU)的限制)。之后TCP把结果包传给IP层,由它来通过网络将包传送给接收端实体 的TCP层。TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。 1. TCP 首部

---Source Port是源端口,16位。
---Destination Port是目的端口,16位。
---Sequence Number是发送数据包中的第一个字节的序列号,32位。
---Acknowledgment Number是确认序列号,32位。
---Data Offset是数据偏移,4位,该字段的值是TCP首部(包括选项)长度除以4。[1]
---标志位: 6位,URG表示Urgent Pointer字段有意义:
ACK表示Acknowledgment Number字段有意义
PSH表示Push功能,RST表示复位TCP连接
SYN表示SYN报文(在建立TCP连接的时候使用)
FIN表示没有数据需要发送了(在关闭TCP连接的时候使用)
Window表示接收缓冲区的空闲空间,16位,用来告诉TCP连接对端自己能够接收的最大数据长度。
---Checksum是校验和,16位。
---Urgent Pointers是紧急指针,16位,只有URG标志位被设置时该字段才有意义,表示紧急数据相对序列号(Sequence Number字段的值)的偏移。
2. TCP 连接建立:TCP是互联网中的传输层协议,使用三次握手建立连接。当主动方发出SYN连接请求后,等待对方回答SYN+ACK,并最终对对方的SYN执行ACK确认。这种建立方法可以防止产生错误的连接,TCP使用的流量控制协议是可变大小的滑动窗口协议(slice window)

3. TCP 三次握手过程:1. 客户端发送SYN 报文给服务器端,进入SYN_SEND状态2. 服务器端收到SYN报文,回应一个SYN-ACK报文,进入SYN_RECV状态3. 客户端收到服务器端的SYN报文,回应一个ACK报文,进入ESTABLISHED状态 握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。断开连接时服务器和客户端均可以主动发起断开TCP连接的请求,断开过程需要经过 “四次握手”

4. 四次断开:建立一个TCP连接需要三次握手,而终止一个TCP连接要经过四次断开,这是由于TCP的半关闭(half-close)造成的。过程如下:假设Client端发起中断连接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以你先发送ACK,"告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息"。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文,"告诉Client端,好了,我这边数据发完了,准备好关闭连接了"。Client端收到FIN报文后,"就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。“,Server端收到ACK后,"就知道可以断开连接了"。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。Ok,TCP连接就这样关闭了!



在TIME_WAIT状态中,如果TCP client端最后一次发送的ACK丢失了,它将重新发送。TIME_WAIT状态中所需要的时间是依赖于实现方法的。典型的值为30秒、1分钟和2分钟。等待之后连接正式关闭,并且所有的资源(包括端口号)都被释放。 二、 Socket通信Socket(套接字): 源IP地址和目的IP地址以及源端口号和目的端口号的组合称为套接字, 是支持TCP/IP网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程。 用户进程通过注册套接字来完成不同主机间的通信(IPC),socket可以看成两个进程进行通讯连接的一个端点,是连接进程和网络驱动程序的桥梁。socket在进程中创建,通过绑定与网络驱动建立关系。伺候,应用程序送给socket的数据,由socket交给网络驱动程序向网络中发送出去。计算机从网络上收到与该socket绑定IP地址和端口号相关的数据后,由网络驱动程序交给socket,进程便可从socket中提取接受到的数据。 众所周知:
端口号 0~1023:管理员才有权限使用,永久地分配给某应用使用;
注册端口:
1024~41951:只有一部分被注册,分配原则上非特别严格;
动态端口或私有端口:
41952+: /proc/sys/net/ipv4/ip_local_port_range: 定义两个数字,表示可以做为临时端口的起始数字和结束数字 传输层协议:TCP、UDP、SCTP、DCCP 套接字类型:
tcp socket
udp socket
raw socket: 跨过TCP/IP层无法处理的IP包,用socket直接来接受发向本及的ICMP/IGMP协议包,也可以用来发送一些自定义包头或自订协议的IP包。

TCP协议的功能:
连接建立
将数据打包成段
校验和
确认、重传以及超时
排序
序列
流量控制
缓冲区
滑动窗口
拥塞控制
慢启动
拥塞避免算法 RFC:有时间一定好好读读TCP的RFC,会对TCP协议有一个更深层的认识 socket: IPC的一种实现,用于同一或不同主机上的进程间的通信; socket通信在domain中实现:
识别一个socket的方法(socket地址格式),有以下三种类型: domain:
Unix Domain: 基于socket机制实现同一主机不同进程间通信的一种方式;AF_UNIX, AF_LOCAL,地址是一个路径名(文件)
IPv4 Domain: AF_INET, 基于socket机制借助于ipv4协议实现不同主机(也可以是同一主机)上的进程间通信的机制; 地址是32位的ipv4地址+16位的端口号
IPv6 Domain: AF_INET6, 地址是128位的Ipv6地址+16位的端口号 socket的类型:
TCP:流式socket,SOCK_STREAM
可靠、双向、面向字节流
UDP:数据报式socket, SOCK_DGRAM
相关的系统调用:
socket(): 创建一个新的socket
bind():绑定于一个套按字地址上;
listen(): 监听套接字;
accept(): 接收连接请求; connect(): 发起连接请求; close(): 关闭连接 read()和write(): recv(), send(), recvfrom(), sendto()


tcp协议通过tcp状态来标记当前处于通信过程的哪个阶段:
CLOSED, LISTEN, SYN_SENT, SYN_RECV, ESTABLISHED, FIN_WAIT1, CLOSE_WAIT, FIN_WAIT2, LAST_ACK, TIME_WAIT, CLOSED 常用软件: 可以查看当前tcp/udp协议的状态: netstat, ss

博客参考地址:
http://blog.chinaunix.net/uid-21795529-id-3031850.html http://blog.csdn.net/whuslei/article/details/6667471
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息