diff --git a/client.py b/client.py
index 1651d305d5629a36c6ea0d761049488350d39966..4da536f07e2ed58d8f78e5876b00c324a0b29756 100644
--- a/client.py
+++ b/client.py
@@ -71,6 +71,28 @@ class Client():
 
     def close_con(self):
         # To-Do
+        log("!", "Closing Connection ...")
+
+        byte, _ = self.recv()
+        rcvd = Segment().from_bytes(byte)
+        if (not rcvd.test_checksum) or (not rcvd.getFIN):
+            raise ConnectionError
+        seg = Segment(300, rcvd.get_seq_no())
+        seg.setACK()
+        self.send(seg.to_bytes(), self.DST_ADDR)
+        log(f"Segment SEQ={rcvd.get_seq_no()}, FIN", "Received, Ack sent")
+
+        seg = Segment(seg.get_seq_no())
+        seg.setFIN()
+        self.send(seg.to_bytes(), self.DST_ADDR)
+        log(f"Segment SEQ={seg.get_seq_no()}, FIN", "Sent")
+
+        byte, _ = self.recv()
+        rcvd = Segment().from_bytes(byte)
+        if (not rcvd.test_checksum) or (not rcvd.getACK) \
+            or (not rcvd.get_ack_no != seg.get_seq_no):
+            raise ConnectionError
+        log(f"Segment SEQ={seg.get_seq_no()}, FIN", "Acked")
         return
 
 if __name__=="__main__":
diff --git a/server.py b/server.py
index 77c105f1de57b225652c0b52baf0a2aae800aa4a..6bf238a80edeafb4729c54852a2b21a9ff6f4ca4 100644
--- a/server.py
+++ b/server.py
@@ -98,8 +98,30 @@ class Server():
 
     def close_con(self, client_addr):
         # To-Do
-        self.socket.close()
-        log("!", "Connection is closed")
+        # self.socket.close()
+        # log("!", "Connection is closed")
+        log("!", "Closing Connection ...")
+
+        seg = Segment(100)
+        seg.setFIN()
+        self.send(seg.to_bytes(), client_addr)
+        log(f"Segment SEQ={seg.get_seq_no()}, FIN", "")
+
+        byte , _ = self.recv()
+        rcvd = Segment().from_bytes(byte)
+        if (not rcvd.test_checksum()) or (not rcvd.getACK()) \
+            or (rcvd.get_ack_no() != seg.get_seq_no()):
+            raise ConnectionError
+        log(f"Segment SEQ={seg.get_seq_no()}, FIN", "Acked")
+
+        byte , _ = self.recv()
+        rcvd = Segment().from_bytes(byte)
+        if (not rcvd.test_checksum()) or not rcvd.getFIN():
+            raise ConnectionError
+        seg = Segment(seg.get_seq_no()+1, rcvd.get_seq_no())
+        seg.setACK()
+        self.send(seg.to_bytes(), client_addr)
+        log(f"Segment SEQ={rcvd.get_seq_no()}, FIN", "Received, Ack sent.")
         return True
 
 if __name__=="__main__":