TCP protocol의 Checksum과 ACK, SYN, FIN에 대해 Sequnce bit, Acknowledgment number와 함께 자세히 알아보자.
먼저 checksum이란 데이터가 전송된 이후에 에러가 있는 지 확인하는 것이다. 에러가 있다면 데이터를 무시한다. 위의 내용은 데이터를 보내는 입장에서의 IP를 담은 datagram의 header 정보에 대한 checksum 기법이다. 최소 20bytes의 header를 16bit로 모두 쪼개서 더한 후, 보수값을 취해준다. 이 값을 header에 포함해 전달한 후 receiver는 똑같이 보수를 구해주고 값을 비교해 에러가 존재하는지 판단한다.
Application layer에서 packet의 content을 message라 부른다.(이를 segment로 만들 수 있지만, 아닐 수도 있다.) Port number를 부여받은 segment에 network layer가 IP주소를 부여하면 datagram이 된다. 여기에 다시 맥주소를 부여하면 Frame이 된다.(각각 header에 부여된다.)
단계를 거치며 하나의 packet으로 변화하는데 여러 개의 패킷을 하나의 패킷으로 만드는 것을 encapsulation이라 칭한다.
각각의 payload(data 부분)은 다르다.(이미지 참고)
Frame의 에러체크는 에러를 체크하는 코드가 붙는다. 이를 CRC 코드라 부른다(다루지 않는다.)
이전에 봤듯이, IP는 checksum을 진행한다. IP는 header만 checksum을 통해 에러체크 하지만, TCP는 payload와 IP의 정보를 가지고 한번 더 진행한다.
에러체크를 위한 IP checksum을 진행한 이후, TCP에서 한번 더 진행한다. 이를 위해 Pseudoheader 개념을 사용한다. 이는 datagram에 있던 IP 정보들이다.
이 정보들, TCP 정보들, payload들의 정보를 16bit로 분리하여 모두 더하고 보수를 취하여 패킷에 담아 receiver에게 보내고, receiver는 sender가 처리한 보수값을 제외하고 똑같은 연산을 진행한 후 값을 비교하여 에러를 체크한다.
ACK, SYN, FIN 모두 one bit으로 표현되며 1로 set되었을 경우의 역할이 존재한다.
TCP는 데이터 통신을 하기 이전과 이후에 클라이언트와 서버간에 통신 요청과 이에 따른 응답이 있어야한다. 마치 전화를 걸면 이를 받는 것과 유사하다.(이 조건이 충족되어야 데이터 송수신이 가능하다.)
- ack: acknowledge number
- seq: sequence number
- ACK: 네트워크 송수신 요청(또는 종료)에 응답하는 패킷이다.
- SYN: 네트워크 송수신을 요청하는 패킷이다.
- FIN: 네트워크 송수신 종료를 요청하는 패킷이다.
- A: ACK flag one bit을 저장한다. 이게 1로 set되어 있어야 ack를 확인한다.
- S: A와 동일하다.(seq 확인)
연결 요청을 위해 SYN packet을 전송하면 receiver도 이와 같이 연결요청에 대한 응답과 연결요청을 한번 더 보낸다. 요청받은 seq에 A(1bit)을 더해 ack에 저장하여 ACK를 보낸다.
ACK만을 보내면, seq는 무시된다.
위는 소켓 프로그래밍의 API를 사용하여 이해할 수 있다.(block은 ACK 패킷을 받으면 해제된다.)
SYN과 ACK 패킷의 특징은 다음과 같다.
SYN segment는 데이터를 전송할 수 없고 sequence number만 전송할 수 있다.
SYN + ACK segment도 위와 같다.
ACK segment는 데이터를 전송하지 않으면, sequnece number는 필요 없다.
위의 내용은 client 쪽에서 data를 두 번에 걸쳐 보낼 때 이전 예시에서 본 ACK 패킷에 데이터를 같이 보내는 것을 의미한다. 이를 두 번에 걸쳐 보내고 Server도 똑같이 ACK과 데이터를 동시에 보낸다. (마지막 패킷의 seq 부분은 무시한다.)
FIN은 SYN과 요청과 응답 패킷을 통해 네트워크 연결을 종료한다는 것을 의미한다.
예시를 보기 이전에 FIN의 특징을 알아보자.
- FIN segment는 데이터를 전송하지 않으면, sequence number만 전송한다.
- FIN + ACK segment는 데이터를 전송하지 않으면, sequnece number만 전송한다.
(위의 이미지에서 첫 번째 segment의 ack번호 마지막 segment의 seq 번호는 무시한다.)
첫 번째 종료 요청 -> 두 번째 응답과 종료 요쳥 -> 첫 번째 응답
SYN 패킷과 동일하게 서버와 클라언트 모두 요청과 응답이 필요하다.
FIN 패킷은 소켓 프로그래밍 상에서 close 함수와 read 함수로 구현할 수 있으며, 프로그램에 따라 FIN과 ACK 패킷을 동시에 보낼 수 있거나 위의 이미지와 같이 따로 보낼 수 있다.
하지만 시스템 상에서 프로세스가 종료될 때 자동으로 위의 과정을 처리해준다.
과제 부분, HLEN, seq, ack 넘버 이미지