본문 바로가기

프로그래밍/네트워크

[Coursera Google] The Transport Layer 2

TCP 제어 플래그

 

네트워크 트래픽이 예상대로 작동하지 않을 수 있는 문제를 해결 할 수 있게

우리는 정확한 작동 방식을 이해하고 있어야한다.

 

TCP 가 연결을 설정하는 방법은 특정한 순서로 사용되는 TCP 제어 플래그를 사용하는 것이다6개의 TCP 제어 플래그를 헤더에 나타나는 순서대로 봐보자

 

첫번째 flag 는 URG 다

긴급성의 줄임말로 1의 값을 가지면 세그먼트가 긴급하다고 간주를해 긴급 포인터 필드에 

이에 대한 데이터가 더 있음을 나타낸다.

 

두번째는 acknowlege의 줄임말인 ACK 다

필드에 값이 1이면 승인 번호 필드를 검사해야함을 뜻한다.

 

세번째는 PSH 로 push의 줄임말이다.

데이터를 보내는 장치는 수신 장치에 현재 버퍼링이 된 데이터를 어플리케이션에 가능한 빠르게 넣고 싶어한다.

버퍼는 다른 곳에 보내기 전에 일정량의 데이터를 어딘가에 보관하는 건데,

TCP 에서는 더 효율적으로 큰 청크 데이터를 보내기 위해 사용된다.

버퍼에 데이터를 keep 해둠으로써,

더 중요한 청크 데이터를 어플리케이션에 전달 할 수 있게 된다.

근데 가끔은 작은 양의 정보지만 즉시 응답을 받기 위해 listening program 이 필요 할 수 있다.

이걸 push flag 가 한다.

 

네번째 플래그는 RST , reset의 줄임말이다.TCP 연결의 한쪽 클라이언트가 세그먼트를 제대로 복구 하지 못했다는 것을 의미한다.연결 클라이언트 중 하나가"데이터 종합이 안돼 처음부터 다시 하자" 고 하는 방식이다.

 

다섯번째 플래그는 SYN 으로 sync 를 뜻한다.TCP 연결을 처음 설정하고 , 수신 쪽에서 시퀀스 번호 필드를 검사 할 수 있는지 확인할때 사용한다.

 

마지막으로 FIN , finish 를 뜻한다.이 플래그가 1 이면 송신 쪽이 더 이상 전송할 데이터가 없어서연결을 닫을 것을 뜻한다.

 

TCP 제어 플래그가 어떻게 사용되는지 예를 들어보자

 

송신 컴퓨터 A 와 수신 컴퓨터 B 가 있다.

프로세스를 시작하려면 

컴퓨터 A 는 TCP 세그먼트를 컴퓨터 B 에 SYN flag를 set 한 후 보내게 된다.

이건 컴퓨터 A 가 

"연결을 맺자 내 시퀀스 넘버 필드를 보면 이 대화가 어디서부터 시작되는지 알 수 있어"

그러면 컴퓨터 B 가 SYN 과 ACK 필드를 설정 후 TCP 세그먼트를 응답으로 보내게 된다.

컴퓨터 B는 

"그래 연결 맺자, 너의 시퀀스 번호를 승인할게" 하고 말하는 것이다.

 

컴퓨터 A 는 다시 ACK 플래그를 설정 후 응답을 보낸다

"너가 승인 한 걸 알겠어 자 이제 데이터를 보내기 시작하자" 하는 것이다.

 

SYN, ACK/SYN, ACK 세트는 TCP 연결이 설정 될 때 마다 발생한다.

이걸 바로 three way handshake 라 한다.

 

일단 three way handshake 가 완료되면, 

TCP 연결이 설정 된다.

 

 

이제 컴퓨터 A 는 자유롭게 데이터를 컴퓨터 B 로 보낼 수 있고 반대로도 마찬가지로 보낼 수 있게 된다.

이제 양 쪽은 보낼때마다 SYN/ACK 페어를 보낸다

전송되는 각 세그먼트는 SYN/ACK 세트로 응답을 해서 상대방이 항상 데이터를 받았는지 확인을 한다.

 

이제 한쪽에서 연결을 종료시키려 할때면,

4 way handshake 가 발생한다.

연결을 종료할 준비가 되면 다른 쪽에서는 ACK 로 인식하는 FIN 플래그를 전송한다.

 

그럼 다른쪽도 연결을 종료시킬 준비를 하고 여기서도 FIN 플래그를 본내다.

이제 다시 양쪽에서 ACK 플래그를 전달하면서 끝내게 된다.

이론적으로는 TCP 연결이 한쪽만 닫히는 경우가 유지 될 순 있다.

하지만 이건 자주 마주할 문제는 아니다.

 

이제 다음으로는 TCP 소켓 상태 정보를 봐보자

 

 

TCP Socket State

 

TCP 소켓은 인스턴스화 하기 위해 실제 프로그램이 필요하다.

가상의 것이라 느껴지는 포트와 대조적일 수 있다.

내가 원하는 port 에 트래픽을 전송 할 수 있지만, 해당 포트에 소켓이 열려있어야지만 응답을 받을 수 있다.

 

TCP 소켓은 많은 상태가 존재 할 수 있다.

 

첫번째 상태는 LISTEN 이다

LISTEN은 TCP 소켓이 준비되어있고 수신 대기 중임을 뜻한다.

서버 쪽에서만 볼 수 있다.

 

두번째는 SYN_SENT 다 

이건 동기화 요청이 전송 되었지만, 아직 연결이 설정 되지 않은 걸 뜻한다.

클라이언트 쪽에서만 볼 수 있다.

 

세번째는 SYN_RECEIVED 다.

이건 이전에 listener state 에 있던 소켓이 동기화 요청을 수신하고 SYN_ACK 를 다시 전송 했다는 것을 뜻한다.

하지만 아직 클라이언트로부터 마지막 ACK 는 받지 않았다.

이건 서버쪽에서만 볼 수 있다.

 

네번째로는 ESTABLISHED 다.

TCP 연결이 작동하고 있고 양쪽 서로 데이터를 자유롭게 보낼 수 있는 상태를 뜻한다.

클라이언트 서버 모두 볼 수 있다.

 

다섯번째로는 FIN_WAIT 다.

FIN 이 전송되었지만, 아직 다른 쪽에서는 ACK 가 수신 되지 않은 걸 뜻한다.

 

CLOSE_WAIT 

이건 TCP 계층에서 연결이 닫혔지만 ,

소켓을 연 어플리케이션이 아직 소켓을 잡고 있는 상태

 

CLOSE

연결이 완전히 종료된 상태로 더이상의 통신이 불가능 하다는 뜻