TCP Connetion

2006. 12. 28. 23:13IT/Network

TCP Connection Establishment


TCP Connection이 이루어 지는 과정을 살펴보도록 하자.

1. 클라이언트 에서 먼저 서버쪽에, SYN Signal을 보내서 connection을 요청하고, 클라이언트는 SYN_SENT상태로 들어간다. 이때 서버는 Listen 상태이다.

2. 서버에서는 클라이언트로부터 요청을 받으면, 그 요청에 대한 ACK와 함께, SYN Signal을 클라이언트에 보내고, SYN_RCVD 상태로 들어간다.

3. 클라이언트에서 SYN과 ack를 받으면, Client에는 Connection이 생성되고, 클라이언트의 상태는 ESTABLISHED 상태로 들어가고 서버에서 부터 보내온 SYN Signal에 따른 ACK 시그널을 서버로 보낸다.

4. 서버에서 client에서 ACK를 받으면 server에서는 ESTABLISHED 상태로 들어가고, 클라이언트와 서버사이에 Connection이 설정된다.




<그림 1. TCP Connection Establishment Sequence Diagram>


TCP Connection Close


TCP Connection은 기본적으로 Full Duplex Connection으로 생성된다. 즉 클라이언트에서 서버로 보내는 Connection과, 서버에서 클라이언트로 데이타를 보내는 Connection이 각각 틀리다.
그래서 각각의 Connection을 independent하게 close해 줘야하는데. 이런것 TCP 의 특성을 이용해서 한쪽 Connection만 닫은 상태(TCP half-close)로 통신을 하는 방법도 Application에서 사용하는 경우가 있다.

TCP에서 Connection을 close하는 과정을 간단하게 살펴보자

1. 먼저 클라이언트에서 close 명령을 호출해서 Server에 FIN을 보내고, FIN_WAIT_1 상태로 들어가고, FIN에 대한 ack를 기다린다.
※ "FIN" 의 의미는 더이상 보낼 데이타가 없다는 것을 의미한다.

2. 서버에서는 FIN을 받으면, FIN에 대한 ACK를 보내고 CLOSE_WAIT 상태로 들어가고, server application에서 "close"를 수행하기를 기다린다.

3. 클라이언트에서 FIN에 대한 ACK를 받으면 FIN_WAIT_2 상태로 변하고, 서버에서 close하기를 기다린다.

4. 서버에서는 ACK를 보낸후에 Application에서 socket을 "close"명령을 이용해서 close한다. Close 명령은 클라이언트에게로 "FIN" 을 보낸다.

5. 클라이언트가 FIN을 받으면 거기에 따른 ACK를 서버에 보내고, 클라이언트는 TIME_WAIT 상태로 들어간다. TIME_WAIT 시간만큼이 지나면 클라이언트는 소켓을 닫고 Connection을 종료한다. 이 TIME_WAIT시간은 Kernel에서 /dev/tcp의 tcp_time_wait_interval (Solaris에서…) 변경할 수 있으며, 웹로직에서 추천값은 60,000 이다.

6. 서버에서 4에서 보낸 FIN에 대한 ACK를 받으면 바로 Connection을 종료한다.



<그림 2. TCP Connection Close Sequence Diagram>

출처 : http://blog.empas.com/zerobell/4060224

'IT > Network' 카테고리의 다른 글

Solaris 시스템 성능 조정_TCP Timer  (0) 2007.01.26
Tuning Solaris TCP parameters  (0) 2007.01.26
Port Scanning  (0) 2006.12.28
RAID Level  (0) 2006.12.28
전력선 통신 시대??  (1) 2006.12.28