어어어어.. 하다보니 어느새 TCP의 원리에 대해 글을 쓴 지가 열흘이나 되었다.. 3일 전부터 쓰고 있는데 마무리를 어떻게 지으면 좋을지 계속 고민 & 수정 & 고민 & 수정을 반복하고 있는데 어째 고치고 다시 볼 때마다 뭔가 미진하다..(아직도 상대적으로 쬐끄마한 내 지식..ㅠㅠ) 하지만 너무 길게 늘어지는 것 같아 먼저 올려본다..!
TCP 자체는 2개의 과정으로 이루어져 있다.
각각 두 컴퓨터를 연결하는 3-way handshake와 두 컴퓨터의 연결을 끊는 4-way handshake이다.
사용자의 컴퓨터가 서버 컴퓨터와 연결되는 과정이다. (각각 user
와 server
로 부르겠다.)
과정은 차례대로 다음과 같다.(괄호 안은 user
와 server
의 상태를 나타낸다.)
user
to server
.user
: sync_sent
)user
가 server
에 접속요청을 하는 첫 번째 과정이다. 간단히 user
가 server
에 통신이 가능한지 묻는 과정이다. 이 과정에서 SYN 플래그라 불리는 임의의 랜덤한 숫자를 함께 전송한다.server
to user
.server
: sync_received
)server
가 user
에 통신이 잘 된다고 확인한 것을 보내는 과정이다. SYN 플래그에 1을 더해서 응답을 하고 ACK 플래그라 불리는 임의의 랜덤한 숫자를 함께 보낸다. user
to server
.server
: established
)user
가 server
에 ACK를 답변하는 과정이다. 2번 과정과 마찬가지로 ACK에 1을 더해서 돌려보낸다. user
: established
)3-way handshake
는 user
와 server
가 서로 상호작용이 되는지를 묻는 과정이기 때문에 위의 과정은 단순히 말하기 듣기(즉, 소통)으로 비유할 수 있다.
user
가 server
에게 들리는지 묻는 과정이고 그 확인을 위해 위에서 언급한 SYN를 보낸다.server
가 user
에의 물음에 응답하는 과정과 (2)server
가 user
에게 들리는지 묻는 것이 합쳐진 과정이다.(때문에 SYN+1과 ACK 묶어서 보내게 된다.)user
가 server
의 물음에 답변을 하는 과정이다.(그 답변이 ACK+1이 된다.)3-way handshake가 끝난 직후 user
와 server
는 사용자가 요구하는 바에 따라 여러 데이터들을 주고받는다. 그 방법 역시 다양하나 이 글의 주제와 벗어나있기 때문에 생략한다. 이에 대한 한 예시로 이전 글의 2번 글을 참고하길..
사용자의 컴퓨터가 서버 컴퓨터와 연결을 종료하는 과정이다.
과정은 차례대로 다음과 같다.(위와 마찬가지의 규칙을 이용해서 쓴다.)
user
to server
.user
: fin_wait1
)user
가 server
에게 연결 종료를 요청하는 과정이다. 이때 확인을 위한 FIN 플래그를 보낸다.server
to user
.server
: close_wait
)server
가 user
에게 연결종료를 확인했다는 ACK 플래그를 보낸다. user
: fin_wait2
)server
to user
.server
: last_ack
)server
가 user
에게 이전에 요청한 모든 데이터의 전송이 끝난 후 연결을 종료할지를 묻는 FIN 플래그를 보낸다.user
to server
.user
: time_wait
)user
가 server
가 할 모든 일이 끝났다는 것을 확인하고 ACK 플래그로 응답한다. 이 때 user
는 추가적인 데이터가 들어오는 것에 대한 대기시간을 가지며 일정 시간 이후 user
의 상태 는closed
가 된다.server
: closed
)4-way handshake
는 통신이 끝난 이후 user
와 server
가 서로 상호작용을 끊는 과정이다. 3-way handshake
와 다르게 여러가지 문제가 발생할 수 있는 구간으로써 위와 같이 단순한 비유로는 설명하기가 쉽지 않다..
(잡담의 주요 이유가 여기였다.)
링크 | 제목 | 주인장 |
---|---|---|
1번 글 | TCP flag(URG, ACK, PSH, RST, SYN, FIN) | MindGear |
2번 글 | CLOSE_WAIT & TIME_WAIT 최종 분석 | kaon.park |