어어어어.. 하다보니 어느새 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 |